我有一款基于CUDA的复杂Linux应用程序。它在一台装有一个NVIDIA GTX 560 Ti显卡(1 GB内存)的i7机器上运行,使用Ubuntu 12.04(x86_64)和 NVIDIA驱动程序295.41 + CUDA 4.2 Toolkit。
该应用程序需要大约600-700 MB的GPU全局内存,但在调用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()
的实现细节完全是专有的。
我能否得到一些其他的想法?
template<S> __global__ void ....
)可以大大减少初始内存使用量,从580 MB降至40 MB。我不应该在CUDA内核中使用模板吗?我有一个设备函数和4个使用模板的内核。 :( - Achimnol