使用 cl::NDRange 具有不同的维度来对内核进行排队是否有效?

问题描述 投票:0回答:1

例如,如果全局尺寸为

cl::NDRange{1024x1024}
,则局部尺寸为
cl::NDRange{32}
是否有效?

如果提供了尺寸,程序肯定会运行,但也许工作暗淡被默默地设置为其他东西?

如果给出不同的尺寸会发生什么?

官方规格写道:

每个工作项都被分配到一个工作组,并被赋予一个本地 ID 来代表其在工作组中的位置 工作组。工作项的本地 ID 是一个 N 维元组,其组件范围为 零到该维度中工作组的大小减一。

我不认为不同的维度是明确禁止的,尽管这个问题另有说明。

opencl
1个回答
0
投票

全局范围必须是局部范围组件的倍数。

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 图像区域遵循内核中不同分支的情况是理想的)非常重要。

© www.soinside.com 2019 - 2024. All rights reserved.