Programowanie aplikacji równoległych i rozproszonych

Podobne dokumenty
Programowanie kart graficznych

Programowanie procesorów graficznych GPGPU

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 procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

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

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

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

CUDA ćwiczenia praktyczne

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

i3: internet - infrastruktury - innowacje

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

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

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

Organizacja pamięci w procesorach graficznych

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

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

Przetwarzanie Równoległe i Rozproszone

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

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

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

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

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

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

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

Programowanie CUDA informacje praktycznie i. Wersja

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

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Tesla. Architektura Fermi

Programowanie kart graficznych

Programowanie PKG - informacje praktycznie i przykłady. Wersja z Opracował: Rafał Walkowiak

Moc płynąca z kart graficznych

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

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

Programowanie CUDA informacje praktycznie i przykłady. Wersja

Programowanie kart graficznych. Sprzęt i obliczenia

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Architektura mikroprocesorów TEO 2009/2010

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

Budowa komputera Komputer computer computare

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Programowanie procesorów graficznych GPGPU

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Podstawy Informatyki Systemy sterowane przepływem argumentów

Wydajność programów sekwencyjnych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

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

Programowanie kart graficznych. Architektura i API część 1

Dr inż. hab. Siergiej Fialko, IF-PK,

Metody optymalizacji soft-procesorów NIOS

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

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

Programowanie współbieżne Wprowadzenie do programowania GPU. Rafał Skinderowicz

16. Taksonomia Flynn'a.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Procesory kart graficznych i CUDA wer

CUDA. cudniejsze przyk ady

Programowanie procesorów graficznych w CUDA.

Energooszczędne programowanie

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

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

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

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

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

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.

Język ludzki kod maszynowy

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

Podstawy. Pamięć wirtualna. (demand paging)

5. Model komunikujących się procesów, komunikaty

Architektura komputerów

Programowanie kart graficznych. Architektura i API część 2

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Praca dyplomowa magisterska

Podstawy Programowania C++

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy programowania w języku C++

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Obliczenia na GPU w technologii CUDA

Jacek Matulewski - Fizyk zajmujący się na co dzień optyką kwantową i układami nieuporządkowanymi na Wydziale Fizyki, Astronomii i Informatyki

Projektowanie. Projektowanie mikroprocesorów

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Procesory. Schemat budowy procesora

Architektura von Neumanna

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

Optymalizacja skalarna. Piotr Bała. Wykład wygłoszony w ICM w czercu 2000

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Podstawy programowania komputerów

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

PROE wykład 9 C++11, rzutowanie, optymalizacja. dr inż. Jacek Naruniec

POLITECHNIKA WARSZAWSKA Wydział Elektroniki i Technik Informacyjnych. Instytut Telekomunikacji Zakład Podstaw Telekomunikacji

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

I - Microsoft Visual Studio C++

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Programowanie współbieżne Wykład 2. Iwona Kochańska

Transkrypt:

Programowanie aplikacji równoległych i rozproszonych Dr inż. Krzysztof Rojek krojek@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska

Strumienie operacji na GPU Domyślne API: Kernele wykonują się asynchronicznie względem CPU Transfery danych (D2H, H2D) blokują CPU Funkcje CUDA wykonują się synchronicznie względem siebie Strumień sekwencja operacji wykonywanych w uporządkowanej kolejności (issiue-order) Operacje przydzielone do różnych strumieni mogą nachodzić na siebie w czasie Kernele i transfery danych mogą wykonywać się jednocześnie jeżeli są przydzielone do różnych strumieni Strumienie i funkcje asynchroniczne umożliwiają: Asynchroniczne transfery danych (D2H, H2D) względem CPU Możliwość wykonywania kilku kerneli i transferów danych równolegle

Alokacja pamięci bez stronicowania Pamięć bez stronicowania (pinned (non-pageable) memory, page locked memory) umożliwia asynchroniczne kopiowanie danych względem CPU i GPU Zarządzanie pamięcią: cudahostalloc / cudafreehost Zamiast new / delete Alokacja odbywa się z poziomu CPU cudahostalloc jest zazwyczaj bardzo kosztowną operacją

Jednoczesny transfer danych z obliczeniami Wymagania: Transfery D2H lub H2D muszą odbywać się z wykorzystaniem pamięci bez stronicowania Urządzenie musi wspierać compute capability 1.1 Kernel i transfery danych muszą być przydzielone do różnych, niezerowych strumieni Przykład kodu: cudastream_t stream1, stream2; cudastreamcreate(&stream1); cudastreamcreate(&stream2); cudamemcpyasync( dst, src, size, dir, stream1 ); kernel<<<grid, block, 0, stream2>>>( ); cudastreamdestroy(stream1); cudastreamdestroy(stream2);

Techniki optymalizacji kodu dla GPU Podstawowe czynniki ograniczające wydajność kodu dla GPU Dostęp do pamięci globalnej karty graficznej (memory optimization) Instrukcje arytmetyczno-logiczne (instruction optimization) Konfiguracja obliczeń (configuration optimization) Podstawowe sposoby poprawy wydajności: Dokonanie odpowiednich pomiarów w celu zlokalizowania wąskich gardeł kodu: Efektywnej przepustowości do pamięci Zajętości karty graficznej Transferu danych między pamięcią hosta a pamięcią GPU Liczby przetwarzanych instrukcji w czasie Iteracyjne eliminowanie wąskich gardeł

Optymalizacje dostępu do pamięci Niezbędne, gdy: kod jest ograniczony dostępem do pamięci uzyskana przepustowość do pamięci jest dużo niższa niż przepustowość maksymalna Podstawowe sposoby optymalizacji: Pobieranie tylko tych danych, które są absolutnie niezbędne Redukcja wielokrotnego dostępu do tych samych danych (wykorzystanie pamięci wspólnej) Zapewnienie dostępu do danych w trybie łączonym (coalescing memory access) Zapewnienie dostępu wątkom w obrębie jednego warpa do ciągłego obszaru w pamięci Wątki w obrębie jednego warpa powinny odwoływać się do danych o rozmiarze będącym wielokrotnością 128B linijki pamięci L1 cache (np. 1 wątek pobiera 1 element typu float) Należy zapewnić dopasowanie adresu dla każdego warpa do granicy 128B

Wyłączenie cacheowania dostępów do pamięci globalnej Domyślnie wszystkie odwołania do pamięci globalnej karty graficznej są cacheowane w pamięci L1 i L2 Wyłączenie cacheowania w pamięci L1 może być wykonane flagą -Xptxas -dlcm=cg kompilatora nvcc Przy wyłączonym cachowaniu, kryteria uzyskania dostępu do danych w trybie łączonym (coalescing) są takie same, ale rozmiar dostępu do danych może być zredukowany do 32B

Odwołania do pamięci globalnej w trybie łączonym Transpozycja danych (Array Of Structures na Structure Of Arrays) struct Data { int a, b, c; }; Data AOS[10]; //a0 b0 c0 a1 b1 c1... struct Data { int a[10], b[10], c[10]; }; Data SOA; //a0 a1 a2 b0 b1 c2... Padding zapewnienie wyrównania adresów w każdym wierszu macierzy int size = 200; int align = 128; int realsize = (size*sizeof(float)+align-1)/align*align; float tab[size*realsize]; Wykorzystanie pamięci wspólnej do zredukowania odwołań do pamięci globalnej Wykorzystanie pamięci textur dla danych, które nie mogą być dopasowane

Zajętość karty graficznej Zajętość karty graficznej (occupancy): stosunek aktywnych warpów na multiprocesor strumieniowy (SM) do maksymalnej liczby warpów wspieranej przez architekturę (dla Fermi: 48) Zajętość karty jest ograniczona przez architekturę GPU (rejestry, pamięć wspólną, ) Im większa zajętość tym więcej można ukryć opóźnień wynikających z zależności między instrukcjami lub dostępu do pamięci

Zwiększanie zajętości GPU Informacje dotyczące wykorzystania zasobów karty graficznej: Na etapie kompilacji: -Xptxas -v Na etapie wykonania: CUDA Visual profiler (nvvp) profiler zainstalowany lokalnie lub połączenie ssh -Y Wyznaczenie zajętości GPU może zostać dokonane za pomocą kalkulatora NVIDII: CUDA Occupancy calculator Ograniczenie wykorzystania rejestrów: Flaga --maxrregcount=n dla kompilatora nvcc Definiowanie kernela z wykorzystaniem launch_bounds - informacje dla kompilatora, które mogą przyczynić się do zmniejszenia zapotrzebowania na rejestry global void launch_bounds (x, y) kernel(); x rozmiar bloku y liczba jednocześnie ładowanych bloków

Optymalizacje instrukcji (1/2) Redukcja liczby wykonywanych instrukcji Eliminacja automatycznej konwersji pomiędzy typami double i float (literały x.y są domyślnie typu double, x są domyślnie typu int); float a; a=a+1.0; // rzutowanie a na double, sumowanie double+double, rzutowanie sumy na float float a; a=a+1.0f; // sumowanie float+float Operacje dzielenia i modulo są bardzo kosztowne: Dzielenie przez 2^n można zastąpić: >> n Modulo 2^n można zastąpić & (2^n 1) Dwa typy funkcji matematycznych: func(): wolniejsza ale bardziej dokładna func(): szybsza ale mniej dokładna Flaga -use_fast_math: wymuszenie by każda funkcja func() była traktowana jako func()

Optymalizacje instrukcji (2/2) Rozbieżne rozgałęzienia (divergent branches): Występują, gdy wątki w obrębie tego samego warpa wykonują różną ścieżkę instrukcji np. if (threadidx.x > 2) {...} else {...} Każde z takich rozgałęzień wykonywane jest sekwencyjnie Przykład uniknięcia rozbieżnych rozgałęzień: if (threadidx.x / WARP_SIZE > 2) {...} else {...} Pomiar liczby rozbieżnych rozgałęzień podczas wykonania algorytmu a.out: nvprof --events divergent_branch./a.out

Transfer pomiędzy CPU i GPU Transfer danych pomiędzy hostem i urządzeiem ma dużo mniejszą przepustowość niż pamięć globalna GPU 8 GB/s PCIe 2.0, 16 GB/s PCIe 3.0, do 288 GB/s NVIDIA GeForce GTX Titan Minimalizacja transferu: Dane tymczasowe przechowywać bezpośrednio w pamięci GPU Czasem lepszym rozwiązaniem jest kilkukrotne wykonanie tych samych obliczeń, niż przechowywanie ich w pamięci hosta Grupowanie transferów Jeden duży transfer jest znacznie bardziej wydajny niż wiele małych: dla 10 mikrosekund opóźnienia i przepustowości 8 GB/s opóźnienie zajmuje więcej czasu niż transfer danych o rozmiarze < 80 KB

Pytania?