我有一个复杂的基于 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()
是完全专有的。
我能得到一些其他的想法吗?