当对 OpenCL 内核进行排队时,local_work_size
可以设置为NULL
,在这种情况下,OpenCL 实现将确定如何将全局工作项分解为适当的工作组实例。
自动计算local_work_size
似乎是一个很棒的功能(比猜测 64 的倍数要好)。
OpenCL 的工作组规模选择是否趋于最优?在某些情况下手动指定会更好local_work_size
吗?
这取决于您的内核是如何编写的。通常,为了获得最佳性能,您的内核需要根据本地工作大小做出假设。例如,在卷积中,您希望使用尽可能多的本地内存来防止额外读取回全局内存。您将希望根据传入的内核大小和设备的本地内存量来处理尽可能多的线程。根据传入的参数(例如内核大小)配置本地工作大小可能是主要加速的差异,而不仅仅是微小的差异。这就是为什么像 Renderscript Compute 这样的语言永远无法提供接近优化的 OpenCL/Cuda 的性能的原因之一,这让开发人员能够了解他们正在运行的硬件。
你也不是在猜测大小。好吧,您当然可以做出一般假设,但您可以通过查看您正在运行的架构(查看每个设备上的 AMD/NVIDIA/Intel 指南)并针对它们进行优化来获得更好的性能。您可以在运行时通过调整代码以在运行时修改 OpenCL 内核(因为它只是一个字符串)来更改它,或者您可以拥有多个内核并在运行时选择最好的一个。
也就是说NULL
,为工作组使用是一种不用担心优化的好方法,并且可以轻松地在 GPU 上测试加速。如果您了解硬件、做出更好的选择并在了解本地工作组大小的情况下编写内核,那么您几乎肯定会获得更好的性能。