 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC.

Slides:



Advertisements
Hasonló előadás
CUDA.
Advertisements

Tömbök C#-ban.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Objective- C Bereczki Gréta Tamara
8. előadás (2005. április 19.) Pozicionálás fájlban (folyt.) I/O mechanizmus váltás Hibakezelő függvények Változók tárolási osztályai Parancssor-argumentumok.
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás.
Adatbányászati technikák (VISZM185)
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
 Adat- és feladat párhuzamos modell  Az ISO C99 szabvány részhalmaza  párhuzamos kiegészítésekkel  Numerikus műveletek az IEEE754 alapján  Beágyazott.
 Bővítmény rendszer  Az OpenGL bővítményeihez hasonló  A specifikiáció természetes fejlődése ▪ Gyártó specifikus bővítmény ▪ Általános bővítmények.
Dinamikus tömbök.
Bevezetés a Java programozásba
11. előadás (2005. május 10.) A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások 1.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Mutatók, tömbök, függvények
Optimalizálás nemklasszikus architektúrákon
LDinamikus tömbök, kétdimenziós tömbök Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 21./0. lVektorok létrehozása futásidőben, dinamikusan.
Számítógépes grafika OpenGL 1. gyakorlat.
Annotációk a Java 5 nyelvben Kozsik Tamás. Annotációk Módosítószavak bővítése A programszöveg elemeihez rendelhetők –Csomagokhoz, típusokhoz, metódusokhoz,
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Bevezetés a C++ programozási nyelvbe
1 Operációs rendszerek Az NT folyamatok kezelése.
Tömbök Csernoch Mária.
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
1.4. Fordítás, szerkesztés, az objektumkönyvtár használata.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
A D programozási nyelv Angeli Dávid. Nagy vonalakban  C++  
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
3. előadás.  Apache szerver tudnivalók  Az index.php .htaccess – web-szerverünk beállításai  Konfigurációs állományok  Adatbázis kapcsolódás beállítása.
GPGPU A grafikus hardver általános célú felhasználása
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 4. Gyakorlat Függvény paraméterek, dinamikus.
Objektum orientált programozás
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
Podoski Péter és Zabb László. Bevezető Algoritmus-vizualizáció témakörében végeztünk kutatásokat és fejlesztéseket Felmértük a manapság ismert eszközök.
CUDA C/C++ programozás Textúra memória A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
CUDA C/C++ programozás Szál struktúra A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
CUDA C/C++ programozás Egyéb eszköztárak vegyesen A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt.
CUDA C/C++ programozás
CUDA C/C++ programozás GPU tulajdonságainak lekérdezése A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt.
A Visual Basic nyelvi elemei
CUDA C/C++ programozás Atomikus műveletek A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
C Programozási alapok.
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
DLL használata és készítése Feladat
Memóriakezelés feladatok Feladat: 12 bites címtartomány. 0 ~ 2047 legyen mindig.
Programtervezés, programozás I. 2.5 tömbök,stringek
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Google Summer of Code 2015 OpenCL image support for the r600g driver.
Bevezetés.  Miért …  … egyszálúan programozunk?  … probléma ez?  Hogyan …  … változik ez?  … tudjuk kihasználni?  Megéri-e párhuzamosítani?
Szécsi László 3D Grafikus Rendszerek 15. előadás
GPGPU – CUDA 1..
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
GPGPU – CUDA 2..
OpenGL II.
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Az objektum-orientáltság
CUDA – OpenGL.
Függvénysablonok használata
Előadás másolata:

 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC fordító  CUDA ecosystem  CUBLAS  CUFFT  CUSPARSE  CURAND  Thrust

 Compute Capability  Az eszközök csoportosítása a támogatott funkciók szerint  Az eszközök visszafelé kompatibilisek  Major.Minor sorszámozás ▪ Major: architektúra jelölés ▪ 1.x: Tesla ▪ 2.x: Fermi ▪ 3.x: Kepler ▪ Minor: architektúrán belüli fejlesztések

 Compute Capability  1.x: Első generációs GPGPU képességek ▪ 1.1: Atomi műveletek a globális memórián ▪ 1.2: Atomi műveletek az osztott memórián ▪ 1.3: Dupla pontosságú számítások  2.x: Erősebb GPGPU támogatás ▪ Atomi műveletek float értékeken ▪ Szinkronizációs primitívek ▪ Hatékonyabb memória kezelés  3.x: Nagy problématér adaptív támogatása ▪ 3.5: Dynamic Parallelism

 Driver API  Alacsony szintű hívások  Hasonló koncepcióra épül mint az OpenCL ▪ Device, Context, Module, Function ▪ Heap memory, CUDA Array, Texture, Surface  Runtime API  Magas szintű felületet nyújt a programozáshoz  Támogatja a host és device függvények keverését  Automatikus keretrendszer menedzsment

 Támogatja a C/C++ szabvány jelentős részét  Adatgyűjtő osztályok  Osztályok származtatása  Osztály sablonok  Függvény sablonok  Funktorok  Nem támogatja  Futásidejű típus információk (RTTI)  Kivételek  C++ Standard Library

 A fordítás menete  A forráskód szétválasztása host és device kódra  A host kód kiegészítése CUDA specifikus kódrészekkel ▪ A továbbiakban a host fordító dolgozik vele  A device kód fordítása a megfelelő architektúrára ▪ Az NVIDIA device fordító hozza létre belőle a binárist  A host és device binárisok összeszerkesztése

#include __global__ void square(int* dataGPU, int dataSize){ int index = blockIdx.x * blockDim.x + threadIdx.x; dataGPU[index] = dataGPU[index] * dataGPU[index] } int main(int argc, char* argv[]){ const int dataSize = 1024; int* dataCPU = (int*)malloc(sizeof(int)*dataSize); for(int i = 0; i < dataSize; ++i){ dataCPU[i] = i; } int* dataGPU; cudaMalloc(&dataGPU, sizeof(int)*dataSize); cudaMemcpy(dataGPU, dataCPU, sizeof(int)*dataSize, cudaMemcpyHostToDevice); int threadsPerBlock = 256; int blocksPerGrid = 4; square >>(dataGPU, dataSize); cudaMemcpy(dataCPU, dataGPU, sizeof(int)*dataSize, cudaMemcpyDeviceToHost); int wrongCount = 0; for(int i = 0; i < dataSize; ++i){ if(dataCPU[i] != i * i) wrongCount++; } printf(„Number of wrong squares: %d\n”, wrongCount); cudaFree(dataGPU); }

 CUDA Runtime api inicializálása  Automatikus az első CUDA hívásnál  Minden elérhető eszközhöz kontextust hoz létre  cudaDeviceReset() megszünteti a kontextusokat  Eszköz memória kezelése  Lineáris memória - cudaMalloc() és cudaFree()  CUDA Array – textúra memória int* dataGPU; cudaMalloc(&dataGPU, sizeof(int)*dataSize);

 Memória típusok  Szálankénti lokális memória ▪ A regiszter tömbben allokált terület ▪ Csak az adott szálban elérhető ▪ Spill-store használata, ha nincs elegendő regiszter!  Konstans memória  Osztott memória ▪ Közösen használható memória blokkonként  Globális memória ▪ GPU saját memóriájában ▪ Lineáris memória terület ▪ Textúra memória

 Memória típusok  Host oldali CUDA memória ▪ Page-Locked Host Memory ▪ Nem lapozható memória terület a host oldalon ▪ cudaHostAlloc(), cudaFreeHost(), cudaHostRegister() ▪ A másolása átlapolható a kernel futásával ▪ Nagyobb sebességgel másolható mint a sima host oldali memória

 Memória típusok  Host oldali CUDA memória ▪ Portable Memory ▪ A page-locked memória előnyös tulajdonságai csak az adott kontextusra érvényesek ▪ A portable flag az allokáláskor kiterjeszti ezt az összes eszközre ▪ Write-Combining Memory ▪ Nem cache-elhetővé teszi a lefoglalt területet ▪ Akár 40%-al gyorsabban másolható ▪ Host oldali olvasása a cache hiánya miatt lassú

 Memória típusok  Host oldali CUDA memória ▪ Mapped Memory ▪ A host oldalon lefoglalt memóriát elérhetővé teszi a GPU-n is ▪ A kernel futása alatt igény szerint másolódik a GPU-ra  + Nincs szükség a GPU-n lefoglalt területre másolásra  + Nincs szükség a streamekre a memória másolás és kernel futtatás átlapolásához  - A PCI-E busz sávszélessége korlátozó tényező  Unified Virtual Address Space  Compute Capability 2.0-tól elérhető  Egységes címtérbe rendezi a host és device memóriát  Egy pointerről egyértelműen eldönthető melyik eszközre mutat

 Eszköz memória kezelése  cudaMemcpy* függvény csoport  Az utolsó paraméter határozza meg az irányt ▪ cudaMemcpyHostToDevice ▪ cudaMemcpyDeviceToHost ▪ cudaMemcpyDeviceToDevice cudaMemcpy(dataGPU, dataCPU, sizeof(int)*dataSize, cudaMemcpyHostToDevice);

 Eszköz memória kezelése  Peer-To-Peer memória elérés ▪ Legalább CC2.0 Tesla kártyák között ▪ cudaDeviceCanAccessPeer() – a támogatás lekérdezése ▪ cudaDeviceEnablePeerAccess() – engedélyezése  Peer-To-Peer memória másolás ▪ Különböző eszközök között, ha nincs UVAS cudaSetDevice(0); float* p0; cudaMalloc(&p0, size); cudaSetDevice(1); cudaDeviceEnablePeerAccess(0,0); kernel >>(p0);

 CUDA streamek  Párhuzamos kernel indítás  Másolás és kernel futtatás átlapolása cudaStream_t stream[numberOfStreams]; for(int i = 0; i < numberOfStreams; ++i) cudaStreamCreate(&stream[i]); … for(int i = 0; i < 2; ++i) { cudaMemcpyAsync(…,cudaHostToDevice, stream[i]); kernel >>(params, …); cudaMemcpyAsync(…, cudaDeviceToHost, stream[i]); } … for(int i = 0; i < numberOfStreams; ++i) cudaStreamDestroy(stream[i]);

 CUDA streamek  Alapértelmezett stream, ha nincs megadva  Szinkronizáció  Explicit szinkronizáció ▪ cudaDeviceSynchronize() – minden stream befejezése ▪ cudaStreamSynchronize() – adott stream befejezése ▪ cudaStreamWaitEvent() – streamen belüli szinkronizáció  Implicit szinkronizáció ▪ Page-locked memória foglalás ▪ Device memória foglalás ▪ Eszközön belüli másolás ▪ Az alapértelmezett streamen parancs végrehajtás ▪ Cache konfiguráció változtatás

 Kernel indítás  Az nvcc alakítja át a valódi formára ▪ kernel >>(paraméterek, …)  A munkaméret megadása bottom-up módú ▪ A blokk méret megadja a blokkonkénti szálak számát ▪ A grid méret megadja az elindítandó blokkok számát  Aszinkron kernel futás int threadsPerBlock = 256; int blocksPerGrid = 4; square >>(dataGPU, dataSize);

 Kernel program  Az nvcc fordítja egy köztes kódra  PTX – Parallel Thread Execution ISA ▪ Virtuális gép és annak utasításkészlete ▪ A cél a GPU generációk közötti hordozhatóság ▪ Eszközfüggetlen, a GPU driver fordítja a végső bináris formára __global__ void square(int* dataGPU, int dataSize){ int index = blockIdx.x * blockDim.x + threadIdx.x; dataGPU[index] = dataGPU[index] * dataGPU[index] }

 Függvény jelölők  __device__ : csak kernel kódból hívható  __global__ : host és kernel kódból hívható  __host__ : csak a host kódból hívható  __noinline__ : nem beágyazható (cc2.0)  __forceinline__ : mindenképpen beágyazandó

 Változó jelölők  __device__ : az eszköz memóriájában található ▪ Globális memória terület ▪ A teljes alkalmazás élete alatt elérhető ▪ Minden szálból és a hostról is elérhető  __constant__ : konstans változó ▪ A konstans memóriában van (cachelt) ▪ A __device__ memóriával azonos tulajdonságok  __shared__ : osztott memória a blokkon belül ▪ Az on-chip memóriában van ▪ A blokk futása alatt érhető el ▪ Csak a blokkban levő szálak által elérhető

 Változó jelölők  __restrict__ : nem átfedő pointerek jelzése ▪ Ígéret a fordítónak, hogy a pointerek függetlenek ▪ Optimalizációt segíti

 Vektor típusok  Host és device oldalon is léteznek  type make_type() alakú konstruktorok  Maximum négy eleműek lehetnek ▪ Kivétel a double és a longlong típusok  A szokásos C típusok mindegyikéhez  dim3 típus a dimenzók jelzéséhez  Kernel munkaméret meghatározásához

 Speciális változók  dim3 gridDim : aktuális grid méret  uint3 blockIdx : aktuális blokk index  dim3 blockDim: aktuális blokk méret  uint3 threadIdx: aktuális szál azonosító  int warpSize: warp méret

 Szinkronizációs függvények  Az aktuális blokkon belüli memória szinkronizáció  Egyetlen threadből is kiváltható  void threadfence_block() ▪ Szinkronizál a globális és osztott memóriára  void threadfence() ▪ Szinkronizál a globális memóriára  void threadfence_system() ▪ Minden elérhető memória területre szinkronizál

 Szinkronizációs függvények  void __syncthreads() ▪ Minden szálnak rá kell futni ▪ A kódot szinkronizálja a szálak között  int __syncthreads(int predicate) ▪ Visszaadja azon szálak számát, ahol a predikátum nem nulla  int __synchtreads_and(int predicate) ▪ Visszaadja, hogy minden szálon nem nulla a predikátum  int __syncthreads_or(int predicate) ▪ Visszadja, hogy volt-e olyan szál, ahol nem nulla a predikátum

 Beépített függvények  Matematikai függvények  Textúra és Surface kezelő függvények  Idő lekérdezés  Atomikus függvények  Szavazó függvények  Változók cseréje szálak között  Formázott kiíró függvény (printf a kernel kódban!)  Memória foglalás  Kernel indítás

 Fejlesztést segítő eszköz  Visual Studio 2008,2010,2012  Eclipse  Memória ellenőrzés  Hibakeresés  CUDA kódban  OpenGL vagy DirectX shaderben  Teljesítmény analízis

 Kernel változók értéke  Töréspontok a kernelen belül  Szálak közötti váltás

 Teljesítmény analízis

 Teljesítmény analízis és értékelés