CL_KERNEL_WORK_GROUP_SIZE不断变化

时间:2016-02-17 19:48:45

标签: kernel size opencl

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

遇到一些麻烦后,我意识到虽然我的设备最大工作组大小为512,但我的KERNEL_WORK_GROUP_SIZE为256.

所以现在每个工作项处理8个元素,包含256个工作组......

我刚刚对我的内核做了一个非常微妙的更改(更改了" get_local_size(0)"调用" get_local_size(1)")现在我的KERNEL_WORK_GROUP_SIZE是224而我得到的工作组大小无效?

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

1 个答案:

答案 0 :(得分:0)

正如您已经可以通过名称猜测的那样,KERNEL_WORK_GROUP_SIZE是特定内核的最大工作组大小。这个数字取决于内核源代码,您使用的OpenCL实现的细节,设备硬件,以及内核中使用的寄存器和本地内存的数量。它通常低于CL_DEVICE_MAX_WORK_GROUP_SIZE,这是计算设备的理论最大工作组大小。

我通常会将clEnqueueNDRangeKernel中的本地工作组大小设置为NULL,以便让实现决定一个好的值。您应始终在内核代码中使用get_local_size()内省工作组大小,而不是依赖于任何特定的工作组大小。