我正在分析我的 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 维护的所谓暂存空间有关。一种可以动态增长和收缩的内核代码内存池。但那是猜测。它也分配在设备内存中。
有什么见解吗?