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

jmi*_*loy 13 c linux memory virtual cuda

在顶部,我注意到我的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
Run Code Online (Sandbox Code Playgroud)

-

ubuntu 11.04 64位
16 GB RAM

nju*_*ffa 11

UVA要求CUDA分配足够的虚拟内存来映射GPU和系统内存.请参阅NVIDIA论坛以下主题中的第5篇帖子:

  • 为什么不在答案中添加线程摘要.也许这是用于CUDA的UVA(统一虚拟寻址)功能的保留区域? (2认同)

bdo*_*lan 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
Run Code Online (Sandbox Code Playgroud)

第一个段是一个30GB的匿名私有段,不允许访问它,从0x200000000-0x900000000映射.确实有点神秘 - 可能与nvidia驱动程序的内部工作有关(也许它想阻止那些特定地址的分配?).它实际上并没有占用任何内存--Rss为零,并且访问标志(--- p)被设置为拒绝所有访问,因此(目前)实际上不会为其分配任何内存.它只是地址空间中的保留部分.

另一位是/ dev/nvidia0映射,为2千兆字节.这可能是视频卡RAM部分的直接映射.它不会占用内存 - 它只是保留了部分地址空间用于与硬件通信.

所以这并不是什么值得担心的事情.如果你想知道你真正使用了多少内存,请为所有其他内存段添加Rss数字(如果你想跳过共享库等,请使用Private_*条目).