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

Почему CUDA запирает память так быстро?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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