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.