Memory 使用1GB VRAM的200万个浮动的CLU资源?

Memory 使用1GB VRAM的200万个浮动的CLU资源?,memory,opencl,nvidia,Memory,Opencl,Nvidia,看起来200万个浮动应该没什么大不了的,只有8MB的1GB GPU内存。我有时能够分配那么多,有时甚至更多,而没有任何麻烦。当我做一个clenqueueradbuffer时,我从资源中获取CL,这看起来很奇怪。我能嗅出真正的麻烦是从哪里开始的吗?OpenCL不应该在Clenqueueredbuffer这样失败,对吗?应该是我分配数据的时候吧?除了错误代码,还有什么方法可以获得更多的细节吗?如果我能看到OpenCL宣布CLOUT OUT OUT OUT OUT OUT OUT OUT OUT OU

看起来200万个浮动应该没什么大不了的,只有8MB的1GB GPU内存。我有时能够分配那么多,有时甚至更多,而没有任何麻烦。当我做一个clenqueueradbuffer时,我从资源中获取CL,这看起来很奇怪。我能嗅出真正的麻烦是从哪里开始的吗?OpenCL不应该在Clenqueueredbuffer这样失败,对吗?应该是我分配数据的时候吧?除了错误代码,还有什么方法可以获得更多的细节吗?如果我能看到OpenCL宣布CLOUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OU资源时分配了多少VRAM,那就太酷了。

并非所有可用内存都可以提供给单个采集请求。阅读堆碎片,了解为什么能够成功的最大分配是针对最大的连续内存块,以及块如何由于使用内存而被分割成更小的块

并不是资源耗尽了。。。它只是找不到一件足够大的东西来满足您的要求…

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


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

我刚刚遇到了与您相同的问题(我花了一整天的时间来修复)。 我相信有同样问题的人会偶然发现这一点,这就是为什么我要发布这个老问题

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

这就是你如何做到的:

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”而不是“ClenqueueEndRangeKernel”…
我的答案与克伦奎恩德兰格内尔有关。
抱歉弄错了。

我希望这对其他人仍然有用。

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

但是,如果稍后尝试使用clenqueueredbuffer()读取内核结果。这个错误将会出现。它表示在内核执行期间出现了错误


检查您的内核代码是否存在越界读/写。

这很有意义,感谢您指出这一点。有没有一种方法可以分析发生故障时GPU上堆内存的碎片是什么样子的?不知何故,我怀疑这是否真的是问题所在,因为GPU内存的碎片通常不应该足够多。毕竟8MB在1GB卡上并没有那么多(特别是因为驱动程序应该能够将当前未使用的内存拉到主内存),gpu内存的分配通常相对较粗。因此,如果您看到由于碎片而导致的此类问题,并且如果是基于普通图形卡的系统(与特斯拉相反),那么您可能已经接近内存限制。我怀疑驾驶员不会在这一点上进行干预(通过消除一些上下文)。我仍然无法确定如何解决此问题。即使我在OpenCL调用之间插入了clFinish()调用,我也会得到CLU OUT OF_RESOURCES异常。为什么在我执行clEnqueueReadBuffer()时会触发它?@user464095:随机猜测:您是否为ClenqueueEndRangeKernel()指定了本地工作大小?@user464095:clEnqueueReadBuffer()只有两种错误模式,即CL_MEM_对象分配失败和CL_主机内存溢出,这两种模式可以映射到CL_资源溢出。在clenqueueredbuffer()返回之前是否会出现异常?(如果是这样的话,这个异常可能是由于之前的电话。)嘿,谢谢。你是对的!我使用的是设备最大工作组大小,而不是内核最大工作组大小。改了,修好了:)。没问题。我很高兴能帮上忙D