我有这段代码,我之前已经发布了一些内容。
今天我在一个小测试程序中运行了一个带有typedef结构的内核,但是clEnqueueNDRangeKernel
给出了一个无效的工作组大小错误。根据khronos网站的说法,这可能有3个原因。
NULL
的本地工作规模有关。我的本地工作规模不是NULL
,而是128。我在互联网上搜索了几个小时,我找到的大多数解决方案都是查询clGetKernelWorkGroupInfo
最大的本地工作量。当我这样做时,它也会报告1024.我现在真的没有选择,有人可以帮忙吗? :)
main:http://pastebin.com/S6R6t3iF内核:http://pastebin.com/Mrhr8B4v
答案 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实现可以选择它想要的作为本地工作组大小。理想情况下,它会尝试代表您做一些聪明的事情,但您无法保证。