Implementacja algorytmów na procesory kart graficznych mgr inż. Krzysztof Wegner Katedra Telekomunikacji Multimedialnej i Mikroelektroniki Politechnika Poznańska Seminarium „Przetwarzanie obrazów i multimedia”, kwiecień 2009
Karta Graficzna GPU Podstawowym zadaniem karty graficznej jest przechowywanie informacji o tym jak powinien wyglądać obraz na ekranie monitora i odpowiednim sterowaniu monitorem. Nowoczesne procesory graficzne udostępniają wiele funkcji ułatwiających i przyśpieszających tworzenie obrazu. ATI Radeon 4850 NVIDIA GeForce GTX 285
Możliwości GPU Akceleracja 2D Rysowanie figur Warstwy i kafelki Podwójne buforowanie Akceleracja 3D Mapowanie wypukłości Efekty cząsteczkowe Pixel Shader Vertex Shader Transform & Lighting HDR
Bardzo duża moc obliczeniowa Możliwości GPU Filtrowanie anizotropowe Full Scene Anti-Aliasing Obliczanie fizyki gry – NVIDIA PhysX Bardzo duża moc obliczeniowa
Możliwości wykorzystania W celu renderowania grafiki GPU W celu obliczeń ogólnego przeznaczenia GPGPU Zastosowanie jednostek obiczeniowych
Architektura Karty Graficznej Potok przetwarzający
Porównanie kart graficznych AIT Radeon HD 4850 NVIDIA GeForce GTX285 Ilość tranzystorów 965 milionów 1400 milionów Technologia wykonania 55nm 65nm Ilość procesorów strumieniujących 800 240 Ilość jednostek teksturujących 40 80 Częstotliwość GPU 625 MHz 648 MHz Wydajność zmiennoprzecinkowa 1 Tflops 1.063 Tflops Wielkość pamięci 512MB GDDR3 1024MB GDDR3 Przepustowość pamięci 200 GB/s 155 GB/s
Dostępne zasoby Zmienne - Pamięć Jednostki Obliczeniowe Bufor wierzchołków(x y z, nx ny nz, t s, r g b a) 8 x Float32 + 4 x Int32 Bufor tekstury (RGBA) 4 x Float32 4 x Int32 Buffor ramki Jednostki Obliczeniowe Vertex Sheader Pixel Sheader
Filozofia wykorzystania GPU Zapis danych w teksturze lub układzie wierzchołków (Array to Texture) Ograniczenie pojedynczej tekstury do rozmiaru 8192x8192 punktów Ograniczenie do 32 tekstur Tablica Tekstura
Filozofia wykorzystania GPU Zaprogramowanie jednostek Pixel Shader i Vertex Shader Shader Model 4.0 Do 4096 instrukcji Do 4096 zmiennych lokalnych Wykorzystanie języków wysokiego poziomu Równoległość wykonywania obliczeń
Języki programowania Wszystkie języki oparte o język C OpenGL Shader Language GLSL Stworzony przez OpenGL ARB Część API OpenGL 2.0 High Level Shader Language HLSL Stworzony przez Microsoft Część API DirectX C for Graphics Stworzony przez NVIDIE razem z Microsoft’em
Filozofia wykorzystania GPU Wykonanie obliczeń następuje podczas renderowania obrazu Na ekranie rysuje się wielki prostokąt pokrywający obszar docelowej tablicy co inicjuje obliczenia Odczytuje się bufor ramki zawierający wynik obliczeń zaszyty w wyrenderowanym obrazie
Dodawanie 2 wektorów CPU GPU Umieszczenie danych w 2 tablicach A i B Program float* add(float* A,float* B) { for(coords=0; coords<9<coords+) C[coords] = A[coords]+B[coords]; return C; } Umieszczanie danych w 2 teksturach A i B Shader void add(void) { coords = gl_TexCoord[0].xy; gl_FragColor.r = rect(A, coords) + rect(B, coords); } A 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 4 6 8 B 2 4 6 8 A B
Dodawanie 2 wektorów CPU GPU Wywołanie obliczeń Czas Obliczeń C=add(A,B); Czas Obliczeń 9 taktów Wywołanie obliczeń GL_Draw_Quad(); Read_FrameBuffer(C); Czas Obliczeń 1 takt A 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 4 6 8 B 2 4 6 8 C 3 6 9 12 7 10 13 16 11 A B 3 6 9 12 7 10 13 16 11 C
Podstawowe operacje Każdy algorytm można rozbić na następujące operacje Scater – Rozpraszanie Operacje typu output[j] = f(input); Realizacja na VertexShader Gather – Zbieranie/grupowianie output = f(input(i),input(j)) Realizacja na PixelShader
jednostki obliczeniowe Wyznaczanie maksimum Operacja typu Gather – zbieranie/grupowianie Implementacja na pixel shader Oczywiste podejście Pixel Shader 16 taktów 2 4 5 9 8 7 3 1 6 9 Tekstura wejściowa Tekstura wyjściowa Nie wszystkie jednostki obliczeniowe wykorzystane
Wyznaczanie maksimum 8 taktów zamiast 16 Przyśpieszenie x2 Podejście zrównoleglone Pixel Shader 4 takty Pixel Shader 4 takty 2 4 5 9 8 7 3 1 6 9 7 6 8 9 Tekstura wejściowa Tekstura tymczasowa Tekstura wyjściowa 8 taktów zamiast 16 Przyśpieszenie x2
Różnice CPU GPU Struktury Danych Funkcje Sekwencyjne wykonanie Zmienna globalna/lokalna Tablica Z tablicy można czytać i pisać do niej jednocześnie A[i] = A[i]+B[i] Funkcje Dozwolone wywołanie funkcji Dozwolone skoki warunkowe Wskaźniki Sekwencyjne wykonanie Struktury Danych Tylko zmienna lokalna Tekstura / Bufor Wierzchołków Z tekstury można tylko czytać lub tylko do niej pisać A[i] = A’[i]+B[i] Vertex/Pixel Shader Dozwolone wywołanie funkcji Brak skoków warunkowych Brak wskaźników Równoległe wykonanie
Zalety GPU Wykorzystanie zalet przetwarzania równoległego Wielokrotne przyśpieszenie obliczeń Możliwość użycia „darmowej” mocy obliczeniowej komputera
Wady GPU Konieczność innego podejścia do typowych problemów Konieczności pisania programów w innym języku Brak elastyczności struktury karty graficznej Stały schemat przepływu danych Problem z załadowaniem danych do tekstury Nie wszystkie algorytmy da się zrównoleglić
Proste odejmowanie 4 punktów Implementacja na GPU Wyznaczanie mapy głębi Pixel Shader Proste odejmowanie 4 punktów Widok 7 Tekstura 2 Widok 10 Tekstura 1 Monochromatyczna mapa zakodowana w składowych RGBA kliku punktów tekstury Jeden przebieg Jeden render Koszt dopasowania Tekstura 3
Implementacja na GPU Miękka segentacja Pixel Shader Wyznaczenie segmentu danego punktu Zapisane jako wektory kolumnowe Miękkie Segmenty widoku 10 Tekstura 4 Widok 10 Tekstura 1 Wykonywane w n przebiegach Każda linie oddzielnie
Implementacja na GPU Pasowanie segmentów i wyznaczanie głębi Pixel Shader Wyznaczanie najlepszego dopasowania danego punktu Koszt dopasowania Tekstura 3 Miękkie Segmenty widoku 10 Tekstura 4 Wstępna mapa głębi Tekstura 6 Miękkie Segmenty widoku 7 Tekstura 5
Implementacja na GPU Porównanie szybkości algorytmu na CPU i GPU ATI NVIDIA CPU 20x20 20,436 -------- 193,379 30x30 37,628 50,591 383,654 40x40 62,073 89,950 693,675
Dziękuje za uwagę Pytania?