据我了解,首选工作组大小大致取决于计算设备的 SIMD 宽度(对于 NVidia,这是 Warp 大小,在 AMD 上是 Wavefront)。
从逻辑上讲,这会导致人们假设首选的工作组大小是设备相关的,而不是内核相关的。但是,要查询此属性,必须使用 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 相对于特定内核来完成。选择一个不是底层硬件设备 SIMD 宽度倍数的值不会完全加载硬件,从而导致性能降低,并且应该与正在执行的内核无关。
我的问题是为什么不是这样?当然,这个设计决定并不是完全武断的。是否存在一些底层实现限制,或者是否存在此属性真的应该是内核属性的情况?