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