为什么OpenCL工作组是三维的?

为什么OpenCL工作组是三维的?,opencl,Opencl,我对这种架构感到沮丧,因为没有明显的解释为什么工作组应该是三维的,或者我还没有找到解释。由于任何数量的维度都可以从一维工作组中模拟出来,这似乎增加了额外的复杂性,使得理解将工作划分为工作组的最佳方法变得更加困难 我的一个假设是OpenCL希望在工作项id和内存查找之间建立一个简单的关系,以允许可以进行I/O优化的可预测内存操作。如果您的应用程序/算法不需要,工作组不必是三维的。您可以指定1维、2维或3维,将来肯定还会指定更多。因此,当is自然适合您的应用程序时,请使用较少的尺寸 那么,为什么规

我对这种架构感到沮丧,因为没有明显的解释为什么工作组应该是三维的,或者我还没有找到解释。由于任何数量的维度都可以从一维工作组中模拟出来,这似乎增加了额外的复杂性,使得理解将工作划分为工作组的最佳方法变得更加困难


我的一个假设是OpenCL希望在工作项id和内存查找之间建立一个简单的关系,以允许可以进行I/O优化的可预测内存操作。

如果您的应用程序/算法不需要,工作组不必是三维的。您可以指定1维、2维或3维,将来肯定还会指定更多。因此,当is自然适合您的应用程序时,请使用较少的尺寸

那么,为什么规范会允许更多的尺寸呢?正如您所指出的,可以使用单个维度来模拟更高的维度。一个例子是三维N体模拟,用于物理/分子模拟

选择使用3D工作组的一个巨大优势是将代码复杂度降低了相当多。在幕后,您运行openCL的SDK可能正在为您进行模拟

至于您的示例中的2倍性能提升:这是一个更好的内存访问模式的结果,而不是硬件在2D工作组上运行时天生就很糟糕。这个问题的答案解释了进一步优化内核的方法,这对于今天的gpu硬件来说是非常好的策略


使用3D工作组的一个更微妙的好处是,未来的硬件可能不需要模拟额外的维度。也许内存、处理器等将针对3D工作组进行定制,并减少或消除对坏内存访问模式的惩罚。如果您使用1D组编写代码,您将错过这些平台上潜在的性能提升。即使在今天,也可以创建FPGA/ASIC芯片来处理比GPU更好的3D工作组。

到底是什么告诉你只允许3维

clEnqueueNDRangeKernel()
使用无符号整数指定维度数,并为每个维度大小使用无符号整数数组

OpenCL规范规定,维度的最大数量定义为常量
CL\u DEVICE\u MAX\u WORK\u ITEM\u DIMENSIONS
,实际上通常为3,但可以是任何东西。这只是一个方便的问题,因为大多数计算问题都是在“真实世界”的数据上进行的,这些数据有1到3个维度

而且,没有人强迫你使用3。大多数应用程序使用1和2,并且工作得非常好


如果您正在思考为什么N不总是1,那么当您必须使用本地内存时,您就会理解它。当工作组位于2D时,在图像中使用本地内存非常容易,因为工作项覆盖图像的一个小矩形区域,而不是一行区域


您可以通过巧妙的索引转换来模拟它,但在设计API时使用它,它更容易阅读。

TL;DR-三维工作组纯粹是一种方便的功能。