Ответ 1
UVA требует, чтобы CUDA выделяла достаточно виртуальной памяти для отображения всех графических процессоров и системной памяти. Пожалуйста, см. Сообщение № 5 в следующем разделе поток на форумах NVIDIA:
В верхней части я заметил, что моя 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 ГБ
UVA требует, чтобы CUDA выделяла достаточно виртуальной памяти для отображения всех графических процессоров и системной памяти. Пожалуйста, см. Сообщение № 5 в следующем разделе поток на форумах NVIDIA:
Эти две области были бы виновниками:
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_ *, если вы хотите пропустить общие библиотеки и т.д.).