0

我将一个矩阵作为全局内存传递并处理本地内存中的每个向量(行)。传入的实际矩阵是 100 X 2025,但在内核中我用零填充它以利用 2 操作的幂。我在每个工作项中处理向量的 4 个元素。

MAX_WORK_ITEM_SIZES: (512,512,512) MAX_WORK_GROUP_SIZE: 512

size_t globalWorkSize[2] = { 100, 2048 };
size_t localWorkSize[1] = { 512 };

我也尝试过将 localWorkSize 设为二维:{1, 512} 但在此函数调用中出现相同的错误 CL_INVALID_WORKGROUP_SIZE:

err = clEnqueueNDRangeKernel( openCLObjects.queue, openCLObjects.Normalize, 2, NULL,
                    globalWorkSize, localWorkSize, 0, NULL, NULL );

知道可能出了什么问题吗?

谢谢。

4

1 回答 1

1

设备属性:(设备的通用上限)

  • MAX_WORK_ITEM_SIZES:每个维度中工作组中的最大工作项。
  • MAX_WORK_GROUP_SIZE:一个工作组中的最大总工作项(所有维度大小的产品)。

内核属性:(编译的设备内核的特定限制)

  • CL_KERNEL_WORK_GROUP_SIZE:最大总工作组项目(所有维度大小的产品)

第一个是针对每个设备进行硬编码的,并且可能受限于在全 SIMD 模式下可以处理的项目数量。

第二个限制是每个内核,并且是您应该使用的。这个考虑了更多特定于您的代码的事情。像最大私人内存等...

你也满足第二个要求吗?

顺便说一句:在任何情况下您都应该始终使用:

size_t globalWorkSize[2] = { 100, 2048 };
size_t localWorkSize[2] = { 1, 512 };
于 2016-02-17T14:53:51.287 回答