Kernel CL_内核_工作_组_大小不断变化

Kernel CL_内核_工作_组_大小不断变化,kernel,size,opencl,Kernel,Size,Opencl,我试图规范化100x2025矩阵(100个向量)中的所有向量。我在本地内存中将每个向量作为一个工作组进行处理。我的最大工作组大小是512,所以我最初将全局大小设置为{1002048},将局部大小设置为{1512}(我为每个工作项处理4个元素,并在内核中用零填充向量,使其为2的幂。) 经过一些麻烦之后,我意识到虽然我的设备的最大工作组大小是512,但我的内核工作组大小是256 现在我用256个工作组处理每个工作项8个元素 我刚刚对我的内核做了一个非常微妙的更改(将“get_local_size(0

我试图规范化100x2025矩阵(100个向量)中的所有向量。我在本地内存中将每个向量作为一个工作组进行处理。我的最大工作组大小是512,所以我最初将全局大小设置为{1002048},将局部大小设置为{1512}(我为每个工作项处理4个元素,并在内核中用零填充向量,使其为2的幂。)

经过一些麻烦之后,我意识到虽然我的设备的最大工作组大小是512,但我的内核工作组大小是256

现在我用256个工作组处理每个工作项8个元素

我刚刚对我的内核做了一个非常微妙的更改(将“get_local_size(0)”调用更改为“get_local_size(1)”),现在我的内核工作组大小为224,我得到的工作组大小无效


这是非常令人沮丧的,我不明白是什么决定了改变。我的全球工作规模甚至不能被224整除

您已经可以通过名称猜到,
KERNEL\u WORK\u GROUP\u SIZE
是特定内核的最大工作组大小。这个数字取决于内核源代码、您使用的OpenCL实现的细节、设备硬件,并且受内核中使用的寄存器和本地内存数量的影响。它通常会低于计算设备的理论最大工作组大小
CL\u设备最大工作组大小


我通常将
clEnqueueNDRangeKernel
中的本地工作组大小设置为
NULL
,让实现决定一个好的值。您应该始终在内核代码中使用
get\u local\u size()
来反省工作组大小,而不要依赖任何特定的工作组大小。

如果更改代码,编译后的代码也会更改,并可能导致最大大小的更改。这将在低端设备上有效地实现。因此,只将内核修复为给定大小被认为是一种不好的做法。您应该依赖于
get\u local\u size()
值。