在顶部,我注意到我的c程序(使用CUDA 3.2)的虚拟大小为28g或更多(查看VIRT),从一开始就进行每次运行。这对我来说没有任何意义。驻留内存是有意义的,在我最大的数据集上只有大约2g。我知道在过去的某个时刻虚拟尺寸不是很大,但我不确定发生了什么变化。
为什么我的进程会使用28g的虚拟内存(或者为什么top的VIRT会如此之大)?据我所知,VIRT包括可执行二进制文件(仅437K),共享库和“数据区”。什么是“数据区”?如何找出共享库需要多少内存?那个过程总内存的其他元素呢?
/ proc /<的内容pid> / smaps(1022行):http://pastebin.com/fTJJneXr
其中一个来自smaps的条目显示其中一个占其中的MOST,但没有标签......我怎么能找出这个“空白”条目有28gb?
200000000-900000000 ---p 00000000 00:00 0
Size: 29360128 kB
Rss: 0 kB
Pss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 0 kB
Anonymous: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
-
ubuntu 11.04 64位
16 GB RAM
答案 0 :(得分:11)
UVA要求CUDA分配足够的虚拟内存来映射GPU和系统内存的所有内容。请参阅以下thread on the NVIDIA forums中的第5篇文章:
答案 1 :(得分:9)
这两个地区将成为罪魁祸首:
200000000-900000000 ---p 00000000 00:00 0
Size: 29360128 kB
Rss: 0 kB
Pss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 0 kB
Anonymous: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
7f2e9deec000-7f2f131ec000 rw-s 33cc0c000 00:05 12626 /dev/nvidia0
Size: 1920000 kB
Rss: 1920000 kB
Pss: 1920000 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 1920000 kB
Referenced: 1920000 kB
Anonymous: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
第一个段是一个30GB的匿名私有段,不允许访问它,从0x200000000-0x900000000映射。确实有点神秘 - 可能与nvidia驱动程序的内部工作有关(也许它想阻止那些特定地址的分配?)。它实际上并没有占用任何内存--Rss为零,并且访问标志(--- p)被设置为拒绝所有访问,因此(目前)实际上不会为其分配任何内存。它只是地址空间中的保留部分。
另一位是/ dev / nvidia0映射,两千兆字节。这可能是视频卡RAM部分的直接映射。它不会占用内存 - 它只是保留了部分地址空间用于与硬件通信。
因此,不必担心。如果你想知道你真正使用了多少内存,请为所有其他内存段添加Rss数字(如果你想跳过共享库等,请使用Private_ *条目。)