CL_INVALID_WORK_GROUP_SIZE错误

Jus*_*tAJ 8 opencl

我有这段代码,前段时间我已经发布了这些代码.

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

  1. 全球工作规模不能按当地工作规模划分.在我的代码中,它是可分的.
  2. 本地工作大小比GPU可以处理的大.我的本地工作量是128,低于报告的最大值1024.
  3. 与当地工作规模有关NULL.我当地的工作规模不是NULL,这是128.

我在互联网上搜索了几个小时,我找到的大多数解决方案都涉及查询clGetKernelWorkGroupInfo最大的本地工作量.当我这样做时,它也会报告1024.我现在真的没有选择,有人可以帮忙吗?:)

主要:http://pastebin.com/S6R6t3iF 内核:http://pastebin.com/Mrhr8B4v

Jam*_*mes 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);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好的,我来举个例子.假设您要使用CL内核处理10,000件事.这是你的全球规模:10,000.也许你想以100件为一组来处理它们.这是你的本地大小:100.因为10,000/100 == 100,这个特殊的安排将给你100个工作组.在上面,你的全局大小为16,本地大小为128.这对OpenCL-16/128没有意义.也许你想要16*128作为你的全局大小,128你想要你的本地大小?这将产生16个工作组,每个工作组128个项目. (4认同)