Obserwuję znaczne przyspieszenia przesyłania danych, gdy używam pamięci przypiętej do przesyłania danych CUDA. W Linuksie podstawowym wywołaniem systemowym służącym do osiągnięcia tego jest mlock. Ze strony podręcznika man mlocka stwierdza, że zablokowanie strony zapobiega jej zamianie:
mlock () blokuje strony w zakresie adresów zaczynając od addr i kontynuując przez len bajtów. Gwarantujemy, że wszystkie strony, które zawierają część określonego zakresu adresów, będą rezydowały w pamięci RAM, gdy połączenie powróci;
Podczas moich testów miałem kilka gigabajtów wolnej pamięci w moim systemie, więc nigdy nie było żadnego ryzyka, że strony pamięci mogły zostać wymienione, a mimo to nadal obserwowałem przyspieszenie. Czy ktoś może wyjaśnić, co się tu naprawdę dzieje? Wszelkie spostrzeżenia lub informacje są bardzo mile widziane.
mlock()
.Odpowiedzi:
CUDA Driver sprawdza , czy zakres pamięci jest zablokowany, czy nie, a następnie użyje innej ścieżki kodowej. Zablokowana pamięć jest przechowywana w pamięci fizycznej (RAM), więc urządzenie może ją pobrać bez pomocy procesora (DMA, inaczej kopia asynchroniczna; urządzenie potrzebuje tylko listy stron fizycznych). Pamięć niezablokowana może generować błąd strony przy dostępie i jest przechowywana nie tylko w pamięci (np. Może być wymieniona), więc sterownik musi uzyskać dostęp do każdej strony pamięci niezablokowanej, skopiować ją do przypiętego bufora i przekazać do DMA (Syncronious, kopiowanie strona po stronie).
Jak opisano tutaj http://forums.nvidia.com/index.php?showtopic=164661
Mogę również polecić sprawdzenie podręczników cudaMemcpyAsync i cudaHostAlloc na stronie developer.download.nvidia.com. HostAlloc mówi, że sterownik CUDA może wykryć przypiętą pamięć:
źródło
cudaHostRegister
wskaźnik do pliku mapowanego w pamięci?CUDA używa DMA do przenoszenia przypiętej pamięci do GPU. Pamięci hosta z możliwością stronicowania nie można używać z DMA, ponieważ mogą znajdować się na dysku. Jeśli pamięć nie jest przypięta (tj. Zablokowana na stronie), jest najpierw kopiowana do bufora „pomostowego” z blokadą strony, a następnie kopiowana do procesora graficznego przez DMA. Tak więc, korzystając z pamięci przypiętej, oszczędzasz czas na kopiowanie z pamięci hosta ze stronicowaniem do pamięci hosta z blokowaniem stron.
źródło
Jeśli strony pamięci nie były jeszcze dostępne, prawdopodobnie nigdy nie zostały zamienione . W szczególności nowo przydzielone strony będą wirtualnymi kopiami uniwersalnej „strony zerowej” i nie będą miały fizycznej instancji, dopóki nie zostaną zapisane. Nowe mapy plików na dysku również pozostaną wyłącznie na dysku, dopóki nie zostaną odczytane lub zapisane.
źródło
mlock()
był szybki w programie (patrz komentarz nr 2 do Q).