Dlaczego pamięć przypięta CUDA jest tak szybka?


84

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.


Czy zmierzyłeś czas samego mlocka?
osgx

Nie, zakłada się, że rzeczywisty czas potrzebny do wykonania wywołania mlock jest nieistotny (jeśli o to pytasz). Rzeczywistym narzutem jest rzeczywisty transfer danych, który w moim algorytmie stanowi znaczną część całkowitego czasu cyklu.
Gearoid Murphy

Jaki jest Twój procesor? Być może węzły obsługujące NUMA nie skorzystają na prostocie mlock().
osgx

Procesor AMD Phenom (tm) II X4 970
Gearoid Murphy

Odpowiedzi:


85

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

Pamięć hosta używana przez wywołanie asynchronicznego kopiowania pamięci musi być zablokowana na stronie przez cudaMallocHost lub cudaHostAlloc.

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ęć:

Sterownik śledzi zakresy pamięci wirtualnej przydzielone przez tę funkcję (cudaHostAlloc) i automatycznie przyspiesza wywołania funkcji takich jak cudaMemcpy ().


1
Zastanawiam się, ile spustoszenia można stworzyć, jeśli inny wątek spróbuje odblokować strony po wydaniu asynchronicznych poleceń kopiowania?
Zan Lynx,

1
Zan Lynx, ciekawe pytanie. Dlaczego chcesz odblokować tę pamięć? Nawet na 32-bitowym komputerze PC może być zablokowanych do 2-4 GB pamięci, a więcej, gdy karta PCI-express ma dostęp do 64-bitowego (w rzeczywistości 40 lub 48-bitowego) adresu. Dużo taniej jest kupić więcej pamięci niż zapłacić za mocno wygasłego (18k rep! Na SO) programistę. Tak jak myślę (wierzę) w Linuksie, munlock zostanie zablokowany lub zwróci błąd, a żadne uszkodzenie systemu nie zostanie zadane.
osgx,

Czy mogę zastosować cudaHostRegisterwskaźnik do pliku mapowanego w pamięci?
Tomilov Anatoliy

16

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.


5

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.


Myślę, że to nie przypadek (piszę o tym we wczesnym wariancie mojej odpowiedzi), ponieważ jest to prawdziwy program i mlock()był szybki w programie (patrz komentarz nr 2 do Q).
osgx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.