看起来 200 万个浮点数应该没什么大不了的,只有 8MB 的 1GB GPU RAM。我有时可以分配那么多,有时甚至更多,没有任何问题。当我执行 clEnqueueReadBuffer 时,我得到 CL_OUT_OF_RESOURCES,这看起来很奇怪。我能找出问题真正开始的地方吗? OpenCL 不应该在 clEnqueueReadBuffer 上像这样失败,对吗?应该是我分配数据的时候吧?除了错误代码之外,还有什么方法可以获得更多详细信息?如果我能看到 OpenCL 声明 CL_OUT_OF_RESOURCES 时分配了多少 VRAM,那就太酷了。
最佳答案
我刚刚遇到了和你一样的问题(花了我一整天的时间来解决)。
我相信有同样问题的人会偶然发现这一点,这就是我发布这个老问题的原因。
您可能没有检查内核的最大工作组大小。
这是你如何做到的:
size_t kernel_work_group_size;
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL);
我的设备(2 个 NVIDIA GTX 460 和 Intel i7 CPU)支持的最大工作组大小为 1024,但是当我通过路径跟踪内核时,上面的代码返回大约 500。
当我使用 1024 的工作组大小时,它显然失败并给了我 CL_OUT_OF_RESOURCES 错误。
你的内核变得越复杂,它的最大工作组大小就会变得越小(或者至少我经历过)。
编辑:
我刚刚意识到你说的是“clEnqueueReadBuffer”而不是“clEnqueueNDRangeKernel”......
我的回答与 clEnqueueNDRangeKernel 有关。
抱歉我的错误。
我希望这对其他人仍然有用。
关于memory - CL_OUT_OF_RESOURCES 用于 1GB VRAM 的 200 万个 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988645/