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

Posted

技术标签:

【中文标题】cudaSetDevice() 分配超过 580 MB 的全局内存【英文标题】:cudaSetDevice() allocates more than 580 MB of global memory 【发布时间】:2012-08-20 01:15:31 【问题描述】:

我有一个复杂的基于 CUDA 的 Linux 应用程序。它在 i7 机器上运行,带有一个 NVIDIA GTX 560 Ti 卡(1 GB 内存),使用 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() 的实现细节是完全专有的。

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

【问题讨论】:

How is CUDA memory managed? 的可能重复项 我终于发现,从编译中删除一些 C++ 模板化的 CUDA 内核(例如,template<S> __global__ void ....)会大大减少初始内存使用量,从 580 MB 减少到 40 MB。我不应该为 CUDA 内核使用模板吗?我有一个设备功能和 4 个使用模板的内核。 :( 你能提供一个最小的测试用例来重现你的例子吗?在不知道这些模板内核内部的情况下,很难在这里提供帮助。回答您的问题:在内核上使用模板函数参数通常是完全可以的。 【参考方案1】:

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

尝试使用另一个 CUDA 命令启动您的程序,例如cudaMalloc,您将体验到相同数量的 CUDA 分配。您还可以在 CUDA Samples 下运行 deviceQuery 以查看正在使用的内存量。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

当第一次调用任何 cudaXXX() 函数导致报告的 VmData (UNIX) 大幅飙升时,我遇到了类似的问题,有时达到数十 GB。这不是错误,原因在这里给出:

Why does the Cuda runtime reserve 80 GiB virtual memory upon initialization?

【讨论】:

您的问题与此问题不同,并且您链接到的帖子不是此问题中提出的内存消耗的原因。这里发生的事情与 CUDA 运行时的本地内存预分配有关。请参阅this question and answer 了解更多信息。

以上是关于cudaSetDevice() 分配超过 580 MB 的全局内存的主要内容,如果未能解决你的问题,请参考以下文章

cudaSetDevice() 编号是不是跨进程一致?

等效于 cudaSetDevice 的 CUDA 驱动程序 API

[CF580C]Shortest Cycle(图论,最小环)

显卡580x和vega48的区别

Tensorflow分配内存:分配38535168超过系统内存的10%

580 穷游澳洲旅游攻略