cudaSetDevice()分配超过580 MB的全局内存

时间:2012-08-24 13:05:40

标签: memory cuda gpu nvidia

我有一个复杂的基于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()的实现细节是完全专有的。

我可以得到一些其他想法吗?

3 个答案:

答案 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?