почему моя программа c внезапно использует 30 г виртуальной памяти? - PullRequest
13 голосов
/ 22 июня 2011

Кроме того, я заметил, что моя программа c (с использованием CUDA 3.2) имеет виртуальный размер 28 г или более (если смотреть на VIRT) при каждом запуске с самого начала.Это не имеет никакого смысла для меня.Резидентная память имеет смысл и составляет всего около 2 г на моем самом большом наборе данных.Я знаю, что когда-то в прошлом виртуальный размер был не таким большим, но я не уверен, когда произошло изменение.

Почему мой процесс использовал бы 28 г виртуальной памяти (или почему VIRT top был бы такимбольшой)?Я понимаю, что VIRT включает исполняемый двоичный файл (только 437 КБ), разделяемые библиотеки и «область данных».Что такое «область данных»?Как я могу узнать, сколько памяти требуют разделяемые библиотеки?А как насчет других элементов общей памяти моего процесса?

содержимое / proc / / smaps (1022 строки) здесь: http://pastebin.com/fTJJneXr

Одна из записей из smaps показывает, что однаиз них приходится МОСТ, но нет метки ... как я могу узнать, что это за "пустая" запись, которая имеет 28 ГБ?

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.0464-разрядная
16 ГБ ОЗУ

Ответы [ 2 ]

11 голосов
/ 23 июня 2011

UVA требует, чтобы CUDA выделил достаточно виртуальной памяти для отображения всей графической и системной памяти.Пожалуйста, смотрите сообщение № 5 в следующей теме на форумах NVIDIA :

9 голосов
/ 22 июня 2011

Этими двумя регионами будет виновник:

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

Первый сегмент - это анонимный частный сегмент размером 30 ГБ, доступ к которому не разрешен, сопоставленный с 0x200000000-0x900000000.Действительно, немного загадочно - возможно, это связано с внутренней работой драйвера nvidia (может быть, он хочет предотвратить распределение с этими конкретными адресами?).Хотя на самом деле он не занимает какую-либо память - Rss равен нулю, а флаги доступа (--- p) установлены для запрета любого доступа, поэтому (на данный момент) фактического выделения памяти для этого не произойдет.Это просто зарезервированный раздел в вашем адресном пространстве.

Другой бит - это отображение / dev / nvidia0 в два гигабайта.Вероятно, это прямое отображение части оперативной памяти видеокарты.Он не занимает память как таковую - он просто резервирует часть вашего адресного пространства для связи с оборудованием.

Так что беспокоиться не о чем.Если вы хотите узнать, сколько памяти вы действительно используете, добавьте значения Rss для всех остальных сегментов памяти (вместо этого используйте записи Private_ *, если хотите пропустить общие библиотеки и т. П.).

...