to get the file

Transkrypt

to get the file
Organizacja pamięci w procesorach graficznych
Pamięć w GPU przechowuje dane dla procesora graficznego, służące do wyświetlaniu
obrazu na ekran. Pamięć przechowuje m.in. dane wektorów, pikseli, tekstury czy bufor
ramki.
Pamięć GDDR
Pamięć GDDR jest specjalnym rodzajem pamięci przeznaczonym do kart graficznych,
opracowana przez firmę ATI. Głównymi zaletami takich pamięci nad standardowymi
pamięciami typu DDR są:
● Wyższe częstotliwości taktowania
● Niższe napięcia, powodujące zmniejszenie poboru mocy i wydzielania ciepła
● Dwa razy większa przepustowośc, kontroler GDDR może w jednym cyklu zegara
przeprowadzić zapis i odczyt, podczas gdy pamięć DDR może wykonać tylko
jedną z tych rzeczy w jednym cyklu.
Krótka charakterystyka poszczególnych typów pamięci w GPU:
A. Pamięć Globalna
Pamięć globalna jest dostępna przez wszystkie wątki aplikacji, jest to globalny zasób
karty graficznej. Jest to pamięć stałą trwająca do czasu zakończenia aplikacji. Zarówno
CPU jak i GPU mogą zapisywać/odczytywać z tej pamięci, jednak komunikacja między
hostem a GPU jest wiele wolniejsza od komunikacji GPU-Pamięć globalna.
Korzystanie z tej pamięci ma jednak kilka wad:
●
●
●
●
jest wolna
stanowi wąskie gardło w wydajności
dostęp do niej nie jest synchronizowany
należy zapewnić brak konfliktów przy dostępie do tej pamięci przez wątki
B. Pamięć Stała
Jest to niewielki cache trzymany w pamięci globalnej, używany przy danych, które nie
zmienią się przez czas wykonywania się programu. Jest znacząco szybsza od pamięci
globalnej, jednak ma niewielki rozmiar i jest tylko do odczytu.
C. Pamięć Współdzielona
Jest to pamięć znajdująca się bezpośrednio w chipie GPU, stąd jest bardzo szybka.
Dostęp do niej mają wszystkie wątki w obrębie danego bloku, jest niedostępna z
poziomu CPU. Umożliwia to wątkom szybkie komunikowanie się i wymienianie między
sobą danych. Każdy ma swoją własną tablicę z tą pamięcią. Trwa do czasu wykonania
się danego bloku. Głównym ograniczeniem tej pamięci jest jej mały rozmiar, przez co
gdy chcemy wykonać jakieś większe operacje w pamięci współdzielonej musimy
podzielić dane na bloki. Przykładem może być przetwarzanie obrazu, gdzie obrazek
należy podzielić na bloki i umieścić w tej pamięci w celu przetworzenia
D. Rejestry
Znajdują się w chipie GPU, służą do przechowywania zmiennych lokalnych i innych
rzeczy, do których potrzeba mieć szybki i częsty dostęp. Dostęp do rejestru ma tylko
wątek z niego korzystający, pamięć ta trwa do momentu wykonania się tego wątku. Ich
ograniczeniem jest ich ilość (zwykle kilka tysięcy rejestrów po 32bity)
E. Pamięć Lokalna
Znajduje się w przestrzeni pamięci urządzenia(pamięć globalna)Jest to wolną pamięcią,
prędkością porównywalna do pamięci globalnej. Jest używana głównie do
przechowywania zmiennych, gdy nie ma dla nich dostępnych rejestrów.
F. Pamięć podręczna
Jest to mała pamięć, do której GPU ma szybszy dostęp niż do pamięci GDRAM.
Procesor graficzny przetwarzając dane najpierw sprawdza czy są one w cache, i jeśli
tam znajdzie te dane to nie będzie musiał wykonywać kosztowniejszej operacji odczytu
z większych pamięci.
Pamięć z punktu widzenia wydajności
Z perspektywy szybkości dostępu lista pamięci wygląda następująco(od najkrótszego
czasu dostępu):
1.
2.
3.
4.
5.
Cache
Rejestry
Pamięć współdzielona
Pamięć stała
Pamięć globalna i lokalna
Patrząc na tą listę wydaje się, że najlepszą wydajność uzyskamy używając tylko cache,
rejestrów, pamięci współdzielonej i stałej. Pozostałymi istotnymi czynnikami jest ich
położenie w karcie graficznej,dostęp, zasięg i żywotność
Pamięć
Położenie
na chipie
Dostęp
Zasięg
Żywotność
Rejestry
Tak
Zapis/Odczyt
1 wątek
P.
współdzielona
Tak
Zapis/Odczyt
Wszystkie wątku
w bloku
Blok
P. stała
Nie
Odczyt
Wszystkie wątki
+ host
Aplikacja
P. globalna
Nie
Zapis/Odczyt
Wszystkie wątki
+ host
Aplikacja
P. lokalna
Nie
Zapis/Odczyt
1 wątek
Wątek
Wątek
Najlepszym ogólnym zastosowaniem będzie podzielenie operacji na bloki i użycie
pamięci współdzielonej, ponieważ wątki w obrębie tego samego bloku mogą się ze
sobą komunikować, a sama pamięć jest bardzo szybka.
Problemem przy tym rozwiązaniu będzie dostęp do całej pamięci dla wszystkich
wątków, będzie wiele wątków korzystając z danych jednocześnie. Aby powstrzymać to
wąskie gardło pamięć współdzielona jest podzielona na 32banki pamięci. Kolejne
sekcje pamięci zostają przydzielonych do kolejnyech banków.
Dwa fakty o pamięci współdzielonej:
● Cały rozmiar pamięci może być ustawiony na 16KB, 23KB lub 48KB(z pozostałą
ilością automatycznie użytą na cache L1)
● Z architekturą Keplera, każdy bank ma przepustowość 64bitów na cykl zegara.
Starsza architektura Fermiego była taktowana inaczej, efektywnie oferując
połowę tej przepustowości
Pamięć z perspektywy aplikacji
Dane aplikacji są przechowywane w pamięci GPU lub CPU w zależności od tego gdzie
są optymalniej wykorzystywane.
Po stronie GPU wykonywane są głównie specjalistyczne operacje takie jak rasteryzacja,
blending, filtrowanie tekstur i operacje współbieżne wymagające dużej
przepustowości(shadery).
Obliczenia związane z macierzami(tworzenie, przekształcenia, rotacje, skalowanie) są
wykonywane po stronie CPU. Jeśli chcemy uzyskać dostęp dotakiej macierzy należy
przekazać ją do GPU przez zmienną uniform.
Dane GPU przechowywane są w 3 objektach: Vertex Buffer, Frame Buffer, Texture.
Każdy z typów pamięci wspiera zestaw określonych operacji interfejsu GPU i CPU.
Operacje interfejsu CPU:
• Alokacja, zwolnienie pamięci
• Kopiowanie CPU → GPU
• Kopiowanie GPU → CPU
• Kopiowanie GPU → GPU
• Bind for read-only vertex stream access //DO PRZETŁUMACZENIA
• Bind for read-only random acces
• Bind for write-only framebuffer access
Operacje interfejsu GPU(shader/kernel):
• Odczyt z dostępu swobodnego
• Odczyt strumieniowy
Vertex Buffer – to pamięć GPU przechowująca dane o wierzchołkach.
Wspierane operacje:
• Interfejs CPU:
◦ Alokacja, zwolnienie pamięci
◦ Kopiowanie CPU → GPU
◦ Kopiowanie GPU → GPU (Render-to-vertex-array)
◦ Bind for read-only vertex stream access
• Interfejs GPU:
◦ Odczyt strumieniowy (tylko program wierzchołka)
Ograniczenia:
• CPU
◦ Nie można kopiować GPU → CPU
◦ No bind for read-only random access
◦ No bind for write-only framebuffer access
• GPU
◦ Brak odczytu o dostępie swobodnym
◦ Brak dostępu z programów fragmentów
Texture Memory – pamięć o dostępie swobodnym.
Wspierane operacje:
• CPU
◦ Alokacja, zwolnienie pamięci
◦ Kopiowanie CPU → GPU
◦ Kopiowanie GPU → CPU
◦ Kopiowanie GPU → GPU (render-to-texture)
◦ Bind for read-only random acces
◦ Bind for write-only framebuffer access
• GPU
◦ Odczyt o dostępie swobodnym
Ograniczenia:
•
No bind for vertex stream access
Framebuffer – pamięć zapisywana przez procesor fragmentów. Jest to pamięć tylko do
zapisu. Jest to struktura trzymająca wskaźniki do obiektów pamięci przechowujących
informacje o pikselu (kolor, alpha, głębia, stencil). Mogą to być obiektu Texture lub
Renderbuffer.

Podobne dokumenty