Я наблюдаю значительное ускорение передачи данных, когда использую закрепленную память для передачи данных CUDA. В Linux основным системным вызовом для достижения этой цели является mlock. На странице руководства mlock говорится, что блокировка страницы предотвращает ее замену:
mlock () блокирует страницы в диапазоне адресов, начиная с addr и продолжая len байтов. Все страницы, которые содержат часть указанного диапазона адресов, гарантированно будут резидентными в ОЗУ после успешного возврата вызова;
В моих тестах у меня было несколько гигов свободной памяти в моей системе, поэтому никогда не было никакого риска, что страницы памяти могли быть выгружены, но я все же наблюдал ускорение. Может ли кто-нибудь объяснить, что здесь происходит на самом деле? Любое понимание или информация очень ценятся.
mlock()
.Ответы:
Драйвер CUDA проверяет , заблокирован ли диапазон памяти или нет, и затем будет использовать другой путь кода. Заблокированная память хранится в физической памяти (ОЗУ), поэтому устройство может извлекать ее без помощи ЦП (DMA, также известное как Async copy; устройству нужен только список физических страниц). Незаблокированная память может генерировать ошибку страницы при доступе, и она сохраняется не только в памяти (например, она может быть в свопинге), поэтому драйверу необходимо получить доступ к каждой странице незаблокированной памяти, скопировать ее в закрепленный буфер и передать ее в DMA (синхронное, постраничное копирование).
Как описано здесь http://forums.nvidia.com/index.php?showtopic=164661
Я также могу порекомендовать проверить руководства cudaMemcpyAsync и cudaHostAlloc на сайте developer.download.nvidia.com. HostAlloc говорит, что драйвер cuda может обнаруживать закрепленную память:
источник
cudaHostRegister
к указателю на файл с отображением памяти?CUDA использует DMA для передачи закрепленной памяти на GPU. Страничная память хоста не может использоваться с DMA, потому что она может находиться на диске. Если память не закреплена (т. Е. Страничная блокировка), она сначала копируется в «промежуточный» буфер с блокировкой страницы, а затем копируется в графический процессор через DMA. Таким образом, используя закрепленную память, вы экономите время на копирование из страничной памяти хоста в страничную память хоста.
источник
Если страницы памяти еще не были доступны, они, вероятно, никогда не менялись местами с самого начала . В частности, вновь выделенные страницы будут виртуальными копиями универсальной «нулевой страницы» и не будут иметь физического экземпляра, пока они не будут записаны. Новые карты файлов на диске также останутся только на диске до тех пор, пока они не будут прочитаны или записаны.
источник
mlock()
была быстрой в программе (проверьте комментарий № 2 к Q).