i3: internet - infrastruktury - innowacje Wykorzystanie procesorów graficznych do akceleracji obliczeń w modelu geofizycznym EULAG Roman Wyrzykowski Krzysztof Rojek Łukasz Szustak [roman, krojek, lszustak]@icis.pcz.pl Politechnika Częstochowska
Agenda Model geofizyczny EULAG Motywacja Architektura GPU: NVIDIA Tesla C1060 ATI Radeon HD 5870 OpenCL - innowacyjny standard dla architektur wielordzeniowych Perspektywy zrównoleglenia modelu EULAG Wyniki wydajnościowe Podsumowanie
Model geofizyczny EULAG (1/3) EULAG jest uznanym modelem rozwiązującym równania płynu w skalach od mikro do gwiezdnej Ojcem EULAGa jest dr Piotr K. Smolarkiewicz, National Center of Atmospheric Research, Boulder, CO, USA Model ten jest narzędziem do wykonywania eksperymentów numerycznych w laboratorium, które umożliwia symulację zmieniającego się w czasie modelu geometrycznego Kod EULAGa stwarza duże możliwości adaptacji do nowoczesnych architektur wielordzeniowych, wieloprocesorowych, akceleratorów oraz hybrydowych architektur równoległych Jednym z ciekawszych zastosowań EULAGa jest model prognozowania pogody
Model geofizyczny EULAG (2/3) EULAG znajduje szerokie zastosowanie w takich dziedzinach jak: obszary zawirowań atmosferycznych (areas of turbulence) przepływy miejskie (urban flows) dynamika fal grawitacyjnych (gravity wave dynamics) mikro-meteorologia (micrometeorology) mikrofizyka i dynamika chmur (cloud microphysics and dynamics) prądy oceaniczne (ocean currents) globalne zjawiska atmosferyczne
Model geofizyczny EULAG (3/3) Symulacja przepływu powietrza wokół Pentagonu (źródło: http://eulag.pl/)
Motywacja Współczesne karty graficzne to wielordzeniowe architektury o wydajności rzędu kilku Tflops/s GPU umożliwia tworzenie wielu tysięcy wątków, co w znaczny sposób wpływa na zwiększenie wydajności kodów równoległych Dostępne standardy programowania, takie jak OpenCL, i CUDA umożliwiają wykorzystanie GPU do obliczeń ogólnego przeznaczenia (GPGPU) Wykorzystanie GPU do obliczeń jest stosunkowo tanim rozwiązaniem, ponieważ większość komputerów je posiada
Architektura: NVIDIA Tesla C1060 (1/2) 10 klastrów przetwarzających (processing clusters) 3 jednostki obliczeniowe (compute units) na klaster 8 elementów przetwarzających (processing elements) na jednostkę = 240 elementów przetwarzających 1296 MHz częstotliwość jednostek 16 KB pamięci lokalnej (local memory) 64 KB pamięci stałej (constant buffer) 4 GB pamięci globalnej (global memory) 102.4 GB/s przepustowości pamięci globalnej Wydajność = 240 * 1.296 * 2 (MADD) = 0.622 Tflops/s 0.622 Tflops/s dla pojedynczej precyzji
Architektura: NVIDIA Tesla C1060 (2/2)
Architektura: ATI Radeon HD 5870 (1/2) 20 jednostek obliczeniowych 16 elementów przetwarzających na jednostkę 5 procesorów strumieniowych na element = 1600 procesorów strumieniowych 850 MHz częstotliwość jednostek 32 KB pamięci lokalnej 64 KB pamięci stałej 1 GB pamięci globalnej 153.6 GB/s przepustowości pamięci globabalnej Wydajność = 1600 * 0.850 * 2 (MADD) = 2.72 Tflops/s 2.72 Tflops/s dla pojedynczej precyzji
Architektura: ATI Radeon HD 5870 (2/2)
OpenCL - innowacyjny standard dla architektur wielordzeniowych (1/2) OpenCL (Open Computing Language) - otwarty, bezpłatny standard programowania równoległego w heterogenicznym systemie komputerowym Zawiera w sobie język programowania oraz API umożliwiające kontrolę nad poszczególnymi urządzeniami Wspomaga pisanie aplikacji wieloplatformowych, składających się z różnego rodzaju jednostek obliczeniowych (m.in. CPU, GPU, procesory Cell) Umożliwia tworzenie przenośnego kodu pomiędzy różnymi urządzeniami
OpenCL - innowacyjny standard dla architektur wielordzeniowych (2/2) Host jest połączony z co najmniej jednym urządzeniem obliczeniowym (Compute Devices) Urządzenie obliczeniowe składa się ze zbioru jednostek obliczeniowych (Compute Units) Jednostki obliczeniowe zawierają elementy przetwarzające (Processing Elements), które realizują zadania zgodnie z metodologią SIMD lub SPMD Kernel jest odpowiednikiem funkcji napisanej w języku C jest wykonywany na urządzeniu obliczeniowym uruchomione kernele tworzą wątki (work-items) wątki są pogrupowane w grupy (work-groups) synchronizacja możliwa jest pomiędzy wątkami, które należą do tej samej grupy, natomiast wątki w różnych grupach nie są ze sobą synchronizowane
OpenCL: hierarchia pamięci (1/2) Każdy wątek ma dostęp do własnej pamięci prywatnej Dostęp do pamięci lokalnej mają wątki z danej grupy Dostęp do pamięci globalnej i pamięci stałej mają wszystkie wątki Pamięć hosta jest pamięcią, do której wątki nie mają bezpośredniego dostępu Aby wątki mogły uzyskać dostęp do danych zawartych w pamięci hosta, należy: przenieść dane z pamięci hosta do pamięci globalnej a następnie do pamięci lokalnej
OpenCL: hierarchia pamięci (2/2)
Perspektywy zrównoleglenia modelu EULAG (1/2) Nasza implementacja bazuje na następującym fragmencie modelu EULAG: if(j<m && i<n) for(k=0; k<l; ++k) x(i, j, k)-= ( f1(i+1, j, k)-f1(i, j, k) +f2(i, j+1, k)-f2(i, j, k) +f3(i, j, k+1)-f3(i, j, k) )/h(i, j, k); gdzie f1, f2, f3 są obliczane na podstawie schematu donor-cell: #define donor(y1,y2,a)(fdim(a,0.0f)*(y1)-fdim(0.0f,a)*(y2)) dim zwraca x - y jeżeli x > y, 0 jeżeli x y
Perspektywy zrównoleglenia modelu EULAG (2/2) Algorytm został zrównoleglony w dwóch wymiarach dla rozmiaru grupy n x m W celu uniknięcia zależności między grupami, poszerzyliśmy każdą grupę (work-group) o dodatkowe obliczenia 0,0 0,1...0,n-1 1,0 0,n 0,n+1...0,2n-1 1,n 0,0 1 20,1...0,n-1...n-1 1,0 2 0,n n 0,n n 0,n+1...0,2n-1...2n-1 1,n 1 2 0,2n m-1,0 m,0 m,1...m,n-1 m+1,0 2m-1,0 m-1,n m,n m,n+1..m,2n-1 m+1,n 2m-1,n m-1,0 m m,0 m m,0 0 1 2 m,1...m,n-1...n-1 m+1,0 1 2 2m-1,0 m m,n n m-1,n m m,n m m,n n n+1 m,n+1..m,2n-1...2n-1 m,2n m+1,n 1 2 2m-1,n m 2m,0 m 2m,n m
Autotuning (1/2) Optymalizacja kodu dla różnych architektur GPU oparta jest o technikę autotuning Autotunig jest techniką automatycznej adaptacji algorytmu do wybranych cech architektury np: liczby jednostek obliczeniowych liczby elementów przetwarzających rozmiaru jednostek wektorowych rozmiaru poszczególnych pamięci
Autotuning (2/2) Nasz autotuning składa się z dwóch kroków: zebranie informacji o danej architekturze za pośrednictwem OpenCL API - rezultaty otrzymywane są natychmiastowo informacje o dostępnych zasobach sprzętowych poszukiwanie i generowanie najlepszej konfiguracji dla algorytmu w oparciu o informacje z kroku pierwszego - krok ten jest czasochłonny poszukiwane są: rozmiar grupy, rozmiar pamięci lokalnej...
Wyniki wydajnościowe (1/2) Testy zostały przeprowadzone na następującym sprzęcie: CPU AMD Phenom(tm) II X4 955-1 rdzeń GPU NVIDIA Tesla C1060 - Linux GPU ATI Radeon HD 5870 - Windows
Wyniki wydajnościowe (2/2) CPU NVIDIA Tesla ATI Radeon czas kernela [s] 0.75 0.041 0.039 przyśpieszenie 1 18.29 19.23 przepustowość [GB/s] - 2.57092 1.35215 czas kernela + czas odbierania danych [s] - 0.06 0.08 przyśpieszenie - 12.5 9.38 czas kernela + czas wysyłania danych + czas odbierania danych [s] przyśpieszenie - 0.16 0.27-4.68 2.78 wykorzystanie pamięci [MB] 514.016 584.543 584.543
Podsumowanie Czas wykonania testów na kartach graficznych był krótszy niż na procesorze: kernel wykonywany na GPU charakteryzował się znacznym przyśpieszeniem w porównaniu do CPU czas komunikacji był większy niż czas obliczeń W przeprowadzonych testach: ATI 5870: najlepszy czas kernela, mała przepustowość NVIDIA Tesla C1060: dobry czas kernela, dobra przepustowość (ok 65% maksymalnej przepustowości) Nasz kod może być uruchamiany na różnych kartach graficznych Kod jest w trakcie optymalizacji zarówno pod względem komunikacji, jak i obliczeń
i3: internet - infrastruktury - innowacje Dziękujemy za uwagę!