似乎200万个花车应该没什么大不了的,只有8MB的1GB GPU内存。我有时可以分配那么多,有时甚至可以更多地分配。当我执行clEnqueueReadBuffer时,我得到了CL_OUT_OF_RESOURCES,这看起来很奇怪。我能够嗅出问题真正开始的地方吗?在clEnqueueReadBuffer中,OpenCL不应该像这样失败吗?应该是我分配数据的时候吗?有没有办法获得更多的细节而不仅仅是错误代码?如果我能看到当OpenCL声明CL_OUT_OF_RESOURCES时分配了多少VRAM,那将会很酷。
答案 0 :(得分:8)
我遇到了同样的问题(花了我一整天的时间来解决)。 我相信有同样问题的人会偶然发现这个问题,这就是为什么我要发布这个老问题。
您可能没有检查内核的最大工作组大小。
您就是这样做的:
size_t kernel_work_group_size;
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL);
我的设备(2x NVIDIA GTX 460和Intel i7 CPU)支持的最大工作组大小为1024,但是当我通过Path Tracing内核时,上面的代码返回大约500。 当我使用1024的工作组大小时,它显然失败并给了我CL_OUT_OF_RESOURCES错误。
你的内核变得越复杂,它的最大工作组大小就越小(或者至少是我所经历过的)。
修改:
我刚刚意识到你说“clEnqueueReadBuffer”而不是“clEnqueueNDRangeKernel”......
我的回答与clEnqueueNDRangeKernel有关
抱歉错误。
我希望这对其他人有用。
答案 1 :(得分:5)
- 调用clFinish()可以获得计算的错误状态(而不是在尝试读取数据时获取它)。
- 如果(NVidia)卡也被用作显示器,则“超出资源”错误也可能由5秒超时引起 - 当你的内核中有指针错误时,它也会出现
后续建议首先在CPU上运行内核,以确保您不会进行超出范围的内存访问。
答案 2 :(得分:3)
并非所有可用内存都必须提供给单个采集请求。阅读堆碎片1,2,3,了解更多关于为什么最大的分配可以成功用于最大的连续内存块以及如何将块分成更小的块由于使用了记忆。
这并不是资源耗尽......它找不到足以满足您要求的单件......
答案 3 :(得分:1)
内核中的超出范围通常是静默的(因为在内核排队调用中仍然没有错误)。
但是,如果您稍后尝试使用clEnqueueReadBuffer()读取内核结果。此错误将显示出来。它表明在内核执行期间出了问题。
检查内核代码是否有越界读/写。