我有一个复杂的基于CUDA的Linux应用程序。它运行在带有一块NVIDIA GTX 560 Ti卡(1 GB内存)的i7机器上,使用Ubuntu 12.04(x86_64)和NVIDIA驱动程序295.41 + CUDA 4.2 Toolkit。
该应用程序在GPU中需要大约600-700 MB的全局内存,并且由于调用cudaMalloc()
时出现“内存不足”错误而无法运行。
经过一些调试后,我发现在应用程序一开始第一次调用cudaSetDevice()
一次性分配 580 MB 的全局内存,其余的可用内存应用程序只有433 MB。
CUDA参考手册说它初始化设备的“主要上下文”并分配各种资源,例如CUDA内核(在驱动程序API中称为“模块”)和常量变量。该应用程序有一些__device__ __constant__
变量,但它们的总量只有几KB。大约有20-30个内核和设备功能。
我不知道为什么CUDA会在初始化期间分配如此大量的GPU内存。
在一个单独的最小程序中,只有cudaSetDevice(0); cudaMemGetInfo(&a, &t); printf("%ld, %ld\n", a, t);
显示大约980 MB的可用内存。所以问题应该存在于我的应用程序,但我无法弄清楚是什么原因导致如此大的内存分配,因为cudaSetDevice()
的实现细节是完全专有的。
我可以得到一些其他想法吗?
答案 0 :(得分:3)
我认为cudaSetDevice
是您在应用程序中进行的第一次CUDA调用,因此作为CUDA开发人员,您应该知道第一次CUDA调用非常昂贵,因为CUDA 1st会将其组件分配到图形卡上,大约500 MB。
尝试使用其他CUDA命令启动程序,例如cudaMalloc
,您将体验到CUDA的相同数量的分配。您还可以在CUDA示例下运行deviceQuery
以查看正在使用的内存量。
答案 1 :(得分:1)
这听起来像是一个问题,你想向Nvidia提交一个错误吗?步骤是: 1.打开页面http://developer.nvidia.com/cuda/join-cuda-registered-developer-program; 2.如果没有注册,请点击“立即加入”,否则点击“立即登录”; 3.输入电子邮件和密码登录; 4.在左侧面板中,Home部分中有一个“Bug Report”项,单击它以提交错误; 5.填写所需的主题,其他项目是可选的,但详细信息将帮助我们大量定位和解决问题; 6.如有必要,应上传附件; 7.对于Linux系统,最好附上一个nvidia-bug报告; 8.如果问题与特定代码模式有关,则需要一个示例代码和编译它的指令进行复制。
答案 2 :(得分:-1)
当第一次调用任何cudaXXX()
函数导致报告的VmData(UNIX)大量增加,有时达到数十GB时,我遇到了类似的问题。这不是错误,原因在这里给出:
Why does the Cuda runtime reserve 80 GiB virtual memory upon initialization?