【发布时间】:2021-06-25 11:24:06
【问题描述】:
我正在分析我的 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 维护的所谓暂存空间有关。一种可以动态增长和收缩的内核代码内存池。但那是猜测。它也分配在设备内存中。
有什么见解吗?
【问题讨论】:
标签: cuda