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
这两个地区将成为罪魁祸首:
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_*条目).
归档时间: |
|
查看次数: |
2557 次 |
最近记录: |