NDRange中的Work_dim

时间:2011-05-30 18:10:14

标签: opencl

我无法理解clEnqueueNDRangeKernel()中work_dim的用途是什么?

那么,work_dim = 1和work_dim = 2有什么区别? 为什么工作项被分组到工作组中? 工作项或工作组是在设备上运行的线程(或两者都没有)?

提前致谢!

1 个答案:

答案 0 :(得分:15)

work_dimclEnqueueNDRangeKernel()执行的维数

如果您指定work_dim = 1,则全局本地工作尺寸一维。因此,在内核中,您只能访问第一维中的信息,例如get_global_id(0)等等。

如果您指定work_dim = 23,则还必须指定 2 3维全球本地作品;在这种情况下,您可以在 2 3维中访问内核中的信息,例如get_global_id(1)get_group_id(2)

在实践中,你可以用 1D 做所有事情,但是对于处理 2D 3D 数据,直接使用 2/3维内核;例如,在 2D 数据(例如图像)的情况下,如果每个线程/工作项要处理单个像素,则每个线程/工作项可以处理坐标处的像素(x,y)x = get_global_id(0)y = get_global_id(1)

工作项主题,而工作组工作项/线程组

我认为划分工作组/工作项与GPU和其他加速器(例如Cell / BE)的硬件架构有关;您可以将工作组的执行映射到GPU流多处理器(在NVIDIA talk中)或SPU(在IBM / Cell talk中),而相应的工作组将在Stream MultiProcessors和/或SPU的执行单元内运行。如果你在CPU中执行内核,那么work group size = 1并不少见(例如,对于四核,你将有4个工作组,每个工作组有一个工作项 - 尽管根据我的经验,通常更好的是拥有更多工作组工作组而不是CPU核心。)

检查OpenCL参考手册以及OpenCl手册,了解您正在编程的设备。 quick reference card也很有帮助。