OpenCL本地工作大小为空

OpenCL本地工作大小为空,opencl,gpgpu,Opencl,Gpgpu,当OpenCL内核排队时,local\u work\u size可以设置为NULL,在这种情况下,OpenCL实现将确定如何将全局工作项分解为适当的工作组实例 自动计算local\u work\u size似乎是一个很好的功能(比猜测64的倍数要好) OpenCL的工作组规模选择是否趋于最优?在某些情况下,手动指定local\u work\u size会更好吗?这取决于内核的编写方式。通常情况下,为了获得最佳性能,内核需要根据本地工作大小进行假设。例如,在卷积运算中,您希望使用尽可能多的本地内存

当OpenCL内核排队时,
local\u work\u size
可以设置为
NULL
,在这种情况下,OpenCL实现将确定如何将全局工作项分解为适当的工作组实例

自动计算
local\u work\u size
似乎是一个很好的功能(比猜测64的倍数要好)


OpenCL的工作组规模选择是否趋于最优?在某些情况下,手动指定
local\u work\u size
会更好吗?

这取决于内核的编写方式。通常情况下,为了获得最佳性能,内核需要根据本地工作大小进行假设。例如,在卷积运算中,您希望使用尽可能多的本地内存来防止对全局内存的额外读取。您将希望根据传入的内核大小和设备的本地内存量处理尽可能多的线程。基于传入参数(如内核大小)配置本地工作大小可能是主要速度提升的差异,而不仅仅是小差异。这就是为什么像Renderscript Compute这样的语言永远无法提供接近优化的OpenCL/Cuda的性能的原因之一,因为优化的OpenCL/Cuda允许开发人员知道他们正在运行的硬件

你也不是在猜测尺寸。当然,您可以做出一般性的假设,但通过查看您正在运行的体系结构(查看每个设备上的AMD/NVIDIA/Intel指南)并针对它们进行优化,您可以获得更好的性能。您可以在运行时通过在代码中进行调整来改变这一点,以便在运行时修改OpenCL内核(因为它只是一个字符串),或者您可以有多个内核,并在运行时选择最佳内核


也就是说,在工作组中使用
NULL
是一种不用担心优化的好方法,只需在GPU上测试加速即可。如果您了解硬件,做出更好的选择,并且在编写内核时了解本地工作组的大小,那么几乎肯定会获得更好的性能。

可能取决于实现。但是考虑到
本地工作大小
通常只取决于内核的资源使用和硬件资源,实现至少应该具备计算最佳大小所需的所有知识。这是正确的。最好的内核运行在许多设备上(这是OpenCL的重点),并考虑到使用内置于OpenCL的分析工具运行的每个设备的本地工作大小。在某些情况下,每个工作项根本不与工作组的其余部分同步。在许多情况下,将null设置为本地工作大小是一个非常好的主意。编译器99%的时间选择正确的值。