2012-07-24 7 views
11

Profilowałem mój program Cuda 4 i okazało się, że na pewnym etapie działający proces używał ponad 80 GiB pamięci wirtualnej. To było o wiele więcej, niż się spodziewałam. Po zbadaniu ewolucji mapy pamięci w czasie i porównywanie co linia kodu jest wykonanie okazało się, że po tych prostych instrukcji użycie pamięci wirtualnej zderzyłem się do ponad 80 GiB:Dlaczego środowisko wykonawcze Cuda rezerwuje pamięć wirtualną 80 GiB po inicjalizacji?

int deviceCount; 
    cudaGetDeviceCount(&deviceCount); 
    if (deviceCount == 0) { 
    perror("No devices supporting CUDA"); 
    } 

Oczywiście, jest to pierwsze wywołanie Cuda, a więc uruchomiono środowisko uruchomieniowe. Następnie mapa pamięci wygląda (obcięta):

Address   Kbytes  RSS Dirty Mode Mapping 
0000000000400000 89796 14716  0 r-x-- prg 
0000000005db1000  12  12  8 rw--- prg 
0000000005db4000  80  76  76 rw--- [ anon ] 
0000000007343000 39192 37492 37492 rw--- [ anon ] 
0000000200000000 4608  0  0 ----- [ anon ] 
0000000200480000 1536 1536 1536 rw--- [ anon ] 
0000000200600000 83879936  0  0 ----- [ anon ] 

Teraz z tym ogromnym obszarem pamięci zmapowanym w wirtualną przestrzeń pamięci.

Okay, to może nie jest duży problem, ponieważ rezerwowanie/przydzielanie pamięci w Linuksie nie robi wiele, chyba że faktycznie piszesz do tej pamięci. Ale to naprawdę denerwujące, ponieważ na przykład zadania MPI muszą być określone przy maksymalnej ilości vmem użytecznych dla danego zadania. A 80GiB to po prostu niższa granica dla zadań Cudy - trzeba też dodać wszystkie inne rzeczy.

Mogę sobie wyobrazić, że ma to związek z tak zwaną powierzchnią zarysowania, którą utrzymuje Cuda. Rodzaj puli pamięci dla kodu jądra, który może dynamicznie rosnąć i zmniejszać się. Ale to spekulacja. Jest również przydzielany w pamięci urządzenia.

Jakieś spostrzeżenia?

Odpowiedz

12

Nie ma nic wspólnego z miejscem na scratch, jest to wynik systemu adresowania, który umożliwia ujednolicony dostęp do adresu i peer-to-peer pomiędzy hostem i wieloma procesorami graficznymi. Sterownik CUDA rejestruje wszystkie pamięci GPU + pamięć hosta w pojedynczej wirtualnej przestrzeni adresowej przy użyciu systemu pamięci wirtualnej jądra. Nie jest to w rzeczywistości zużycie pamięci, jako taka "sztuczka" polega na zamapowaniu wszystkich dostępnych przestrzeni adresowych na liniową wirtualną przestrzeń dla zunifikowanego adresowania.

+0

OK, ma sens. Tak więc, w moim przypadku host ma zainstalowane 48 GB pamięci RAM + 8 GB wymiany i 4 GPU z 6 GB każdy, co daje łącznie 80 GB. Bingo! Czy to oznacza, że ​​przy alokacji na normalną stertę, pojawiłoby się to również w tych 80 GB? – ritter

+0

Stert jest po prostu przydziałem z każdej pamięci GPU dla każdego kontekstu. Nie zobaczysz zmiany w pamięci wirtualnej z powodu sterty, ale wolna pamięć, którą raport API na danym GPU będzie się zmniejszać. – talonmies

+7

@Frank: Czy mogę mieć twój komputer? :) –

Powiązane problemy