Подтвердить что ты не робот

Почему моя программа c внезапно использует 30 г виртуальной памяти?

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

Почему мой процесс будет использовать 28 г виртуальной памяти (или почему бы 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 ГБ

4b9b3361

Ответ 1

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

Ответ 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

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

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

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