例如,如果全局尺寸为
cl::NDRange{1024x1024}
,则局部尺寸为 cl::NDRange{32}
是否有效?
如果提供了尺寸,程序肯定会运行,但也许工作暗淡被默默地设置为其他东西?
如果给出不同的尺寸会发生什么?
官方规格写道:
每个工作项都被分配到一个工作组,并被赋予一个本地 ID 来代表其在工作组中的位置 工作组。工作项的本地 ID 是一个 N 维元组,其组件范围为 零到该维度中工作组的大小减一。
我不认为不同的维度是明确禁止的,尽管这个问题另有说明。
全局范围必须是局部范围组件的倍数。
1024*1024
全局对于32*1
局部来说是可以的,因为1024
(x)是32
的倍数,而1024
(y)是1
的倍数。
为了获得最佳的跨供应商兼容性,本地范围本身应该是 64 个线程或 64 个线程的倍数,例如 64*1
、32*2
或 8*8
。本地范围 32 在 Nvidia GPU 上很好,但在 AMD GPU 上会使一半的 ALU 空闲。
局部范围纵横比(
64*1
/32*2
/8*8
)的选择通常是一个免费的性能调整参数,除非您在内核中明确使用local
内存。这对于全局内存合并(64*1
在这里是理想的)和分支(8*8
对于不同的 2D 图像区域遵循内核中不同分支的情况是理想的)非常重要。