gpt4 book ai didi

opencl - 在 OpenCl 中获取二维的全局 ThreadId

转载 作者:行者123 更新时间:2023-12-01 10:00:49 27 4
gpt4 key购买 nike

如何在 OpenCL 中获取二维的全局 threadId?我知道对于一维,公式是:

 int global_id = get_global_id(1) * get_global_size(0) + get_global_id(0);

但是如果我这样分配:

size_t block_size[] = {2,2}
size_t grid_size[] = {35,20}

上述公式失败,仅给出从 0 到 35*20 的索引。索引应从 0 到 35*40*2*2。

您能推荐任何好的文档或著作,让我有直觉来理解所有这些是如何工作的吗?谢谢!

最佳答案

如果您要启动 2D NDRange,则 get_global_id(0) 和 get_global_id(1) 将为您提供 Gx 和 Gy 索引。您还可以使用 get_local_id(0/1) 独立获取本地 ID。

不用自己计算。

您的意思是您要启动一个 2D 线程 block ,但想将该线程映射到一维缓冲区中的某个位置吗?

编辑:阅读您的评论后,我认为需要进行解释。

OpenCL 启动与 get_global_size(0) * get_global_size(1)(即 35 * 20)一样多的内核,因此您将拥有线程

(0 ,0) (0 ,1) ... (0,34)
(1 ,0) (1 ,1) ... (1,34)
.
.
.
(19,0) (19,1) ... (19,34)

本地工作大小只是一种拆分线程总数并将它们分布到可用计算单元的方法。很可能在任何时间点只有 2 * 2 = 4 个线程在运行。

clEnqueueNDRangeKernel文档告诉我们 local_work_size 可以为 null,在这种情况下,实现将确定拆分总工作量的大小。

本地工作大小绝不会增加线程数。

也许这张图片比我能更好地解释它。

OpenCL 2D NDRange

请注意,内核启动的总数仍然是 get_global_size(0) * get_global_size(1)。

如果您希望您的一维索引从 0..(35*40*2*2 - 1) 开始,那么启动内核,使 get_global_size(0) * get_global_size(1) 为 35*40*2*2 (也许 70 x 80?)

希望这对您有所帮助。

关于opencl - 在 OpenCl 中获取二维的全局 ThreadId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com