我对我的Cuda 4程序进行了分析,结果发现在某个阶段,该运行进程使用了超过80 GiB的虚拟内存。这比我预期的要多得多。 经过对内存映射演变的检查以及比较执行代码的行号后,发现在这些简单指令之后,虚拟内存使用量增加到了80 GiB以上:
int deviceCount;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0) {
perror("No devices supporting CUDA");
}
显然,这是第一个Cuda调用,因此运行时已经初始化。在此之后,内存映射如下(截断):
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 89796 14716 0 r-x-- prg
0000000005db1000 12 12 8 rw--- prg
0000000005db4000 80 76 76 rw--- [ anon ]
0000000007343000 39192 37492 37492 rw--- [ anon ]
0000000200000000 4608 0 0 ----- [ anon ]
0000000200480000 1536 1536 1536 rw--- [ anon ]
0000000200600000 83879936 0 0 ----- [ anon ]
现在,这个巨大的内存区域映射到虚拟内存空间中了。
好吧,或许这不是一个大问题,因为在Linux中保留/分配内存并不会有什么作用,除非您真正写入了该内存。但这真的很烦人,例如MPI作业必须指定作业可使用的最大vmem量。而80GiB只是Cuda作业的下限 - 还必须添加所有其他东西。
我可以想象这与Cuda维护的所谓的临时空间有关。一种可动态增长和收缩的内核代码的内存池。但这只是猜测。此外,它分配在设备内存中。
有什么见解吗?