Memory cudaSetDevice()分配的全局内存超过580 MB
我有一个复杂的基于CUDA的Linux应用程序。它在i7机器上运行,带有一个NVIDIA GTX 560 Ti卡(1GB内存),使用Ubuntu 12.04(x86_64)和NVIDIA驱动程序295.41+CUDA 4.2工具包 该应用程序在GPU中需要大约600-700 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的全局内存,而应用程序其余部分的可
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运行时的本地内存预分配有关。有关更多信息,请参阅。