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

Podobne dokumenty
Programowanie kart graficznych

Programowanie Współbieżne

Programowanie aplikacji równoległych i rozproszonych

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

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

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

Programowanie procesorów graficznych w CUDA.

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

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

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

Programowanie procesorów graficznych GPGPU

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

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

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

Obliczenia na GPU w technologii CUDA

Programowanie CUDA informacje praktycznie i. Wersja

i3: internet - infrastruktury - innowacje

Programowanie kart graficznych

CUDA. cudniejsze przyk ady

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

Przetwarzanie Równoległe i Rozproszone

Tesla. Architektura Fermi

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

Programowanie procesorów graficznych GPGPU

CUDA ćwiczenia praktyczne

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

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

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

Programowanie CUDA informacje praktycznie i przykłady. Wersja

Procesory kart graficznych i CUDA wer

Architektura komputerów

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

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

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

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

Lab 9 Podstawy Programowania

Programowanie kart graficznych. Sprzęt i obliczenia

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

Procesory kart graficznych i CUDA wer

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

Moc płynąca z kart graficznych

Organizacja pamięci w procesorach graficznych

ZARZĄDZANIE PAMIĘCIĄ W TECHNOLOGII CUDA

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

Praca dyplomowa magisterska

1 Podstawy c++ w pigułce.

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

Procesory kart graficznych i CUDA wer PR

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

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

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

Metody optymalizacji soft-procesorów NIOS

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Dodatek A. CUDA. 1 Stosowany jest w tym kontekście skrót GPCPU (od ang. general-purpose computing on graphics processing units).

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

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Procesory kart graficznych i CUDA

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

Zrównoleglenie i przetwarzanie potokowe

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

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

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Architektura komputerów

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

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

Programowanie współbieżne i rozproszone

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

System pamięci. Pamięć podręczna

Raport Hurtownie Danych

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Wskaźniki w C. Anna Gogolińska

GTX260 i CUDA wer

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Stałe, tablice dynamiczne i wielowymiarowe

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

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

Wykorzystanie architektury Intel MIC w obliczeniach typu stencil

Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Budowa komputera Komputer computer computare

Wstęp do informatyki. System komputerowy. Magistrala systemowa. Architektura komputera. Cezary Bolek

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Komputer. Komputer (computer) jest to urządzenie elektroniczne służące do zbierania, przechowywania, przetwarzania i wizualizacji informacji

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Budowa Mikrokomputera

Architektura mikroprocesorów TEO 2009/2010

16. Taksonomia Flynn'a.

Lock Manager Deadlock Źródła Jak starczy czasu. Dreadlocks. Konrad Błachnio MIMUW 19 maja 2010

Architektura komputerów

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

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

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

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

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

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Transkrypt:

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

Plan 1 Ogólne wrażenia 2 Obliczenia na kartach - wstęp 3 Wprowadzenie 4 CUDA Łukasz Ligowski () CUDA 11 luty 2008 2 / 36

GPU - CPU transfer przez PCIe 4+4 GBps (z chipsetem NVIDII 5+5), karta może jedynie ściągać lub wysyłać dane. W miarę łatwo daje się osiągnać transfer ponad 4GBps. Na nowszych kartach (compute capability 1.1) można liczyć i jednocześnie robić transfer pamięci, niestety NVIDIA Tesla na razie są compute capability 1.0. podział zadań, chcielibyśmy aby jak najwięcej wydelegować na GPU. problemy: zadanie nie mieści się w pamięci karty nie da sie wystarczająco szybko wyciągać wyników z karty lub ich wysyłać (dla compute capability 1.1 jest to mniejszy problem), załadowanie Tesli do pełna to około 0.3-0.4 sekundy kiedy karta nic nie liczy... efektywny transfer do GPU wymaga wysyłania danych w większych paczkach (MB), nie zawsze da się to zrobić Łukasz Ligowski () CUDA 11 luty 2008 3 / 36

Pamięć karty memory wall, nadal jest mało: max 1.5 GB (Tesla) lub 756MB/1GB (zwykłe karty), (zwłaszcza jeśli przyszłe karty mają używać double) wektory pomocnicze, obliczenia na karcie są prawie wektorowe, i ze względu na to ze czasami chcielibyśmy skorzystać z tego podejścia i tworzyć wektory pomocnicze żeby uzyskać wysoką wydajność ale dla dużych rozmiarów danych może być to problematyczne czytanie/pisanie odbywa sie po tej samej magistrali czyli 80-100GBps przepustowości do pamięci które jest dostępne powinno się podzielić minimum przez dwa jeśli mamy operację np. A[i] = B[i] + 1 Jeśli wątki nie czytają spójnego kawałka pamięci wydajność czytania istotnie spada Łukasz Ligowski () CUDA 11 luty 2008 4 / 36

Pomiar wydajności gflopy vs GBps ilość Gflopów/s nic nie mówi o wydajności (nie znamy narzutów i pracy niezbędnej do wykonania zadania), pomiar ilości przetworzonych danych jest o wiele lepszą metryką o wiele łatwiej być ograniczonym przez transfer na karcie niż przez jej możliwości obliczeniowe (z poprzedniego seminarium:) 2 000 000 operacji atomowych/sekunda, 2 000 000 4 3 = 24 Mbps, dla porównania można łatwo osiągnąć 60GBps Łukasz Ligowski () CUDA 11 luty 2008 5 / 36

GPU z punktu widzenia użytkownika prawie wektoryzacja, większa swoboda w stosowaniu instrukcji warunkowych wewnątrz pętli i nie tylko próba implementacji czegokolwiek bardziej skomplikowanego powoduje że szybko pojawiają sie ograniczenia rejestry/blok multiprocesor posiada 8192 rejestry i może wykonywać 756 wątków czyli jeśli chcemy w pełni wykorzystać kartę mamy około 10 rejestrów na wątek, kompilator słabo optymalizuje wykorzystanie rejestrów, słabo obsługuje opcję maxregisters, można robić sztuczki w celu obniżenia ilości rejestrów, (jeśli dzięki temu uda się upchnąć więcej bloków poprawiamy transfer do pamięci) shared memory jw. 32 kilobajty na multiprocesor czyli 8192 int y, trochę lepiej niż rejestry Łukasz Ligowski () CUDA 11 luty 2008 6 / 36

GPU ciąg dalszy Jeśli chce się osiągnąć większą wydajność niż szybkość magistrali trzeba używać cache u. Dlaczego? Karta ma 300Gflop/s czyli trzeba przeczytać co najmniej 300 4 2 = 2400Gbps bajtów pamięci, a wydajność magistrali to 80-100Gbps zlecenie wykonania kernela obliczeniowego na karcie ma niewielki narzut Łukasz Ligowski () CUDA 11 luty 2008 7 / 36

Klastrowanie kart farming (dużo kart/komputerów robiących to samo z minimalną komunikacją) potencjalnie niska skalowalność dla zadań z intensywną komunikacją pomiędzy kartami: GPU - synchronizacja + narzuty na uruchamianie kerneli - CPU - LAN - CPU - GPU zadania typu embarssingly parallel są OK mapreduce jest OK(?) Łukasz Ligowski () CUDA 11 luty 2008 8 / 36

Moc GPU Rysunek: Źródło: NVIDIA CUDA Programming Guide Łukasz Ligowski () CUDA 11 luty 2008 9 / 36

NVIDIA CUDA Compute Unified Device Architecture Środowisko programistyczne udostępnione przez firmę NVIDIA które umożliwia dostęp do procesorów karty graficznej. Główne cechy: Różne warstwy abstrakcji do wyboru Programy można pisać w nieco rozszerzonym C wykorzystując dwie biblioteki realizujące dostęp do sprzętu i/lub można wykorzystać assembler PTX. Dostępność Dostępna dla kart z serii 8xxx i nowszych, Windows/Linux, gwarantowana kompatybilność z następnymi generacjami kart. Łukasz Ligowski () CUDA 11 luty 2008 10 / 36

ATI CTM Close to Metal Biblioteka umożliwiająca wykorzystanie kart ATI/AMD do celów obliczeniowych. Ze względu na to, że nie używamy żadnych kart ATI, Close to Metal nie będzie omawiana. ;) Łukasz Ligowski () CUDA 11 luty 2008 11 / 36

Skąd się biorą Gigaflopy? Rysunek: Źródło: NVIDIA CUDA Programming Guide Karty osiągają większą wydajność ponieważ rezygnują z cache a i skomplikowanej kontroli wykonania na rzecz dużej ilości prostych elementów obliczeniowych. Łukasz Ligowski () CUDA 11 luty 2008 12 / 36

Karta z serii 8xxx Jak wygląda sprzęt Łukasz Ligowski Rysunek: () Źródło: NVIDIACUDA Programming Guide11 luty 2008 13 / 36

Karta z serii 8xxx Z punktu widzenia programisty Rysunek: Źródło: NVIDIA CUDA Programming Guide Łukasz Ligowski () CUDA 11 luty 2008 14 / 36

Karta z serii 8xxx Model podziału na elementy wykonawcze... Rysunek: Źródło: NVIDIA CUDA Programming Guide Łukasz Ligowski () CUDA 11 luty 2008 15 / 36

Ogranizacja CUDY Od tej pory zajmujemy się NVIDIA CUDA Rysunek: Źródło: NVIDIA CUDA Programming Guide Łukasz Ligowski () CUDA 11 luty 2008 16 / 36

Uwagi ogólne #include <cuda_runtime_api.h> nvcc --host-compilation c -lcudart *.c Nazwy funkcji cudy zaczynaja sie od cuda Podzial na kod i dane znajdujace sie na CPU i GPU. Wiekszosc funkcji cudy zwraca cudasuccess jesli wykonaja sie poprawnie Koniecznosc synchronizacji pomiedzy karta a procesorem Łukasz Ligowski () CUDA 11 luty 2008 18 / 36

Inicjalizacja karty Wybor karty Przed rozpoczeciem obliczen nalezy wybrac karte (jesli jest wiecej niz jedna) Warto sprawdzic czy zamiast karty nie liczymy na CUDA CPU Emulation. cudasetdevice() cudagetdevicecount() cudagetdeviceproperties() Łukasz Ligowski () CUDA 11 luty 2008 20 / 36

Zarzadzanie pamiecia karty Arytmetyka wskaznikowa Alokacja Pamiec na karcie mozna alokowac jedynie z CPU - alokujemy cala pamiec karty przed rozpoczeciem obliczen (wykonania kernela) a potem obliczamy odpowiednie adresy. Wskazniki Przestrzen adresow jest ciagla. Komunikacja CPU - GPU Osobne funkcje do transferu danych. Obliczenia i transfery nalezy zsynchronizowac (compute capability 1.1) cudamalloc() cudafree() cudamallochost() cudafreehost() cudamemcpy() cudamemcpyasync() Łukasz Ligowski () CUDA 11 luty 2008 22 / 36

Uruchamianie zadań na karcie - kernele Co to jest kernel? Kernel to funkcja poprzedzona kwalifikatorem global global void funkcja(uint1* in, uint1* out, int size){ int i = blockidx.x * blockdim.x + threadidx.x, int step = griddim.x*blockdim.x; int j; }; for (; i < size; i += step){ out[i] = 2 * in[i]; }; Łukasz Ligowski () CUDA 11 luty 2008 24 / 36

Kernele c.d. Wywolanie na CPU cudamalloc( (void**)&d_word_address, 2 * size * sizeof(int)); uint1* in = (uint1*)(d_word_address); uint1* out = (uint1*)(d_word_address + size); cudamemcpy( (void*)in, tablica, rozmiar * sizeof(int), cudamemcpyhosttodevice); dim3 grid( 16 ); dim3 block( 256 ); funkcja<<< grid, block >>>(in, out, size); cudamemcpy(tablica, (void*)out, rozmiar * sizeof(int), cudamemcpydevicetohost); cudathreadsynchronize(); cudafree(d_word_address); Łukasz Ligowski () CUDA 11 luty 2008 26 / 36

Kernele na GPU Przetwarzanie Hierarchia grid > blok > warp > halfwarp > wątek grid wszystkie wątki uruchamiane przez pojedynczy kernel block grupa wątków uruchamianych na jednym multiprocesorze (multiprocesor może mieć więcej niż jeden blok na raz), najlepiej jeśli łącznie jest więcej niż 192 i w liczba jest podzielna przez 64 warp/halfwarp podstawowa jednostka wykonania 32/16 wątków Łukasz Ligowski () CUDA 11 luty 2008 27 / 36

Kernele na GPU Własności block dobrze mieć co najmniej 2 razy więcej niż może wykonywać się na multiprocesorze, więcej może być lepiej ale niekoniecznie warp instrukcja if musi być ewaluowana w każdym warpie do tej samej galezi, w innym przypadku czekamy aż wątki wykonujące drugą gałąź skończą Wstępna kontrola wydajności Cuda Occupancy Calculator Łukasz Ligowski () CUDA 11 luty 2008 28 / 36

Instrukcje dodawanie odejmowanie, shift, operacje logiczne, mnożenie o gorszej precyzji (24 bit), konwersja typu, 4 cykle, 16 cykli odwrotność, mnożenie, dzielenie, wyciąganie pierwiastka, dzielenie całkowite i dzielenie modulo są bardzo drogie większość zmiennych short i char i tak zwykle jest konwertowana na int Łukasz Ligowski () CUDA 11 luty 2008 29 / 36

Pamieć Hierarchia global Główna pamięć karty, latencja czytania/pisania rzędu kilkuset cykli procesora, przepustowość 80 Gbps najlepsze karty 100Gbps texture to global memory ale: z niewielkim cache, read only, lepiej ukrywa obliczenia związane z adresowaniem, wsparcie dla graficznych metod indeksowania shared on-chip, mało, jeśli nie występują konflikty pomiędzy watkami szybkość na poziomie rejestrów rejestry w przeliczeniu na watek jest ich mało (kilkanascie) Łukasz Ligowski () CUDA 11 luty 2008 30 / 36

Pamięć cd constant constant mały kawałek cache owanej pamięci global memory, szybkość dostępu jak do rejestrów lub jak do global memory jeśli cache nie trafi, zmienna; przed użyciem trzeba wykonać cudamemcpytosymbol global device, czytanie i zapis powinny odbywać sie w ciągły sposób tzn. pojedynczy watek czyta co n-ta wartość, shared shared zorganizowana w n-banków, konflikty nie występują kiedy każdy watek z warpu korzysta z innego banku operacja broadcast - wszystkie watki mogą czytać z jednego banku dostępnych jest 16 banków Łukasz Ligowski () CUDA 11 luty 2008 31 / 36

Pamięć Łukasz Ligowski () CUDA 11 luty 2008 32 / 36

Pamięć Łukasz Ligowski () CUDA 11 luty 2008 33 / 36

Profiling Zalety ;) Pozwala sprawdzić czy w poprawny sposób korzystamy z pamięci global/shared oraz czy watki serializują instrukcje warunkowe czy je wykonują jednocześnie. Łukasz Ligowski () CUDA 11 luty 2008 34 / 36

Debugging Brak Jest coś na emulatorze? CUDA SAFE CALL() Łukasz Ligowski () CUDA 11 luty 2008 35 / 36

Technikalia - nvidia 8800 gtx 16 multiprocesorów max watków na blok 512 rejestry na multiprocesor 8192 constant memory 64Kb cache constant i texture memory po 8Kb/multiprocessor max: 8 blocks, 24 warps, 756 watków/multiprocessor Łukasz Ligowski () CUDA 11 luty 2008 36 / 36