5

看起来 200 万个浮点数应该没什么大不了的,只有 8MB 的 1GB 的 GPU RAM。我有时可以分配这么多,有时甚至更多,没有麻烦。当我执行 clEnqueueReadBuffer 时,我得到 CL_OUT_OF_RESOURCES,这看起来很奇怪。我能找出问题真正开始的地方吗?OpenCL 不应该在 clEnqueueReadBuffer 上像这样失败,对吧?应该是我分配数据的时候吧?除了错误代码之外,还有什么方法可以获取更多详细信息吗?如果我能看到 OpenCL 声明 CL_OUT_OF_RESOURCES 时分配了多少 VRAM,那就太酷了。

4

4 回答 4

8

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

您可能没有检查kernel的最大工作组大小。

这就是你的做法:

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,但是当我通过路径跟踪内核时,上面的代码返回大约 500。当我使用 1024 的工作组大小时,它显然失败了,并给了我 CL_OUT_OF_RESOURCES 错误。

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

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

于 2012-12-15T22:54:23.213 回答
5

另一个来源

- 调用 clFinish() 为您获取计算的错误状态(而不是在您尝试读取数据时获取它)。
- 如果 (NVidia) 卡也被用作显示器,“资源不足”错误也可能是由 5 秒超时引起的
- 当内核中有指针错误时也会出现。

后续建议首先在 CPU 上运行内核,以确保您不会进行越界内存访问。

于 2010-10-21T22:00:26.153 回答
3

并非所有可用内存都必须提供给单个采集请求。阅读堆碎片123以了解更多关于为什么可以成功的最大分配是针对最大的连续内存块以及如何将块划分为更小的块作为使用内存的结果。

不是资源枯竭……只是找不到一块足够大的碎片来满足你的要求……

于 2010-10-21T15:06:22.910 回答
1

内核中的越界访问通常是静默的(因为在内核队列调用中仍然没有错误)。

但是,如果您稍后尝试使用 clEnqueueReadBuffer() 读取内核结果。会出现这个错误。它表明内核执行期间出现了问题。

检查内核代码是否有越界读/写。

于 2013-08-27T09:26:16.080 回答