CL_INVALID_WORK_GROUP_SIZE错误

时间:2011-11-03 14:26:34

标签: opencl

我有这段代码,我之前已经发布了一些内容。

今天我在一个小测试程序中运行了一个带有typedef结构的内核,但是clEnqueueNDRangeKernel给出了一个无效的工作组大小错误。根据khronos网站的说法,这可能有3个原因。

  1. 全球工作规模不能按当地工作规模划分。在我的代码中,它是可以分割的。
  2. 本地工作规模大于GPU可以处理的范围。我当地的工作量是128,低于报告的最大值1024。
  3. NULL的本地工作规模有关。我的本地工作规模不是NULL,而是128。
  4. 我在互联网上搜索了几个小时,我找到的大多数解决方案都是查询clGetKernelWorkGroupInfo最大的本地工作量。当我这样做时,它也会报告1024.我现在真的没有选择,有人可以帮忙吗? :)

    main:http://pastebin.com/S6R6t3iF内核:http://pastebin.com/Mrhr8B4v

1 个答案:

答案 0 :(得分:7)

从您的pastebin链接,我看到:

#define MAX_OP_X 4
#define MAX_OP_Y 4
#define MAX_OP MAX_OP_X * MAX_OP_Y      //aantal observer points
#define MAX_SEGMENTEN 128 //aantal segmenten
...
size_t globalSize = MAX_OP;
size_t localSize = MAX_SEGMENTEN;
...
errMsg = clEnqueueNDRangeKernel (commandQueue, kernel, 1, NULL, &globalSize, &localSize, 0, NULL, NULL);

这意味着你试图将全局大小为16,本地大小为128的内核排入队列。这几乎肯定不是你想要的。请记住,全局大小是您要运行的工作项总数,本地大小是每个工作组的大小。例如,如果您的全局大小为1024x1024,本地大小为16x16,那么您将拥有4096个工作组,每个工作组包含256个工作项。这可能有效,也可能无效,具体取决于您的计算设备。

关于传递NULL本地大小:CL规范说如果你这样做,CL实现可以选择它想要的作为本地工作组大小。理想情况下,它会尝试代表您做一些聪明的事情,但您无法保证。