/ / Czy istnieje limit pamięci lokalnej OpenCL? - opencl, gpgpu, pamięć dzielona na GPU

Czy istnieje limit lokalnej pamięci OpenCL? - opencl, gpgpu, pamięć dzielona na GPU

Dzisiaj dodałem jeszcze cztery __local zmienne do mojego jądra do zrzutu pośredniegowyniki w. Ale dodanie czterech dodatkowych zmiennych do sygnatury jądra i dodanie odpowiednich argumentów jądra powoduje, że wszystkie dane wyjściowe jądra są "0" s. Żadna z funkcji cl nie zwraca kodu błędu.

Próbowałem tylko dodać jedną z dwóch mniejszych zmiennych. Jeśli dodaję tylko jedną z nich, działa, ale jeśli dodaję obie, zepsuje się.

Tak, może to zachowanie OpenCL oznacza, że ​​I przeznaczone na wiele __local pamięć? Jak się dowiedzieć, ile __local pamięć jest do wykorzystania przeze mnie?

Odpowiedzi:

19 dla odpowiedzi nr 1

Ilość lokalnej pamięci, którą urządzenie oferuje na każdej z jej jednostek obliczeniowych, można sprawdzić za pomocą CL_DEVICE_LOCAL_MEM_SIZE flaga z clGetDeviceInfo funkcjonować:

cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);

Zwracany rozmiar jest w bajtach. Każda grupa robocza może przydzielić tyle pamięci ściśle dla siebie. Należy jednak pamiętać, że jeśli przydzieli się maksimum, może to uniemożliwić równoczesne planowanie innych pakietów roboczych w tej samej jednostce obliczeniowej.


6 dla odpowiedzi nr 2

Oczywiście istnieje, ponieważ lokalna pamięć jest fizyczny zamiast wirtualny.

Jesteśmy wykorzystywani, od pracy z wirtualnym adresemprzestrzeń na procesorach, teoretycznie mającą tyle pamięci, ile chcemy - potencjalnie awarię w bardzo dużych rozmiarach z powodu wyczerpania partycji stronicowania / wymiany, a może nawet tego, dopóki nie spróbujemy użyć zbyt dużej ilości pamięci, aby mogła " t być zmapowane do fizycznej pamięci RAM i dysku.

Nie dotyczy to takich rzeczy, jak jądro systemu operacyjnego komputera (lub jego części niższego poziomu), które muszą uzyskać dostęp do określonych obszarów w rzeczywistej pamięci RAM.

Nie dotyczy to również globalnej i lokalnej pamięci GPU. Nie ma* stronicowanie pamięci (zmiana przypisania postrzeganego wątkuadresy do adresów pamięci fizycznej); i bez zamiany. W szczególności w odniesieniu do pamięci lokalnej, każda jednostka obliczeniowa (= każdy symetryczny procesor na GPU) ma pęczek pamięci RAM wykorzystywany jako pamięć lokalna; zielone płyty tutaj:

wprowadź opis obrazu tutaj

rozmiar każdej takiej płyty jest tym, co otrzymujesz

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

Aby zilustrować, na nVIDIA Kepler GPU, rozmiar lokalnej pamięci wynosi 16 KB lub 48 KB (a uzupełnienie do 64 KB służy do buforowania dostępu do pamięci globalnej). Tak więc, od dzisiaj, Lokalna pamięć GPU jest bardzo mała w stosunku do globalnej pamięci urządzenia.


1 - Na procesorach graficznych nVIDIA, zaczynających się od architektury Pascal, obsługiwane jest stronicowanie; ale to nie jest powszechny sposób korzystania z pamięci urządzenia.


4 dla odpowiedzi nr 3

Nie jestem pewien, ale czułem, że to musi być widoczne.

Wystarczy przejść przez następujące linki. Przeczytaj to.

Świetna lektura: OpenCL - Miejsca pamięci.

Trochę powiązane rzeczy: