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

Podobne dokumenty
Programowanie procesorów graficznych GPGPU

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

Programowanie procesorów graficznych GPGPU

Programowanie Współbieżne

Przetwarzanie Równoległe i Rozproszone

Programowanie kart graficznych

Programowanie CUDA informacje praktycznie i. Wersja

CUDA. cudniejsze przyk ady

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

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

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

i3: internet - infrastruktury - innowacje

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

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

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

Programowanie CUDA informacje praktycznie i przykłady. Wersja

Tesla. Architektura Fermi

Moc płynąca z kart graficznych

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

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

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

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

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

Programowanie aplikacji równoległych i rozproszonych

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

Nowoczesne technologie przetwarzania informacji

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

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Programowanie kart graficznych

Numeryczna algebra liniowa

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

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

Wstęp do obliczeń równoległych na GPU

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

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

Algorytmy dla maszyny PRAM

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

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

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

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

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

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

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

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

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

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

CUDA ćwiczenia praktyczne

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

Wprowadzenie do programowania w środowisku CUDA. Środowisko CUDA

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

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

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

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

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

Wstęp. Przetwarzanie równoległe. Krzysztof Banaś Obliczenia równoległe 1

Alternatywne modele programowania równoległego

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

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

Przetwarzanie Równoległe i Rozproszone

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.

Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1

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

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

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

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

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

Architektura komputerów

Skalowalność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

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

Programowanie kart graficznych. Sprzęt i obliczenia

Numeryczna algebra liniowa. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

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

Obliczenia na GPU w technologii CUDA

Podstawy OpenCL część 2

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

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

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

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

4. Procesy pojęcia podstawowe

ZARZĄDZANIE PAMIĘCIĄ W TECHNOLOGII CUDA

4. Procesy pojęcia podstawowe

4. Procesy pojęcia podstawowe

Procesory kart graficznych i CUDA wer PR

Procesory kart graficznych i CUDA

Programowanie procesorów graficznych w CUDA.

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

Hybrydowy system obliczeniowy z akceleratorami GPU

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Równoległe algorytmy sortowania. Krzysztof Banaś Obliczenia równoległe 1

ROZPROSZONY SYSTEM DO KRYPTOANALIZY SZYFRÓW OPARTYCH NA KRZYWYCH ELIPTYCZNYCH

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

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

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

Jacek Naruniec. lato 2014, Politechnika Warszawska, Wydział Elektroniki i Technik Informacyjnych

Procesory kart graficznych i CUDA wer

Model pamięci. Rafał Skinderowicz

Literatura. 3/26/2018 Przetwarzanie równoległe - wstęp 1

HPC na biurku. Wojciech De bski

Procesory kart graficznych i CUDA wer

Raport Hurtownie Danych

Transkrypt:

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

OpenCL projektowanie kerneli Przypomnienie: kernel program realizowany przez urządzenie OpenCL wątek (work item) rdzeń (processing element): zazwyczaj jeden wątek wykonywany jest przez jeden rdzeń grupa wątków (work group) jednostka obliczeniowa (compute unit): grupa wątków wykonuje obliczenia na jednej jednostce obliczeniowej grupa wątków powinna mieć więcej wątków niż rdzeni w jednostce obliczeniowej grupa dzielona jest na podgrupy, wavefronts/warps, wątków wykonywanych jednocześnie w modelu SIMD przestrzeń wątków urządzenie: wszystkie watki z przestrzeni realizują zlecony kernel na urządzeniu Krzysztof Banaś Obliczenia równoległe 2

Przestrzeń wątków Krzysztof Banaś Obliczenia równoległe 3

OpenCL projektowanie kerneli Przypomnienie: wielopoziomowa hierarchia pamięci: rejestry najszybsze zmienne lokalne (jeśli nie jest ich za dużo, register spilling) prywatne dla każdego wątku pamięć wspólna szybka zmienne (tablice) z atrybutem local wspólne dla wątków z jednej grupy roboczej pamięć globalna powolna zmienne lokalne nie mieszczące się w rejestrach zmienne (tablice) z atrybutem local» wspólne dla wszystkich wątków dodatkowe rodzaje pamięci: constant, texture Krzysztof Banaś Obliczenia równoległe 4

OpenCL model pamięci Krzysztof Banaś Obliczenia równoległe 5

OpenCL ukrywanie opóźnienia Ukrywanie opóźnienia (latency hiding) w dostępie do pamięci dla CPU i GPU Konieczne jest współbieżne wykonywanie co najmniej kilku (najlepiej kilkunastu) grup wątków (AMD wavefronts, NVIDIA warps) Podział na grupy wątków dokonujących jednoczesnego dostępu do pamięci jest ukryty przed programistą Krzysztof Banaś Obliczenia równoległe 6

OpenCL zależności danych Krzysztof Banaś Obliczenia równoległe 7

Projektowanie kerneli Model równoległości danych (data parallel programming) model zrównoleglenia: dekompozycja danych (data decomposition) każdy wątek realizuje ten sam kod (SPMD) synchronizacja sprzętowa (SIMD, SIMT) wątek operuje na danych, określanych za pomocą identyfikatorów OpenCL pozwala uzyskać informacje o liczbie wymiarów przestrzeni wątków, liczbie wątków (globalnej oraz w pojedynczej grupie), liczbie grup oraz o identyfikatorze wątku: lokalnym (w grupie), globalnym, a także o identyfikatorze grupy: get_work_dim() get_global_id(dim_id), get_local_id(dim_id) get_global_size(dim_id), get_local_size(dim_id) get_num_groups(dim_id), get_group_id(dim_id) Krzysztof Banaś Obliczenia równoległe 8

OpenCL model pamięci Spójność pamięci: dla wątków tej samej grupy spójny obraz pamięci jest uzyskiwany w punktach synchronizacji np. wywołanie barrier (CLK_GLOBAL_MEM_FENCE); barrier (CLK_LOCAL_MEM_FENCE); dla wszystkich wątków wykonujących kernel spójny obraz pamięci jest uzyskiwany po wykonaniu kernela Szybkość pamięci: global local: ponad 100GB/s zależna od wzorca dostępu (coalesced memory access) host global: 6GB/s (PCIe 2.0) Krzysztof Banaś Obliczenia równoległe 9

Przykład transpozycja macierzy Krzysztof Banaś Obliczenia równoległe 10

Przykład transpozycja macierzy Krzysztof Banaś Obliczenia równoległe 11

Przykład transpozycja macierzy Wykorzystanie: pamięci wspólnej: jako szybkiej pamięci podręcznej umożliwiającej komunikację pomiędzy watkami jawnej synchronizacji pracy wątków Krzysztof Banaś Obliczenia równoległe 12

CUDA kernel global void transpose( float *out, float *in, int w, int h ) { shared float block[block_dim*block_dim]; unsigned int xblock = blockdim.x * blockidx.x; unsigned int yblock = blockdim.y * blockidx.y; unsigned int xindex = xblock + threadidx.x; unsigned int yindex = yblock + threadidx.y; unsigned int index_out, index_transpose; if ( xindex < width && yindex < height ) { unsigned int index_in = width * yindex + xindex; unsigned int index_block = threadidx.y * BLOCK_DIM + threadidx.x; block[index_block] = in[index_in]; index_transpose = threadidx.x * BLOCK_DIM + threadidx.y; index_out = height * (xblock + threadidx.y) + yblock + threadidx.x; synchthreads(); if(xindex<width&&yindex<height) out[index_out]=block[index_transpose]; Krzysztof Banaś Obliczenia równoległe 13

Przykład mnożenie macierzy Przypomnienie: mnożenie macierzy jest algorytmem, dla którego przy nieskończonej liczbie rejestrów występuje bardzo korzystny stosunek liczby operacji do liczby dostępów do pamięci s pm = (2n 3 )/(3n 2 ) ~ 2n/3 (n rozmiar macierzy) przy małej liczbie rejestrów i małym rozmiarze pamięci podręcznej naiwna implementacja prowadzi do znacznego spadku stosunku s pm : s pm = (2n 3 )/(n 3 +...) ~ 2 implementacja naiwna schemat przechowywania wierszami: c(row, col) = c[row*n + col] for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i*n+j]=0.0; for(k=0;k<n;k++){ c[i*n+j] += a[i*n+k]*b[k*n+j]; Krzysztof Banaś Obliczenia równoległe 14

Przykład mnożenie macierzy Naiwna implementacja GPU jeden wątek na jeden element macierzy wynikowej C Operacje wyłącznie na pamięci globalnej Nieoptymalny dostęp do tablicy A kernel void mat_mul_1_kernel( global float* A, global float* B, global float* C, int N ) { int i; int row = get_global_id(1); int col = get_global_id(0); float temp = 0.0; for (i = 0; i < N; i++) { temp += A[row * N + i] * B[i * N + col]; C[row * N + col] = temp; Krzysztof Banaś Obliczenia równoległe 15

Przykład mnożenie macierzy Klasyczna technika optymalizacji blokowanie Wyróżnienie bloków w tablicach A, B i C przechowywanych w szybkiej pamięci Wykonanie jak największej liczby operacji na blokach w szybkiej pamięci Krzysztof Banaś Obliczenia równoległe 16

Przykład mnożenie macierzy Implementacja blokowania: wariant 1 duże bloki: rozmiar bloku dobrany tak, żeby blok mieścił się w szybkiej pamięci (cache blocking) pojedynczy wątek wykonuje obliczenia dla wielu wyrazów bloku wariant 2 małe bloki: rozmiar bloku dobrany tak, żeby wartości mogły być przechowywane w rejestrach dla CPU i jednego wątku wiele zmiennych dla GPU np. jedna zmienna, ale wiele wątków Krzysztof Banaś Obliczenia równoległe 17

Przykład mnożenie macierzy int row = get_global_id(1); int local_row = get_local_id(1); int col = get_global_id(0); int local_col = get_local_id(0); float temp = 0.0; int nr_blocks = N/BLOCK_SIZE; for(iblock = 0; iblock < nr_blocks; iblock++){ A_local[local_row * BLOCK_SIZE + local_col] = A[row * N + iblock*block_size + local_col]; B_local[local_row * BLOCK_SIZE + local_col] = B[(local_row+iblock*BLOCK_SIZE) * N + col]; barrier(clk_local_mem_fence); for(i=0; i< BLOCK_SIZE; i++){ temp += A_local[local_row*BLOCK_SIZE+i] * B_local[i*BLOCK_SIZE+local_col]; barrier(clk_local_mem_fence); C[row * N + col] = temp; Krzysztof Banaś Obliczenia równoległe 18