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

Memory cudaSetDevice()分配的全局内存超过580 MB,memory,cuda,gpu,nvidia,Memory,Cuda,Gpu,Nvidia,我有一个复杂的基于CUDA的Linux应用程序。它在i7机器上运行,带有一个NVIDIA GTX 560 Ti卡(1GB内存),使用Ubuntu 12.04(x86_64)和NVIDIA驱动程序295.41+CUDA 4.2工具包 该应用程序在GPU中需要大约600-700 MB的全局内存,由于调用cudamaloc()时出现“内存不足”错误,因此无法运行 经过一些调试,我发现在应用程序最开始时对cudaSetDevice()的第一次调用一次分配了大约580MB的全局内存,而应用程序其余部分的可

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

该应用程序在GPU中需要大约600-700 MB的全局内存,由于调用
cudamaloc()
时出现“内存不足”错误,因此无法运行

经过一些调试,我发现在应用程序最开始时对
cudaSetDevice()
的第一次调用一次分配了大约580MB的全局内存,而应用程序其余部分的可用内存只有433MB

CUDA参考手册说,它为设备初始化“主上下文”,并分配各种资源,如CUDA内核(在驱动程序API中称为“模块”)和常量变量。该应用程序有一些
\uuuuu设备\uuuuu常量\uuuuu
变量,但它们的总量只有几KB。大约有20-30个内核和设备函数

我不知道为什么CUDA在初始化过程中分配了如此大量的GPU内存。 在一个单独的最小程序中,只执行
cudaSetDevice(0);cudaMemGetInfo&a&t;printf(“%ld,%ld\n”,a,t)显示大约980 MB的可用内存。因此,问题应该出在我的应用程序上,但我无法找出导致如此大内存分配的原因,因为
cudaSetDevice()
的实现细节是完全专有的


我能有其他想法吗?

听起来像是个问题,你想向Nvidia提交一个bug吗?步骤如下: 1.打开页面; 2.如果未注册,请单击“立即加入”,否则单击“立即登录”; 3.输入电子邮件和密码登录; 4.在左侧面板上,主页部分有一个“Bug Report”项目,点击该项目可归档一个Bug; 5.填写所需的ITME,其他项目是可选的,但详细信息将帮助我们确定目标并解决问题; 6.如有必要,应上传附件; 7.对于Linux系统,最好附上nvidia错误报告;
8.如果问题与特定的代码模式有关,则需要复制示例代码和编译它的指令。

当第一次调用任何
cudaXXX()
函数时,我遇到了类似的问题,导致报告的VmData(UNIX)大量增加,有时达到数十GB。这不是一个bug,原因如下:


我假设
cudaSetDevice
是您在应用程序中进行的第一次CUDA调用,因此作为CUDA开发人员,您应该知道第一次CUDA调用非常昂贵,因为CUDA 1st在图形卡上分配其组件,大约500 MB


尝试使用另一个CUDA命令启动您的程序,例如
cudamaloc
,您将体验到与CUDA相同的分配量。你也可以在CUDA样本下运行<代码> DeViSeCuy[/COD],看看有多少内存在使用。

我可能发现,从编译中删除一些C++模板CUDA内核(例如,代码>模板,γGualalLux.Value.<代码>)大大减少了初始内存使用,从580 MB到40 MB。我不应该为CUDA内核使用模板吗?我有一个设备函数和使用模板的4个内核:(你能提供一个复制你的例子的最小测试用例吗?如果不知道这些模板内核中有什么,这里很难提供帮助。回答你的问题:在内核上使用模板函数参数通常是完全可以的。你的问题和这个不一样,你链接到的帖子也不是内存不足的原因。)在这个问题中询问了nsumption。这里发生的事情与CUDA运行时的本地内存预分配有关。有关更多信息,请参阅。