在OpenCl中获取2维的全局ThreadId

时间:2013-05-15 13:19:01

标签: opencl

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

 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。

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

1 个答案:

答案 0 :(得分: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)

本地工作量只是一种分割线程总数并在可用计算单元之间分配的方法。很可能在任何时间点只运行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?)

希望这有帮助。