【问题标题】:why is my c program suddenly using 30g of virtual memory?为什么我的c程序突然用了30g的虚拟内存?
【发布时间】:2011-09-20 16:01:04
【问题描述】:

在顶部,我注意到我的 c 程序(使用 CUDA 3.2)的虚拟大小为 28g 或更多(查看 VIRT),从一开始就开始运行。这对我来说没有任何意义。常驻内存是有意义的,在我最大的数据集上只有 2g 左右。我知道在过去的某个时候虚拟大小并没有那么大,但我不确定更改发生的时间。

为什么我的进程会使用 28g 的虚拟内存(或者为什么 top 的 VIRT 会这么大)?我了解 VIRT 包括可执行二进制文件(仅 437K)、共享库和“数据区”。什么是“数据区”?如何找出共享库需要多少内存?我的进程总内存的其他元素呢?

/proc//smaps 的内容(1022 行)在这里:http://pastebin.com/fTJJneXr

smaps 中的一个条目显示其中一个占其中的大部分,但没有标签...我如何才能找出这个“空白”条目是什么,它有 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 内存

【问题讨论】:

  • 请粘贴 /proc/(你的程序的 PID)/smaps 的内容,对诊断问题有很大帮助
  • 如果不知道/看到你的程序就很难说
  • @bdonlan smaps 很长 - 我以前从未使用过 pastebin,如果它不起作用,请告诉我。
  • @BlackBear 对我如何诊断或查看什么有任何帮助?绝对不是我分配 30g 内存的情况 - 启动进程后立即虚拟大小为 30g。
  • @jmilloy:问题可能出在任何地方,电脑目前没有做任何事情。

标签: c linux memory cuda virtual


【解决方案1】:

UVA 要求 CUDA 分配足够的虚拟内存来映射所有 GPU 和系统内存。请参阅以下thread on the NVIDIA forums 中的帖子#5:

【讨论】:

  • 谢谢!有趣的是我看到了这个问题......论坛帖子表明虚拟内存问题存在于 CUDA 4.0 而不是 3.2 中。
  • 为什么不在您的答案中添加主题摘要。也许这是用于 CUDA 的 UVA(统一虚拟寻址)功能的保留区域?
  • @Zan Lynx 同意。我添加了一句话总结。
【解决方案2】:

这两个地区将是罪魁祸首:

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 映射,大小为 2 GB。这可能是视频卡 RAM 的一部分的直接映射。它不会占用内存 - 它只是保留部分地址空间用于与硬件通信。

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

【讨论】:

  • 哈哈谢谢我刚刚也识别了这些片段,匿名部分确实很神秘!我想我不会担心的。 smaps 非常有用,正是我需要的。
  • 哦,第二段正如你所说的那样 - 我的代码明确使用页面锁定内存来加速数据传输。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多