我无法理解clEnqueueNDRangeKernel()中work_dim的用途是什么?
那么,work_dim = 1和work_dim = 2有什么区别? 为什么工作项被分组到工作组中? 工作项或工作组是在设备上运行的线程(或两者都没有)?
提前致谢!
答案 0 :(得分:15)
work_dim
是clEnqueueNDRangeKernel()
执行的维数。
如果您指定work_dim = 1
,则全局和本地工作尺寸为一维。因此,在内核中,您只能访问第一维中的信息,例如get_global_id(0)
等等。
如果您指定work_dim = 2
或3
,则还必须指定 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也很有帮助。