Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

Hasonló dokumentumok
Párhuzamos és Grid rendszerek

CUDA haladó ismeretek

OpenCL - The open standard for parallel programming of heterogeneous systems

Magas szintű optimalizálás

CUDA alapok CUDA projektek. CUDA bemutató. Adatbányászat és Webes Keresés Kutatócsoport SZTAKI

Grafikus kártyák, mint olcsó szuperszámítógépek - I.

Grafikus kártyák, mint olcsó szuperszámítógépek - II.

4. Funkcionális primitívek GPUn

KÉPFELDOLGOZÓ ALGORITMUSOK FEJLESZTÉSE GRAFIKUS HARDVER KÖRNYEZETBEN

Eichhardt Iván GPGPU óra anyagai

GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási

A CUDA előnyei: - Elszórt memória olvasás (az adatok a memória bármely területéről olvashatóak) PC-Vilag.hu CUDA, a jövő technológiája?!

Eichhardt Iván GPGPU óra anyagai

GPGPU-k és programozásuk

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai

Jurek Zoltán, Tóth Gyula

Lineáris egyenlet. Lineáris egyenletrendszer. algebrai egyenlet konstansok és első fokú ismeretlenek pl.: egyenes egyenlete

Diplomamunka. Miskolci Egyetem. GPGPU technológia kriptográfiai alkalmazása. Készítette: Csikó Richárd VIJFZK mérnök informatikus

Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon. Készítette: Kovács Andor. 2011/2012 első félév

SAT probléma kielégíthetőségének vizsgálata. masszív parallel. mesterséges neurális hálózat alkalmazásával

GPU-Accelerated Collocation Pattern Discovery

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Programozás 5. Dr. Iványi Péter

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Pénzügyi algoritmusok

Adat- és feladat párhuzamos modell Az ISO C99 szabvány részhalmaza

OpenGL és a mátrixok

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

egy szisztolikus példa

Grafikus kártyák, mint olcsó szuperszámítógépek - I.

Grafikus csővezeték 1 / 44

GPGPU. GPU-k felépítése. Valasek Gábor

GPGPU programozás lehetőségei. Nagy Máté Ferenc Budapest ALICE ELTE TTK Fizika MSc 2011 e-science Café

GPU alkalmazása az ALICE eseménygenerátorában

OPENCV TELEPÍTÉSE SZÁMÍTÓGÉPES LÁTÁS ÉS KÉPFELDOLGOZÁS. Tanács Attila Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Google Summer of Code OpenCL image support for the r600g driver

10. gyakorlat. Pointerek Tárolási osztályok

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

GPGPU és számítások heterogén rendszereken

Heterogén számítási rendszerek gyakorlatok (2017.)

Programozas 1. Strukturak, mutatok

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Masszívan párhuzamos alkalmazások fejlesztése. Dr. Szénási Sándor Kertész Gábor, Kiss Dániel

AliROOT szimulációk GPU alapokon

KUTATÁSOK INFORMATIKAI TÁMOGATÁSA. Dr. Szénási Sándor

A C programozási nyelv III. Pointerek és tömbök.

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Győri HPC kutatások és alkalmazások

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

A C programozási nyelv III. Pointerek és tömbök.

Heterogén számítási rendszerek gyakorlatok (2018.)

Szoftvertechnológia alapjai Java előadások

Programozás C++ -ban

Információs Technológia

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Számítógépek felépítése

BIG DATA ÉS GÉPI TANULÁS KÖRNYEZET AZ MTA CLOUD-ON KACSUK PÉTER, NAGY ENIKŐ, PINTYE ISTVÁN, HAJNAL ÁKOS, LOVAS RÓBERT

Textília szimulációja grafikus processzoron

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

GPU-k a gravitációs hullám kutatásban

GPGPU: Általános célú grafikus processzorok cgpu: computational GPU GPGPU = cgpu Adatpárhuzamos gyorsító: dedikált eszköz, ami eleve csak erre

Heterogén számítási rendszerek

GPGPU ÚJ ESZKÖZÖK AZ INFORMÁCIÓBIZTONSÁG TERÜLETÉN

Négyprocesszoros közvetlen csatolású szerverek architektúrája:

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Pénzügyi algoritmusok

9. MPI

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Információs Technológia

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Gauss-eliminációval, Cholesky felbontás, QR felbontás

Jelek és rendszerek Gyakorlat_02. A gyakorlat célja megismerkedni a MATLAB Simulink mőködésével, filozófiájával.

Mintavételes szabályozás mikrovezérlő segítségével

Alprogramok, paraméterátadás

Nokia N9 - MeeGo Harmattan bemutatkozik

GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Lineáris algebra. (közgazdászoknak)

Konkurens TCP Szerver

Nemlineáris optimalizálási problémák párhuzamos megoldása grafikus processzorok felhasználásával

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana

9. gyakorlat Lineáris egyenletrendszerek megoldási módszerei folyt. Néhány kiegészítés a Gauss- és a Gauss Jordan-eliminációhoz

Szürke árnyalat: R=G=B. OPENCV: BGR Mátrix típus: CV_8UC3 Pont típus: img.at<vec3b>(i, j) Tartomány: R, G, B [0, 255]

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Haladó Grafika EA. Inkrementális képszintézis GPU-n

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás C és C++ -ban

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Nagyteljesítményű mikrovezérlők 10b. RTOS gyakorlatok

Matematikai programok

Deep Learning a gyakorlatban Python és LUA alapon Tanítás: alap tippek és trükkök

INFORMATIKA tétel 2017

Bevezetés a párhuzamos programozási koncepciókba

Szürke árnyalat: R=G=B. OPENCV: BGR Mátrix típus: CV_8UC3 Pont típus: img.at<vec3b>(i, j) Tartomány: R, G, B [0, 255]

Átírás:

Hasznos weboldalak Videókártya - CUDA kompatibilitás: https://developer.nvidia.com/cuda-gpus CUDA weboldal: https://developer.nvidia.com/cuda-zone Példaterületek: http://www.nvidia.com/object/imaging_comp _vision.html http://www.nvidia.com/object/computational_ fluid_dynamics.html

CUDA (Compute Unified Device Architecture) NVIDIA által fejlesztett GPGPU platform. Fejleszthető: C, C++, Fortran nyelveken, de elérhető wrapper: Python, Perl, Fortran, Java, Ruby, Lua, Haskell, MATLAB

CUDA A játékiparban nem csak grafikus renderelésre, de fizikai rendszerek számítására is alkalmazzák (PhysX) Könnyen létrehozható OpenGL-el együttműködés

CUDA vs. OpenCL Általánosságban a CUDA 20%-30%-al gyorsabb, mint az OpenCL, de csak NVIDIA kártyákon fut. OpenCL lassabb, de sokkal több deviceon működik. Cuda vs. OpenCL cikk, ahol belátják, hogy az OpenCL ugyanolyan gyors, mint CUDA de úgy, hogy kiveszik a CUDA hardver-specifikus részeit http://cg.elte.hu/~gpgpu/cuda/cudavsop encl.pdf

CUDA vs. OpenCL Néhány gondolat nagyon intuitívan - CUDA gyorsabb általánosságban - OpenCL több hardveren futtatható, mint a CUDA - A CUDA-hoz több debugging és profiler tool található - A CUDA elsőre könnyebben telepíthető, és indítható. - Nem túl bonyolult egyik kódot a másikká alakítani. - Stb.

Hasznos CUDA Library-k - NPP: Kép-, és jelfeldolgozási algoritmusok - cudnn: Neurális hálók GPU implementációja - cublas-xt: Lineáris algebra - cufft: Fourier-transzformáció számítása GPU-n - Stb.

Heterogén programozás CPU-n futtatott kód: Host host <függvény> Nem hívható GPU-ról GPU-n futtatott kód: Global global <függvény> Nem hívható GPU-ról GPU-n futtatott kód: Device device <függvény> Nem hívható CPU-ról

Gridek Több blokkot tartalmaznak Blokkok Szálakat kezelnek Általában 32 darabot párhuzamosan. Egy blokkhoz egy multiprocesszor tartozik.

Memória modell

Memóriakezelés A host és device memória megkülönböztetése végett a pointernevek elé h_, és d_ prefixet szoktak tenni. cudamalloc(void ** pointer, size_t, nbytes) // Device memória foglalása cudamemset(void * pointer, int value, size_t count) // Device memória beállítása cudafree(void * pointer); // Device memória felszabadítása

Memóriakezelés példa int n = 1024; int nbytes = 1024 * sizeof(int); int *d_a = 0; cudamalloc( (void**) &d_a, nbytes ); cudamemset( d_a, 0, nbytes ); cudafree( d_a )

Host Device memória cudamemcpy(void *dst, void *src, size_t nbytes, enum cudamemcpykind direction) // Adatok másolása Host és Device memória között enum cudamemcpykind cudamemcpyhosttodevice cudamemcpydevicetohost cudamemcpydevicetodevice

Indexelés kernelen belül

Host szinkronizálás Minden kernelhívás aszinkron. - cudamemcpy(): Memóriát másol, de szinkronizál is. - cudathreadsynchronize(): Blokkol, amíg minden CUDA hívás le nem futott.

Példa: Vektor összeadás Sorosan: for (i = 0.. N-1) C[i] = A[i] + B[i]; Párhuzamosan minden összeadást egy szál végezhet. VecAdd(A,B,C) { int i = threadidx; C[i] = A[i] + B[i]; }

Telepítés Visual Studio alá 1. Visual Studio telepítése 2. CUDA Toolkit letöltése (https://developer.nvidia.com/cuda-downloads) 3. Kész

1. Példa projekt Elérhető device-ok lekérdezése http://cg.elte.hu/~gpgpu/cuda/01_deviceq uery.zip

Projekt beállítása Jobb klikk a projekt nevére és Properties gomb C/C++ - Additional Include Directories: <CUDAPack>/include CUDA C/C++ - Additional Include Directories: <CUDAPack>/include Linker/General Additional Library Directories: <CUDAPack>/lib/Win32 Linker/Input Additional Dependencies: cudart_static.lib;kernel32.lib;user32.lib;gdi32.lib; winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib ;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp 32.lib;%(AdditionalDependencies)

2. Projekt y = A*x + b egyenlet kiszámolása ismert A, x, b esetén. A N*M-es mátrix x M hosszú vektor b N hosszú vektor y N hosszú vektor Projekt váza: cg.elte.hu/~gpgpu/cuda/02_simplemv.zip

Megoldás CPU-n Egyszerűen egy ciklussal megoldható a feladat párhuzamosítás nélkül. void ScalarMV(int N, int M, float *y, const float* A, const float* x, const float* b) { for (unsigned int i = 0; i < N; ++i) { float yi = b[i]; for (unsigned int j = 0; j < M; ++j) yi += A[i * M + j] * x[j]; y[i] = yi; } }

1. Megoldás GPU-n Adódik az a párhuzamosítási lehetőség, hogy az adott skalárszorzásokat külön szálak végezzék. Ez az i. szálra nézve azt jelenti, hogy a Ai * x műveletet kell elvégeznie, ahol Ai az A mátrix i. sora.

SimpleMV.cpp Adatok generálása SimpleMV(N, M, y, A, x, b) függvény meghívása

SimpleMV_kernel.cu Kernel létrehozása global void cudasimplemv(int N, int M, float* y, float* A, float* x, float* b) { int i = blockidx.x * blockdim.x + threadidx.x; if(i < N) { float yi = b[i]; for(int j=0; j<m; j++) yi += A[i * M + j] * x[j]; y[i] = yi; } }

SimpleMV_kernel.cu Device memória lefoglalása Host memória átmásolása size_t mat_size= N * M * sizeof(float); size_t vec_x_size= M * sizeof(float); size_t vec_b_size= N * sizeof(float); size_t vec_y_size= vec_b_size; cudaerror_t err; float *d_a = NULL; err = cudamalloc((void **)&d_a, mat_size); float *d_x = NULL; err = cudamalloc((void **)&d_x, vec_x_size); float *d_b = NULL; err = cudamalloc((void **)&d_b, vec_b_size); float *d_y = NULL; err = cudamalloc((void **)&d_y, vec_y_size);

SimpleMV_kernel.cu Host memória átmásolása err = cudamemcpy(d_a, A, mat_size, cudamemcpyhosttodevice); err = cudamemcpy(d_b, b, vec_b_size, cudamemcpyhosttodevice); err = cudamemcpy(d_x, x, vec_x_size, cudamemcpyhosttodevice);

SimpleMV_kernel.cu Kernel elindítása int threadsperblock = 256; int blocknum = (N + threadsperblock - 1) / threadsperblock; cudasimplemv<<<blocknum, threadsperblock>>>(n, M, d_y, d_a, d_x, d_b); err = cudagetlasterror();

SimpleMV_kernel.cu Memória felszabadítás, és visszamásolás a Host memóriába err = cudafree(d_a); err = cudafree(d_x); err = cudafree(d_b); err = cudamemcpy(y, d_y, vec_y_size, cudamemcpydevicetohost); err = cudafree(d_y);

2. Megoldás GPU-n Az előző megoldása a skalárszorzásokat nem párhuzamosította. Tegyünk fel egy nem túl realisztikus feltételt a demonstráció kedvéért: Annyi szálat tudjon egy blokk indítani, amekkora az M (oszlopok száma)

2. Megoldás GPU-n Minden blokk végezze el egy A egy sorának, és az x vektor skalárszorzását úgy, hogy a blokkon belül egy szál csak az Aij * xj szorzást végezze el. Osztott memóriában tároljuk a részeredményeket és a végén összesítjük.

SimpleMV.cpp extern "C" void ReduceMV(int N, float* y, float* A, float* x, float* b);

SimpleMV_kernel.cu Host kód létrehozása #define M2 256 extern "C" void ReduceMV(int N, float* y, float* A, float* x, float* b) { } // Mint a SimpleMV esetén

SimpleMV_kernel.cu Device kernel létrehozása global void cudareducemv(int N, float* y, float* A, float* x, float* b) { int i = blockidx.x; int j = threadidx.x; shared float Q[M2]; Q[j] = A[i * M2 + j] * x[j];

SimpleMV_kernel.cu Device kernel létrehozása for (int stride = M2 / 2; stride > 0; stride >>= 1) { syncthreads(); if(j + stride < M2) Q[j] += Q[j + stride]; } } if(j == 0) y[i] = Q[0] + b[i];

Köszönöm a figyelmet