CL_OUT_OF_RESOURCES为2百万浮动1GB VRAM?

smu*_*kes 5 memory nvidia opencl

看起来200万个花车应该没什么大不了的,只有8MB的1GB GPU内存.我能够有时分配那么多,有时甚至比没有麻烦.当我执行clEnqueueReadBuffer时,我得到了CL_OUT_OF_RESOURCES,这看起来很奇怪.我能够嗅出问题真正开始的地方吗?在clEnqueueReadBuffer中,OpenCL不应该像这样失败吗?应该是我分配数据的时候吗?有没有办法获得更多的细节而不仅仅是错误代码?如果我能看到当OpenCL声明CL_OUT_OF_RESOURCES时分配了多少VRAM,那将会很酷.

Tar*_*ara 8

我遇到了同样的问题(花了我一整天的时间来解决).我相信有同样问题的人会偶然发现这个问题,这就是我发布这个老问题的原因.

您可能没有检查内核的最大工作组大小.

这是你如何做到的:

size_t kernel_work_group_size;
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL);
Run Code Online (Sandbox Code Playgroud)

我的设备(2x NVIDIA GTX 460和Intel i7 CPU)支持最大工作组大小为1024,但是当我通过Path Tracing内核时,上面的代码返回大约500.当我使用1024的工作组大小时,它显然失败并给了我CL_OUT_OF_RESOURCES错误.

内核变得越复杂,它的最大工作组大小就越小(或者至少是我所经历过的).

编辑:
我刚刚意识到你说"clEnqueueReadBuffer"而不是"clEnqueueNDRangeKernel"......
我的回答与clEnqueueNDRangeKernel有关.
抱歉这个错误.
我希望这对其他人仍然有用.


Eri*_*ers 5

另一个来源:

- 调用clFinish()可以获得计算的错误状态(而不是在尝试读取数据时获取它).
- 如果(NVidia)卡也被用作显示器
,那么"超出资源"错误也可能由5s超时引起- 当你的内核中有指针错误时,它也会出现.

后续建议首先在CPU上运行内核,以确保您不会进行超出范围的内存访问.


Eri*_*ers 3

并非所有可用内存都必须提供给单个获取请求。阅读堆碎片1 , 2 , 3来了解更多关于为什么可以成功的最大分配是针对最大的连续内存块,以及如何由于使用内存而将块分成更小的块。

并不是资源耗尽了……只是找不到一块足够大的来满足你的要求……