在矩阵运算上获取CL_INVALID_WORKGROUP_SIZE

时间:2016-02-17 05:47:07

标签: size opencl workgroup

我传入矩阵作为全局内存并处理本地内存中的每个向量(行)。传入的实际矩阵是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 2维:{1,512}但是我在这个函数调用中遇到了同样的错误CL_INVALID_WORKGROUP_SIZE:

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

  • CL_KERNEL_WORK_GROUP_SIZE:最大工作组总数(所有尺寸尺寸的产品)

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

第二个限制是每个内核,而你应该使用它。这个考虑了特定于您的代码的更多内容。像最大的私人记忆等...

您是否也符合第二项要求?

BTW:在任何情况下都应该使用:

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