CUDA. cudniejsze przyk ady

Podobne dokumenty
Programowanie Współbieżne

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

Programowanie CUDA informacje praktycznie i. Wersja

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

Programowanie kart graficznych

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

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

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

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

Programowanie CUDA informacje praktycznie i przykłady. Wersja

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

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

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

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

Programowanie procesorów graficznych GPGPU

Programowanie kart graficznych

Programowanie procesorów graficznych GPGPU

Podstawy OpenCL część 2

Tesla. Architektura Fermi

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

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

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

EFEKTYWNOŚĆ MNOŻENIA MACIERZY W SYSTEMACH Z PAMIĘCIĄ WSPÓŁDZIELONĄ

Julia 4D - raytracing

ANALIZA EFEKTYWNOŚCI MNOŻENIA MACIERZY W SYSTEMACH Z PAMIĘCIĄ WSPÓŁDZIELONĄ

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

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

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

Redukcja czasu wykonania algorytmu Cannego dzięki zastosowaniu połączenia OpenMP z technologią NVIDIA CUDA

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

Moc płynąca z kart graficznych

Przetwarzanie Równoległe i Rozproszone

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

Wpracy przedstawiono wyniki wykorzystania możliwości obliczeniowych kart graficznych

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

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Mnożenie macierzy. Systemy z pamięcią współdzieloną Systemy z pamięcią rozproszoną Efektywność

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

Programowanie aplikacji równoległych i rozproszonych

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

Zadania na zaliczenie przedmiotu Przetwarzanie równoległe Zebrał dla roku.ak. 2015/2016 Rafał Walkowiak,

CUDA ćwiczenia praktyczne

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

BIBLIOTEKA NUMPY, CZĘŚĆ 2

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

XIII International PhD Workshop OWD 2011, October 2011 REALIZACJA OBLICZEŃ W ARCHITEKTURZE MASOWO RÓWNOLEGŁEJ W HETEROGENICZNYCH SYSTEMACH

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

PROJEKT 3 PROGRAMOWANIE RÓWNOLEGŁE. K. Górzyński (89744), D. Kosiorowski (89762) Informatyka, grupa dziekańska I3

Raport Hurtownie Danych

Algorytmy numeryczne 1

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

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

MATERIAŁY POMOCNICZE DO LABORATORIUM Z PRZETWARZANIA RÓWNOLEGŁEGO KWIECIEŃ 2018

Metody Obliczeniowe w Nauce i Technice

Programowanie Współbieżne. Algorytmy

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

Cyfrowe Przetwarzanie Obrazów i Sygnałów

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

Ćwiczenie 1. Wprowadzenie do programu Octave

Macierzowe algorytmy równoległe

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Obliczenia na GPU w technologii CUDA

Przetwarzanie Równoległe i Rozproszone

Task Parallel Library

Macierze. Rozdział Działania na macierzach

Zastosowanie technologii CUDA w rozpoznawaniu wzorców nieregularnych

Macierze i Wyznaczniki

Ćwiczenie 1. Wprowadzenie do programu Octave

Alternatywne modele programowania równoległego

Implementacja filtru Canny ego

Programowanie równoległe Wprowadzenie do programowania GPU. Rafał Skinderowicz

Detekcja punktów zainteresowania

Programowanie kart graficznych. Sprzęt i obliczenia

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

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

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie współbieżne... (w14)

Procesory kart graficznych i CUDA wer

Macierze - obliczanie wyznacznika macierzy z użyciem permutacji

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

Programowanie dynamiczne

Przykładem jest komputer z procesorem 4 rdzeniowym dostępny w laboratorium W skład projektu wchodzi:

Przetwarzanie sygnałów

Operacje przetwarzania obrazów monochromatycznych

Algorytmy sztucznej inteligencji

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Transformacja Fouriera i biblioteka CUFFT 3.0

POLITECHNIKA ŁÓDZKA WYDZIAŁ ELEKTROTECHNIKI, ELEKTRONIKI, INFORMATYKI I AUTOMATYKI INSTYTUT INFORMATYKI STOSOWANEJ. Autoreferat

ROZWIĄZANIE PROBLEMU TRÓJSPEŁNIALNOŚCI FORMUŁ LOGICZNYCH Z UŻYCIEM ARCHITEKTURY CUDA

MATLAB Z3. Rafał Woźniak. Warsaw, Faculty of Economic Sciences, University of Warsaw

Diagnostyka obrazowa

WEKTORY I MACIERZE. Strona 1 z 11. Lekcja 7.

Rozdział 5. Macierze. a 11 a a 1m a 21 a a 2m... a n1 a n2... a nm

NIEDZIESIĄTKOWE SYSTEMY LICZENIA.

Filtracja obrazów. w dziedzinie częstotliwości. w dziedzinie przestrzennej

OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23

i3: internet - infrastruktury - innowacje

Język C zajęcia nr 7. Uwagi dotyczące stylu programowania

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

Transkrypt:

CUDA cudniejsze przyk ady

Agenda: CPU vs. GPU Mnożenie macierzy CPU Mnożenie macierzy - GPU Sploty

Macierze CPU vs. GPU CPU: GPU: Mnożenie wykonywane w kolejnych iteracjach pętli. Przechodzimy przez pierwszy wiersz tabeli M i pierwszą kolumnę macierzy N, w pętli liczymy ich iloczyn skalarny i od razu zapisujemy go w macierzy wyjściowej. paralelne wykonanie właściwego mnożenia macierzy każdy wątek wpisuje jeden element do macierzy wynikowej Cdn...

CPU Istotny dla zrozumienia różnicy pomiędzy tradycyjnym mnożeniem macierzy, a analogicznymi obliczeniami na GPU jest fakt linearnego adresowania macierzy w pierwszym przypadku. Właśnie z linearnego adresowania macierzy wynika występujący w iteracji indeks postaci: i*width+k. (i numer wiersza; Width wymiar n macierzy; k-numer kolumny) Adresowanie linearne pokazano schematycznie na ilustracji:

CPU Jak widad, jest to podejście typowo sekwencyjne

Coś ciekawszego, czyli: GPU

GPU - (C = AB) Wersja najprostsza: Jest to wersja niezoptymalizowana. Każdy half warp oblicza jeden rząd tile a C, polegając przy tym na jednym rzędzie z A i całym tile u z B. W każdej iteracji pętli wszystkie wątki w half warpie czytają tę samą wartośd z pamięci globalnej. global void simplemultiply(float *a, float* b, float *c, int N) { int row = blockidx.y * blockdim.y + threadidx.y; int col = blockidx.x * blockdim.x + threadidx.x; float sum = 0.0f; } for (int i = 0; i < TILE_DIM; i++) { sum += a[row*tile_dim+i] * b[i*n+col]; } c[row*n+col] = sum;

GPU - (C = AB) Wersja 2: Pierwszym z możliwych ulepszeo jest wykorzystanie pamięci współdzielonej. W drugiej wersji algorytmu wczytujemy tile z A do pamięci współdzielonej. global void coalescedmultiply(float *a, float* b, float *c, int N) { shared float atile[tile_dim][tile_dim]; int row = blockidx.y * blockdim.y + threadidx.y; int col = blockidx.x * blockdim.x + threadidx.x; float sum = 0.0f; atile[threadidx.y][threadidx.x] = a[row*tile_dim+threadidx.x]; for (int i = 0; i < TILE_DIM; i++) { sum += atile[threadidx.y][i]* b[i*n+col]; } c[row*n+col] = sum; }

GPU - (C = AB) Wersja 3: Kolejnym możliwym ulepszeniem jest jednorazowe wczytywanie całego rzędu macierzy B do pamięci współdzielonej. global void sharedabmultiply(float *a, float* b, float *c, int N) { shared float atile[tile_dim][tile_dim], btile[tile_dim][tile_dim]; int row = blockidx.y * blockdim.y + threadidx.y; int col = blockidx.x * blockdim.x + threadidx.x; float sum = 0.0f; atile[threadidx.y][threadidx.x] = a[row*tile_dim+threadidx.x]; btile[threadidx.y][threadidx.x] = b[threadidx.y*n+col]; syncthreads(); for (int i = 0; i < TILE_DIM; i++) { sum += atile[threadidx.y][i]* btile[i][threadidx.x]; } c[row*n+col] = sum; }

Capability 1.1 - NVIDIA GeForce GT 9600M in a MacBook Pro Laptop, 4 multiprocessors, 32 cores Porównanie: Capability 1.2 - NVIDIA GeForce GT 330M in a MacBook Pro Laptop, 6 multiprocessors, 48 cores

Capability 1.3 - NVIDIA Tesla C1060 running in Earlham's cluster, 30 multiprocessors, 240 cores Porównanie: Capability 2.0 - NVIDIA Tesla M2070 at the Texas Advanced Computing Center, 14 multiprocessors, 448 cores Matrix Multiplication with CUDA A basic introduction to the CUDA programming model Robert Hochberg

Porównanie: Optymalizacja NVIDIA GeForce GTX 280(1.3) NVIDIA GeForce GTX 8800(1.0) Bez optymalizacji 8.7 GBps 0.7 GBps shared float atile 14.3 GBps 8.2 GBps shared float atile, btile 29.7 GBps 15.7 GBps Matrix Multiplication with CUDA NVIDIA CUDA C Best Practices Guide

Sploty Splot znajduje szerokie zastosowanie w przetwarzaniu obrazów. Operacja splotu oblicza nową wartośd piksela obrazu na podstawie wartości pikseli sąsiadujących. Przed zastosowaniem splotu: Po zastosowaniu splotu:

Sploty Simple box blur: (jak widad, maska ma efekt uśredniający) maska: Przed zastosowaniem splotu: Po zastosowaniu splotu:

Sploty Gaussian blur: maska: Przed zastosowaniem splotu: Po zastosowaniu splotu:

Sploty Naiwna implementacja: W najprostszej wersji implementacji splotu każdy blok wątków przetwarza jeden blok obrazu. Każdy wątek generuje na wyjściu jeden piksel.

Brutalna konfrontacja: (z rzeczywistością) Po zmodyfikowaniu naiwnego algorytmu zagadnienie zaczyna się komplikowad Uwzględnienie w algorytmie otoczki, niezbędnej do przeliczenia brzegowych pikseli powoduje, że wątki odpowiedzialne wcześniej za wczytanie otaczających pikseli będą bezczynne przez cały czas przeliczania maski. Sploty

Autorki Urszula Jędrzejczak Katarzyna Ostrowicz

Koniec Bibliografia: CUDA by Example: An Introduction to General-Purpose GPU Programming Jason Sanders,Edward Kandrot Programming Massively Parallel Processors: A Hands-on Approach David B. Kirk, Wen-mei W. Hwu Dokumentacja NVIDIA: CUDA C Best Practices Guide Version 3.1 z 2010-05-28 Image Convolution with CUDA Victor Podlozhnyuk[http://developer.download.nvidia.com/compute/cuda/1.1- Beta/x86_64_website/projects/convolutionSeparable/doc/convolutionSeparabl e.pdf] Matrix Multiplication with CUDA A basic introduction to the CUDA programming modelrobert Hochberg [http://www.shodor.org/media/content//petascale/materials/upmodule s/matrixmultiplication/moduledocument.pdf] http://www.aishack.in/2010/08/image-convolutionexamples/