在OpenCl中获取2维的全局ThreadId

Rav*_*vul 3 opencl

如何在OpenCL中获得2维的全局threadId?我知道,对于1维,公式是:

 int global_id = get_global_id(1) * get_global_size(0) + get_global_id(0);
Run Code Online (Sandbox Code Playgroud)

但如果我像这样分配:

size_t block_size[] = {2,2}
size_t grid_size[] = {35,20}
Run Code Online (Sandbox Code Playgroud)

上述公式失败,索引仅为0到35*20.索引应该从0到35*40*2*2.

你能推荐一些好的文档或文章,让我直觉了解所有这些是如何工作的吗?谢谢!

Ani*_*Ani 7

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

没有必要自己计算.

你的意思是你正在启动一个2D线程块,但想要将该线程映射到一维缓冲区中的位置?

编辑:阅读你的评论后,我认为解释是有序的.

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)
Run Code Online (Sandbox Code Playgroud)

本地工作量只是一种分割线程总数并在可用计算单元中分配它们的方法.很可能在任何时间点只运行2*2 = 4个线程.

clEnqueueNDRangeKernel文件告诉我们,local_work_size可以为null,在这种情况下实施的尺寸也就确定向上突破的工作总量.

本地工作量不会增加线程数.

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

OpenCL 2D NDRange

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

如果你想让你的1D索引从0 ..(35*40*2*2 - 1)开始,那么启动内核使get_global_size(0)*get_global_size(1)为35*40*2*2(也许是70 x 80?)

希望这可以帮助.