opencl本地内存大小如何工作?

时间:2014-07-07 01:27:37

标签: image-processing opencl gpu

我使用opencl进行图像处理。例如,我有一张1000 * 800图像。

我使用2D全局大小为1000 * 800,本地工作大小为10 * 8.

在这种情况下,GPU会自动提供100 * 100个计算单元吗?

这些10000个单元是否同时工作,因此它可以并行?

如果硬件没有10000个单位,一个单位会不止一次做同样的事情?

我测试了本地尺寸,我发现如果我们使用非常小的尺寸(1 * 1)或大尺寸(100 * 80),它们都非常慢,但如果我们使用中间值(10 * 8) )它更快。最后一个问题,为什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

工作组规模可能是一个难以理解的概念。

如果您刚刚入门并且不需要在工作项之间共享信息,请忽略本地工作大小并将其保留为NULL。运行时将自己选择一个。

将本地工作大小10 * 8硬编码是浪费,并且不会很好地利用硬件。例如,某些硬件更喜欢工作组大小为32的倍数。

OpenCL没有指定工作将完成的顺序,只是它将完成。它可以一次完成一个工作组,也可以分组完成,或者(对于小的全局大小)将它们全部组合在一起。你不知道,你无法控制它。

您的问题“为什么?”:硬件可以在SIMD(单指令多数据)和/或“Wavefronts”(AMD)或“Warps”(NVIDIA)中运行工作组。太小的工作组大小不会很好地利用硬件。太大,您的寄存器可能溢出到全局内存(慢)。 “恰到好处”将运行得最快,但如果没有基准测试就很难选择。所以现在,将它保留为NULL并让运行时选择。稍后,当您成为OpenCL专家并了解有关硬件如何工作的更多信息时,您可以尝试指定工作组大小。但是,请注意,不同硬件的最佳大小可能不同,还有其他规则(如全局大小必须是本地大小的倍数)。