3

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

该应用程序在 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()是完全专有的。

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

4

3 回答 3

3

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

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

于 2013-07-03T07:29:25.693 回答
1

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

于 2012-09-14T10:19:55.867 回答
-1

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

为什么 Cuda 运行时在初始化时会保留 80 GiB 虚拟内存?

于 2012-12-31T13:03:52.653 回答