cudaSetDevice()函数分配了超过580MB的全局内存。

3

我有一款基于CUDA的复杂Linux应用程序。它在一台装有一个NVIDIA GTX 560 Ti显卡(1 GB内存)的i7机器上运行,使用Ubuntu 12.04(x86_64)和 NVIDIA驱动程序295.41 + CUDA 4.2 Toolkit。

该应用程序需要大约600-700 MB的GPU全局内存,但在调用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()的实现细节完全是专有的。

我能否得到一些其他的想法?


2
可能是如何管理CUDA内存?的重复问题。 - talonmies
1
我终于发现,从编译中删除一些C++模板化的CUDA内核(例如template<S> __global__ void ....)可以大大减少初始内存使用量,从580 MB降至40 MB。我不应该在CUDA内核中使用模板吗?我有一个设备函数和4个使用模板的内核。 :( - Achimnol
1
你能提供一个最小化的测试用例来重现你的例子吗?不知道那些模板内核里面有什么,很难在这里提供帮助。回答你的问题:通常在内核中使用模板函数参数是完全可以的。 - harrism
3个回答

3
我认为您在应用程序中执行的第一个CUDA调用是cudaSetDevice,因此作为一个CUDA开发者,您应该知道第一个CUDA调用非常昂贵,因为CUDA首先会将其组件分配到图形卡上,大约为500MB。
尝试使用另一个CUDA命令启动您的程序,例如cudaMalloc,您将体验到与CUDA相同的分配量。您还可以在CUDA示例下运行deviceQuery,以查看正在使用多少内存。

1

听起来像是一个问题,您想向Nvidia提交错误报告吗?步骤如下: 1. 打开页面http://developer.nvidia.com/cuda/join-cuda-registered-developer-program; 2. 如果没有注册,请点击“现在加入”,否则请点击“立即登录”; 3. 输入电子邮件和密码进行登录; 4. 在左侧面板中,主页部分有一个“错误报告”项目,单击它以提交错误报告; 5. 填写必填项,其他项为可选项,但详细信息将有助于我们更好地定位和修复问题; 6. 如有必要,应上传附件; 7. 对于Linux系统,最好附上nvidia-bug-report; 8. 如果问题与特定代码模式有关,则需要提供示例代码和编译说明以进行复制。


-1

你的问题与此不同,你提供的链接也不是导致这个问题中所询问的内存消耗的原因。这里发生的事情与CUDA运行时的本地内存预分配有关。请参见此问题和答案获取更多信息。 - talonmies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接