我对这种架构感到沮丧,因为没有明显的解释为什么工作组应该是三维的,或者我还没有找到解释。由于可以从一维工作组模拟任意数量的维度,因此它似乎增加了额外的复杂性,并且使得理解将工作划分为工作组的最佳方式变得更加困难。
For example, this person discovered that switching axis sped up his execution with a factor of two.
我的一个假设是,OpenCL需要工作项ID和内存查找之间的微不足道的关系,以允许可以进行I / O优化的可预测内存操作。
答案 0 :(得分:8)
如果您的应用程序/算法不需要,工作组不必是三维的。您可以指定1,2或3个维度 - 毫无疑问将来会更多。因此,当自然适合您的应用时,请使用更少的尺寸。
那么为什么规范允许更多尺寸?正如您所指出的,可以使用单个维度模拟更高的维度。一个例子是用于物理/分子模拟的三维N体模拟。
选择使用3D工作组的一个巨大优势是可以减少代码复杂性。在幕后,你正在运行openCL的SDK可能正在为你做仿真。
至于你的例子中2倍的性能提升:这种提升是由于更好的内存访问模式,而不是硬件本身在2D工作组上运行时很糟糕。该问题的答案解释了进一步优化内核的方法,这对于当今的gpu硬件来说是很好的策略。
使用3D工作组的一个更微妙的好处是未来的硬件可能不需要模拟额外的维度。也许内存,处理器等将适合3D工作组,并减少或消除不良内存访问模式的惩罚。如果您使用1D组编写代码,则会错过这些平台上潜在的性能提升。即使在今天,也可以创建FPGA / ASIC芯片来比GPU更好地处理3D工作组。
答案 1 :(得分:2)
真正告诉你的是,只允许3个维度?
clEnqueueNDRangeKernel()
使用无符号整数来指定维数,并为每个维度大小使用无符号整数数组。
OpenCL规范规定维度的最大维数实现定义为常量CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS
,实际上常常为3,但可以是任何东西。这只是一个方便的问题,因为大多数计算问题都在“真实世界”的数据上运行,这些数据的维度在1到3之间。
此外,没有人强迫您使用3.大多数应用程序使用1和2,并且工作完全正常。
如果您正在考虑为什么N并且不总是1,那么当您必须使用本地内存时,您将理解它。当工作组处于2D状态时,在图像中使用本地存储器非常容易,因为工作项覆盖图像的一个小矩形区域,而不是它的一行。
您可以通过巧妙的索引转换来模拟它,但在设计API时使用它,它更容易,更易读。