2015-12-15 39 views
3

我对这个架构感到沮丧,因为没有明显的解释为什么工作组应该是三维的,或者我还没有找到解释。由于任何维度都可以从一个维度的工作组中模拟出来,它似乎会增加额外的复杂性,并且比现在理解将工作划分为工作组的最佳方式更难。为什么OpenCL工作组3维?

For example, this person discovered that switching axis sped up his execution with a factor of two.

一个假设我是想OpenCL的工作项ID和存储器查找之间的关系,琐碎,让预见的存储操作,可以是I/O优化。

回答

7

如果您的应用程序/算法不需要它,工作组不必是三维的。您可以指定1维,2维或3维 - 并且将来无疑更多。因此,使用更少的尺寸当然很适合您的应用程序。

那么为什么规范允许更多的维度?就像您指出的那样,可以使用单个维度模拟较高的维度。一个例子是用于物理/分子模拟的3维N体模拟。

选择使用3D工作组的一个巨大优势是将代码复杂性降低了一点点。在引擎盖下,你运行openCL的SDK可能会为你做仿真。

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

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

+4

TL; DR-3维工作组纯粹是一种便利功能。 –

2

真的告诉你只有3个维度是允许的吗?

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

OpenCL规范指出尺寸的最大数量是实现定义的作为常量CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS,实际上它常常是3,但可以是任何东西。这只是一个方便的问题,因为大多数计算问题都是基于1到3维的“现实世界”数据。

此外,没有人强迫你使用3.大多数应用程序使用1和2,并且工作得很好。


如果你想为什么N而不是总是1,当你必须使用本地存储器时,你会明白它。工作组为2D时,在图像中使用本地内存非常容易,因为工作项会覆盖图像的一个小矩形区域,而不是一行。

您可以通过巧妙的索引转换来模拟它,但是使用它作为API的设计时,它更容易和更具可读性。

+1

对不起,我被劫持的答案是:D –