在矩阵运算上获得 CL_INVALID_WORKGROUP_SIZE

Getting CL_INVALID_WORKGROUP_SIZE on matrix operations

我传入一个矩阵作为全局内存并处理本地内存中的每个向量(行)。传入的实际矩阵是 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 );

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

谢谢。

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

  • 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 };