为什么我的c程序突然使用30g的虚拟内存?

时间:2011-06-22 19:01:51

标签: c linux memory cuda virtual

在顶部,我注意到我的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

2 个答案:

答案 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_ *条目。)