CUDA jako platforma GPGPU w obliczeniach naukowych

Podobne dokumenty
CUDA część 1. platforma GPGPU w obliczeniach naukowych. Maciej Matyka

Programowanie Równoległe Wykład, CUDA praktycznie 1. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie procesorów graficznych GPGPU

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Modelowanie komputerowe dynamiki płynów Maciej Matyka Instytut Fizyki Teoretycznej

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

Programowanie Współbieżne

Programowanie kart graficznych

i3: internet - infrastruktury - innowacje

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Programowanie Równoległe wykład 13. Symulacje komputerowe cieczy LBM w CUDA. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Równoległe wykład 12. OpenGL + algorytm n ciał. Maciej Matyka Instytut Fizyki Teoretycznej

Przetwarzanie Równoległe i Rozproszone

JCuda Czy Java i CUDA mogą się polubić? Konrad Szałkowski

Technologia GPGPU na przykładzie środowiska CUDA

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Modelowanie przepływu krwi przez aortę brzuszną człowieka

Zastosowanie technologii nvidia CUDA do zrównoleglenia algorytmu genetycznego dla problemu komiwojażera

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

CUDA ćwiczenia praktyczne

Libra.cs.put.poznan.pl/mailman/listinfo/skisrkolo.

Nowoczesne technologie przetwarzania informacji

Programowanie kart graficznych

Architektury komputerów Architektury i wydajność. Tomasz Dziubich

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Moc płynąca z kart graficznych

OPIS PRZEDMIOTU/MODUŁU KSZTAŁCENIA (SYLABUS)

Katarzyna Jesionek Zastosowanie symulacji dynamiki cieczy oraz ośrodków sprężystych w symulatorach operacji chirurgicznych.

Od wielkoskalowych obliczeń równoległych do innowacyjnej diagnostyki w kardiologii.

Praca dyplomowa magisterska

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

MMX i SSE. Zbigniew Koza. Wydział Fizyki i Astronomii Uniwersytet Wrocławski. Wrocław, 10 marca Zbigniew Koza (WFiA UWr) MMX i SSE 1 / 16

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

Alternatywne modele programowania równoległego

OpenGL - Open Graphics Library. Programowanie grafiki komputerowej. OpenGL 3.0. OpenGL - Architektura (1)

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie aplikacji równoległych i rozproszonych

Architektura von Neumanna

Raport Hurtownie Danych

GRAFIKA KOMPUTEROWA. Rozwiązania sprzętowe i programowe. Przyspieszanie sprzętowe. Synteza dźwięku i obrazu

Budowa i użytkowanie klastrów w opaciu o układy Cell BE oraz GPU

Zapoznanie z technikami i narzędziami programistycznymi służącymi do tworzenia programów współbieżnych i obsługi współbieżności przez system.

GRAFIKA KOMPUTEROWA. Rozwiązania sprzętowe i programowe. Przyspieszanie sprzętowe. Synteza i obróbka obrazu

CUDA. obliczenia na kartach graficznych. Łukasz Ligowski. 11 luty Łukasz Ligowski () CUDA 11 luty / 36

Obliczenia na GPU w technologii CUDA

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do programowania

Przetwarzanie Równoległe i Rozproszone

Wstęp. Przetwarzanie współbieżne, równoległe i rozproszone

Programowanie procesorów graficznych w CUDA.

HPC na biurku. Wojciech De bski

Architektura komputerów

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

CUDA. cudniejsze przyk ady

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Programowanie procesorów graficznych GPGPU

Przykładowe sprawozdanie. Jan Pustelnik

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tesla. Architektura Fermi

Operacje wejścia/wyjścia odsłona pierwsza

ZARZĄDZANIE PAMIĘCIĄ W TECHNOLOGII CUDA

WIDMOWA I FALKOWA ANALIZA PRĄDU SILNIKA LSPMSM Z WYKORZYSTANIEM OPENCL

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Programowanie kart graficznych. Sprzęt i obliczenia

CUDA obliczenia ogólnego przeznaczenia na mocno zrównoleglonym sprzęcie. W prezentacji wykorzystano materiały firmy NVIDIA (

Akceleracja obliczeń algebry liniowej z wykorzystaniem masywnie równoległych, wielordzeniowych procesorów GPU Świerczewski Ł.

dr inż. Jarosław Forenc

Klasyfikacja systemów komputerowych. Architektura von Neumanna Architektura harwardzka Zmodyfikowana architektura harwardzka. dr inż.

Implementacja modelu FHP w technologii NVIDIA CUDA

Algorytmy dla maszyny PRAM

Programowanie kart graficznych. Kompilator NVCC Podstawy programowania na poziomie API sterownika

Introduction to Computer Science

Programowanie Równoległe wykład 12. Thrust C Maciej Matyka Instytut Fizyki Teoretycznej

Potok graficzny i shadery. Hubert Rutkowski

4 NVIDIA CUDA jako znakomita platforma do zrównoleglenia obliczeń

Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Wstęp do Programowania, laboratorium 02

CUDA PROGRAMOWANIE PIERWSZE PROSTE PRZYKŁADY RÓWNOLEGŁE. Michał Bieńkowski Katarzyna Lewenda

Wydajność otwartych implementacji metody sieciowej Boltzmanna na CPU i GPU

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Dostęp do europejskich systemów obliczeniowych Tier-0 w ramach PRACE

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Podsystem graficzny. W skład podsystemu graficznego wchodzą: karta graficzna monitor

Julia 4D - raytracing

GRAFIKA CZASU RZECZYWISTEGO Wstęp do programowania grafiki czasu rzeczywistego.

Microsoft IT Academy kurs programowania

BADANIE WYDAJNOŚCI ZASTOSOWANIA PLATFORMY CUDA W KOMPUTEROWYM MODELOWANIU RUCHU POJAZDÓW PRT

Politechnika Poznańska, Instytut Informatyki, TWO/GE. Programowanie dla ios

Architektura Komputerów

Programowanie procesorów graficznych do obliczeń ogólnego przeznaczenia GPGPU

Przyspieszanie sprzętowe

Proste algorytmy w języku C

Rola superkomputerów i modelowania numerycznego we współczesnej fzyce. Gabriel Wlazłowski

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Larrabee GPGPU. Zastosowanie, wydajność i porównanie z innymi układami

Programowanie równoległe Wprowadzenie do OpenCL. Rafał Skinderowicz

Programowanie proceduralne w języku C++ Podstawy

Transkrypt:

CUDA jako platforma GPGPU w obliczeniach naukowych Seminarium Grupy Neutrinowej, 12.12.2011 Maciej Matyka, Zbigniew Koza Instytut Fizyki Teoretycznej Uniwersytet Wrocławski

Bariery sprzętowe (procesory) Gdzie jesteśmy?

Rozwój 1985-2004 i dalej? O roku ów

GPU? Specjalizowane układy graficzne?

Obliczenia wysokiej wydajności Superkomputer: Altix 3700, 128 procesorów (Intel Itanium 2) Używana np. w Cyfronet AGH 0.768 TFLOPS mocy obliczeniowej Cena: 1/2 miliona zł!

Superkomputer na biurku? Karta graficzna: GeForce 285 (używana w pokoju 521 w IFT ) 240 procesory CUDA 1.06 TFLOPS mocy obliczeniowej (teoretycznie) Cena: 670zł

Rachunek wydaje się prosty.. 1.38x więcej mocy za 0.134% ceny (+ energia + pomieszczenia + chłodzenie etc.) Zasada zachowania trudności, czyli coś za coś Kartę trzeba jeszcze oprogramować!

GPGPU GPGPU General-purpose computing on graphics processing units

Gdzie umiejscowić GPGPU? SISD Single Instruction Single Data SIMD Single Instruction Multiple Data (MSIMD?) SPMD Single Process Multiple Data MISD Multiple Instruction Single Data MIMD - Multiple Instruction Multiple Data ( http://perilsofparallel.blogspot.com/2008/09/larrabee-vs-nvidia-mimd-vs-simd.html )

Na jakiej platformie programować GPU? Niskopoziomowe API Vertex i Pixel Shaders (OpenGL) Direct Compute (DirectX) CUDA driver API C runtime for CUDA OpenCL Kompilatory PGI OpenACC API wysokiego poziomu

C runtime for CUDA Co to jest CUDA? Compute Unified Device Architecture Platforma programowania GPU (dla kart nvidii) Rozszerzenie języka C (działa również z C++) kompilator (nvcc) zbiór dyrektyw kompilatora i dodatkowych funkcji Np. słowa kluczowe: device, host wyróżniające rodzaj sprzętu na którym implementowana jest funkcja lub dana Np. funkcja: cudamemcpy( ) (kopiowanie pamięci CPU <-> GPU)

CUDA pod Windows Microsoft Visual C++ (2008, 2010) można użyć darmowej wersji Express Sterownik (ze strony Parallel NSIGHT): CUDA Toolkit CUDA SDK nvidia Parallel NSIGHT HOST/MONITOR

CUDA pod LINUX-em Inaczej niż pod Windows nie używamy Parallel Nsight Sterowniki nvidia-current (repozytoria) Cuda Toolkit (biblioteki, pliki nagłówkowe,.so) Po zainstalowaniu kompilacja (plik program.cu): > nvcc program.cu >./a.out

Hello World Pierwszy prosty program w CUDA 1. CPU wywołuje funkcję na GPU Funkcja wstawia do pamięci GPU ciąg Hello world! 2. Kopiujemy dane z GPU do pamięci CPU 3. Dane wypisujemy przy pomocy funkcji i/o (cout etc.)

Hello World Pierwszy prosty program w CUDA 1. CPU wywołuje funkcję na GPU Funkcja wstawia do pamięci GPU ciąg Hello world! 2. Kopiujemy dane z GPU do pamięci CPU 3. Dane wypisujemy przy pomocy funkcji i/o (cout etc.)

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } int main(void) { helloworldondevice <<< 1, 1 >>> (); char napis_host[14]; const char *symbol="napis_device"; cudamemcpyfromsymbol (napis_host, symbol, sizeof(char)*13, 0, cudamemcpydevicetohost); } printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } int main(void) { helloworldondevice <<< 1, 1 >>> (); char napis_host[14]; const char *symbol="napis_device"; cudamemcpyfromsymbol (napis_host, symbol, sizeof(char)*13, 0, cudamemcpydevicetohost); } printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } int main(void) { helloworldondevice <<< 1, 1 >>> (); char napis_host[14]; const char *symbol="napis_device"; cudamemcpyfromsymbol (napis_host, symbol, sizeof(char)*13, 0, cudamemcpydevicetohost); } printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } int main(void) { helloworldondevice <<< 1, 1 >>> (); char napis_host[14]; const char *symbol="napis_device"; cudamemcpyfromsymbol (napis_host, symbol, sizeof(char)*13, 0, cudamemcpydevicetohost); } printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } int main(void) { helloworldondevice <<< 1, 1 >>> (); char napis_host[14]; const char *symbol="napis_device"; cudamemcpyfromsymbol (napis_host, symbol, sizeof(char)*13, 0, cudamemcpydevicetohost); } printf("%s",napis_host);

Hello World #include <stdio.h> #include <cuda.h> device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } int main(void) { helloworldondevice <<< 1, 1 >>> (); char napis_host[14]; const char *symbol="napis_device"; cudamemcpyfromsymbol (napis_host, symbol, sizeof(char)*13, 0, cudamemcpydevicetohost); } printf("%s",napis_host);

Deklaracja funkcji na GPU Funkcja uruchamiana na GPU to kernel (jądro) Zmienne na GPU przedrostek device Preambuła jądra - przedrostek global char napis_device[14]; void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } device char napis_device[14]; global void helloworldondevice(void) { napis_device[0] = 'H'; napis_device[1] = 'e'; napis_device[11] = '!'; napis_device[12] = '\n'; napis_device[13] = 0; } CPU GPU

Wywołanie funkcji na GPU Wywołanie funkcji GPU: funkcja <<< numblocks, threadsperblock >>> ( parametry ); numblocks liczba bloków w macierzy wątków threadsperblock liczba wątków na blok W naszym przykładzie <<<1,1>>> oznaczało uruchomienie jądra na jednym wątku który zawierał się w jednym jedynym bloku macierzy wątków.

numblocks, threadsperblock <<< 1, 1 >>> <<< 1, 4 >>> <<< 4, 1 >>> <<< dim3(3,2,1), 4 >>>

A tak to widzi nvidia CUDA Programming Guide 3.2 <<< dim3(3,2,1), dim3(4,3,1) >>>

Hello World wielowątkowo 1. CPU wywołuje funkcję na GPU Funkcja wstawia do pamięci GPU ciąg Hello world! jedna litera na jeden wątek! (pomoc: P. Czubiński)

Hello World wielowątkowo jedna litera na jeden wątek stwórzmy 14 bloków po 1 wątku Każdy wątek widzi swój numer i numer bloku Numer bloku -> miejsce w tablicy do skopiowania

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: idx constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) { int idx = blockidx.x; napis_device[idx] = hw[idx]; } helloworldondevice <<< 14, 1 >>> (); zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: idx constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) { int idx = blockidx.x; napis_device[idx] = hw[idx]; } helloworldondevice <<< 14, 1 >>> (); zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: idx constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) { int idx = blockidx.x; napis_device[idx] = hw[idx]; } helloworldondevice <<< 14, 1 >>> (); zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

Hello World wielowątkowo Jądro dla hello world w wersji wielowątkowej: idx constant device char hw[] = "Hello World!\n"; device char napis_device[14]; global void helloworldondevice(void) { int idx = blockidx.x; napis_device[idx] = hw[idx]; } helloworldondevice <<< 14, 1 >>> (); zawiera numer bloku w którym znajduje się wątek mapowanie blok/wątek -> fragment problemu wątek z idx-ego bloku kopiuje idx-ą literę napisu Kopiowanie GPU-GPU (bez sensu, ale chodzi nam o najprostszy problem)

W praktyce

Modele ośrodków porowatych P=0.4 P=0.7 Ogromne układy (miliony komórek obliczeniowych).

Przykład rozwiązania P=0.4, T=1.7 P=0.7, T=1.28

Model gazu sieciowego LGA Uproszczenie: model gazu sieciowego opisany przez U. Frisha, B. Hasslachera i Y. Pomeau gaz FHP Rys. Kolizje w modelu FHP5 1) Transport 2) Kolizje U. Frish, B. Hasslacher, Y. Pomeau 1986 Lattice-Gas Automata for the Navier-Stokes Equation, Phys. Rev. Lett. 56, 1505 1508. Matyka, M. and Koza, Z., Spreading of a density front in the Kuentz-Lavallee model of porous media J. Phys. D: Appl. Phys. 40, 4078-4083 (2007)

Metoda gazu sieciowego Boltzmanna Historycznie wprowadzona jako rozwinięcie LGA Zmienne ni (0,1) zastąpione funkcją rozkładu

Podstawowy Algorytm LBM Podstawowy algorytm LBM to dwa kroki: kolizji: transportu: Lokalność!

512 x 512 Przykład działania LBM na CUDA CPU stoi. GPU w tym czasie.. (przykład cpu, gpu)

Hydrodynamika cząstek rozmytych 1. Lagrangian Fluid Dynamics, Using Smoothed Particle Hydrodynamics, Micky Kelager, 2006 2. http://pl.wikipedia.org/wiki/sph) Podejście Lagrange a (ruchome punkty) Każda cząstka reprezentuje pewną objętość cieczy Wielkości fizyczne interpolowane po sąsiadach Gdzie Wij jest tytułowym rozmyciem np.

Rys. Algorytm SPH na CUDA (GTX285). (w działaniu)

Rys. Skalowanie algorytmów LBM i SPH na karcie GTX 285 względem jednego rdzenia CPU.

Łyżka dziegciu ( ) we perform a rigorous performance analysis and find that after applying optimizations appropriate for both CPUs and GPUs the performance gap between an Nvidia GTX280 processor and the Intel Core i7 960 processor narrows to only 2.5x on average. ( )

Analiza wydajności CPU / GPU Przypadek testowy: driven cavity 3d Porównanie czasów określonej liczby iteracji Kody: Palabos (MPI) i Sailfish (CUDA) Rys: Wizualizacja przepływu przez trójwymiarową komorę wyznaczonego kodem Sailfish dla liczby Reynoldsa Re=100. Matyka, M., Miroslaw, Ł., Koza,Z., Wydajność otwartych implementacji metody sieciowej Boltzmanna na CPU i GPU, (KOWBAN) XVIII (2011)

Wydajność Sailfish / Palabos Czas wykonania 30000 kroków na 4xCPU i GPU (Gtx460 i Tesla). Matyka, M., Miroslaw, Ł., Koza,Z., Wydajność otwartych implementacji metody sieciowej Boltzmanna na CPU i GPU, (KOWBAN) XVIII (2011)

Przyszłość? Niskopoziomowe API Vertex i Pixel Shaders (OpenGL) Direct Compute (DirectX) CUDA driver API C runtime for CUDA OpenCL Kompilatory PGI OpenACC (Listopad 2011)? API wysokiego poziomu

Czym się zajmujemy? Grant MNiSW Grant N N519 437939 Projekt Zielony Transfer (Vratis Sp. z o.o.) akceleracja CFD na GPU Duda, A., Koza, Z. and Matyka, M. Hydraulic tortuosity in arbitrary porous media flow Phys. Rev. E 84, 036319 (2011) Malecha, Z., Miroslaw, L., Tomczak, T., Koza, Z., Matyka, M., Tarnawski, W., Szczerba, D., GPU-based simulation of 3D blood flow in abdominal aorta using OpenFOAM Arch. Mech. Vol. 63 No. 2 pp. 137-161 (2011) Matyka, M., Miroslaw, L., Koza,Z. Performance of open source implementations of the Lattice Boltzmann methods on CPU and GPU (polish), The computer-aided scientific research (KOWBAN) XVIII (2011) Koza, Z., Matyka, M., Szkoda, S., Miroslaw, L., Pola, J., Application of GPGPU technology to computational science (polish), The computer-aided scientific research (KOWBAN) XVIII (2011)

Dziękuję za uwagę