Почему CUDA закрепляет память так быстро? - PullRequest
72 голосов
/ 21 апреля 2011

Наблюдается значительное ускорение передачи данных, когда я использую закрепленную память для передачи данных CUDA. В Linux основной системный вызов для достижения этой цели - mlock. На странице руководства mlock говорится, что блокировка страницы предотвращает ее замену:

mlock () блокирует страницы в диапазоне адресов, начиная с адреса и продолжая для длинных байтов. Все страницы, которые содержат часть указанного диапазона адресов, гарантированно будут находиться в оперативной памяти при успешном завершении вызова;

В моих тестах у меня было несколько гигабайт свободной памяти в моей системе, поэтому не было никакого риска, что страницы памяти могли быть заменены, но я все еще наблюдал ускорение. Кто-нибудь может объяснить, что на самом деле здесь происходит? Любое понимание или информация очень ценятся.

Ответы [ 3 ]

71 голосов
/ 21 апреля 2011

Драйвер CUDA проверяет , заблокирован ли диапазон памяти или нет, и тогда он будет использовать другой кодовый путь. Заблокированная память хранится в физической памяти (ОЗУ), поэтому устройство может извлекать ее без помощи ЦП (DMA, так называемая асинхронная копия; устройству нужен только список физических страниц). Незащищенная память может генерировать ошибку страницы при доступе, и она сохраняется не только в памяти (например, это может быть подкачка), поэтому драйверу необходимо получить доступ к каждой странице неблокированной памяти, скопировать ее в закрепленный буфер и передать ее в DMA (синхронное, постраничное копирование).

Как описано здесь http://forums.nvidia.com/index.php?showtopic=164661

память хоста, используемая при асинхронном вызове копии mem, должна быть заблокирована на странице через cudaMallocHost или cudaHostAlloc.

Я также могу порекомендовать ознакомиться с руководствами cudaMemcpyAsync и cudaHostAlloc по адресу developer.download.nvidia.com. HostAlloc говорит, что драйвер cuda может обнаружить закрепленную память:

Драйвер отслеживает диапазоны виртуальной памяти, выделенные этой функцией (cudaHostAlloc), и автоматически ускоряет вызовы таких функций, как cudaMemcpy ().

9 голосов
/ 15 декабря 2013

CUDA использует DMA для передачи закрепленной памяти в графический процессор.Страничная память хоста не может использоваться с DMA, поскольку они могут находиться на диске.Если память не закреплена (т.е. заблокирована страницей), она сначала копируется в промежуточный буфер с блокировкой страницы, а затем копируется в графический процессор через DMA.Таким образом, используя закрепленную память, вы экономите время для копирования из памяти хоста с возможностью постраничной загрузки в память хоста с блокировкой страницы.

5 голосов
/ 21 апреля 2011

Если к страницам памяти еще не обращались, они, вероятно, никогда не менялись местами, начиная с . В частности, вновь выделенные страницы будут виртуальными копиями универсальной «нулевой страницы» и не будут иметь физического экземпляра, пока они не будут записаны. Новые карты файлов на диске также будут оставаться на диске до тех пор, пока они не будут прочитаны или записаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...