Opencl CL\u无效\u工作\u组\u大小错误
我有这个代码,不久前我已经发布了一些东西 今天我在一个小测试程序中使用typedef结构运行内核,但是Opencl CL\u无效\u工作\u组\u大小错误,opencl,Opencl,我有这个代码,不久前我已经发布了一些东西 今天我在一个小测试程序中使用typedef结构运行内核,但是clEnqueueNDRangeKernel给出了一个无效的工作组大小错误。根据khronos webiste的说法,这可能有三个原因 全局工作大小不能被本地工作大小整除。在我的代码中,它是可除的 本地工作大小超出GPU的处理能力。我的本地工作大小是128,远远低于报告的最大值1024 与NULL的本地工作大小有关。我的本地工作大小不是NULL,而是128 我在互联网上搜索了好几个小时,我找到的
clEnqueueNDRangeKernel
给出了一个无效的工作组大小错误。根据khronos webiste的说法,这可能有三个原因
NULL
的本地工作大小有关。我的本地工作大小不是NULL
,而是128clGetKernelWorkGroupInfo
以获得最大的本地工作规模。当我这样做时,它也会报告1024个。我现在真的没办法了,有人能帮我吗?:)
main:kernel:从您的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个工作项。这可能有效,也可能无效,具体取决于您的计算设备
关于传递一个空的本地大小:CL规范说,如果这样做,CL实现可以选择它想要的任何东西作为本地工作组大小。理想情况下,它会尝试为你做一些聪明的事情,但你没有保证。这当然是我想要的:)为什么你认为这不是我想要的?这段代码对我来说是一些练习,如果我掌握了窍门,这将是一个相当大的程序。所以我在做这件事时考虑到了未来的扩展。不管你想要什么,你必须确保全局大小>=local大小。让我给你一个1D的例子。假设您有10000件事情要用CL内核处理。这就是你的全球规模:10000。也许你想一组100件事情来处理这些。这是你们当地的尺码:100。因为10000/100==100,所以这种特殊的安排将为您提供100个工作组。在上面,全局大小为16,局部大小为128。这对OpenCL--16/128没有意义。也许您想要16*128作为您的全局大小,128作为您的本地大小?这将产生16个工作组,每个工作组包含128项。aaah,那么您的全局工作大小是您想要的计算总数,而本地工作大小是您想要的块大小?嗯,现在这更有意义了:)