CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP 4.2.4.A/2-11-1-2012-0001 Nemzeti Kiválóság Program című kiemelt projekt keretében.

Slides:



Advertisements
Hasonló előadás
C++ programozási nyelv Gyakorlat hét
Advertisements

Összetett adattípusok 8/b tétel
Kifejezések 2+3 Egy egyszerű kifejezés… © Pasztuhov Dániel, www.programozas-oktatas.hu.
LEgyméretű tömbök, vektorok Alkalmazott Informatikai Tanszék SZÁMÍTÁSTECHNIKA I. dr.Dudás László 17./0. lVektorok definiálása lVektorok definiálása kezdőértékekkel.
LFüggvények Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 20./0. lFüggvények deklarációja és prototípusa lA függvénydefiníció lHivatkozás.
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.
 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC.
 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
10. előadás (2004. április 20.) A C előfordító (folytatás) Néhány hasznos compiler opció Egy tanulságos könyvtári függvény Változó hosszúságú argumentum.
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.
Függvények, mutatók Csernoch Mária.
Mutatók, tömbök, függvények
Borland C/C++ mintapéldák
Borland C/C++ mintapéldák függvényekre. 1. példa Írjunk olyan függvényt amely egy számot kiirat.
Programozás I. Horváth Ernő 1. Elérhetőségek Bauer Péter Horváth Ernő Tanszéki honlap
Programozás I. Horváth Ernő.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
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.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
C++ alapok, harmadik óra
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.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Bevezetés a C++ programozási nyelvbe
Tömbök Csernoch Mária.
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Készítette: Csíki Gyula
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Széchenyi Isván Egyetem Számítógépes hálózatok II 1 Számítógépes Hálózatok II Széchenyi István Egyetem.
GPGPU A grafikus hardver általános célú felhasználása
Java programozási nyelv Metódusok
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 3. Függvények Nagy Szilvia.
Objektum orientált programozás
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.
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.
© Tóth Ákos, Óbudai Egyetem, 2010
Programtervezés, programozás I. 2.5 tömbök,stringek
Struktúrák a C nyelvben 1 Akkor használjuk, ha az egy egyedre jellemző különböző típusú adatokat együtt akarjuk tárolni. Lényegében típusdeklaráció. A.
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.
Informatikai gyakorlatok 11. évfolyam
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.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Alapvető programozási tételek megvalósítása Czigléczky Gábor 2009.
GPGPU – CUDA 1..
a programegységek között
GPGPU – CUDA 2..
Változók.
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Informatikai gyakorlatok 11. évfolyam
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Az objektum-orientáltság
CUDA – OpenGL.
Előadás másolata:

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 zajlott. A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszírozásával valósul meg.

Alapvető tulajdonságok  A CUDA C egyszerű a C nyelv kiterjesztése a GPU-k elérésére.  Egyszerű szintaktikai kiegészítéseket ad a C nyelvhez.  Nem csak függvénykönyvtár, új vezérlési szerkezeteket, konstrukciókat definiál.  Teljesen kompatibilis a C nyelvvel, a C programok módosítás nélkül használhatóak, de csak a CPU-t fogják használni.  A GPU kódok *.cu fileban vannak megírva, amelyet az NVCC fordító, és egy natív C/C++ fordító együtt kezel. (Lásd később)

CUDA „Hello World”  HelloWorld.cu: #include int main(int argc, char** argv) { printf("Hello World!\n"); return 0; }

CPU és GPU környezet  A CUDA modelljében a CPU és a GPU elkülönülten működnek.  Megkülönböztetünk „host” (gazda) és „device” eszköz környezetet. HostDevice CPU Központi memória GPU Grafikus memória

CPU és GPU függvények  A CPU-n és a GPU-n futtatott kódok jelölőkkel vannak megkülönböztetve  A __global__ jelöléssel ellátott függvények (kernelek) a GPU-n futnak.  A jelöletlen, vagy __host__ jelöléssel ellátott függvényeket a CPU futtatja.  A GPU kódokat CPU függvényről indíthatjuk a >> direktívával kiegészített függvényhívás-ként.  Pl.: kernel >>()

Egyszerű kernel írása #include __global__ void kernel(void) { return; } int main(int argc, char** argv) { kernel >>(); printf("Hello World!\n"); return 0; }

CPU és GPU memória  A CPU és a GPU külön memóriát is kezel:  A CPU-hoz tartozó, központi memória kezelés ugyanúgy működik, mint a standard C/C++ kódok esetében.  A GPU-hoz tartozó grafikus memória a CUDA Runtime függvényein keresztül történik.  Memóriafoglalás: cudaMalloc(…)  Adat másolás: cudaMemcpy(…)  Memória felszabadítás: cudaFree(…)

Összeadás a GPU-n #include __global__ void add( int a, int b, int* c ) { *c = a + b; return; }

Összeadás a GPU-n int main(int argc, char** argv) { int c; int* dev_c; cudaMalloc((void**)&dev_c, sizeof(int) ); add >>(2, 7, dev_c); cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); printf("a + b = %d\n", c); cudaFree(dev_c) return 0; }

CUDA memóriakezelő függvények cudaError_t cudaMalloc(void** devPtr, size_t size) Paraméterek: devPtr – pointer a lefoglalt memória címének size – lefoglalni kívánt memóriaterület mérete Visszatérési érték: Az eredmény hibakódja (cudaSuccess, cudaErrorMemoryAllocation)

CUDA memóriakezelő függvények cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, enum cudaMemcpyKind kind) Paraméterek: dst – cél memóriaterület mutatója src – forrás memóriaterületének mutatója count – másolni kíván byte-ok száma kind – Másolás típusa:  cudaMemcpyHostToHost,  cudaMemcpyHostToDevice,  cudaMemcpyDeviceToHost,  cudaMemcpyDeviceToDevice Visszatérési érték: Az eredmény hibakódja (cudaSuccess, cudaErrorInvalidValue, cudaErrorInvalidDevicePointer, cudaErrorInvalidMemcpyDirection)

CUDA memóriakezelő függvények cudaError_t cudaFree(void* devPtr) Paraméterek: devPtr – a felszabadítani kívánt memóriaterület mutatója Visszatérési érték: Az eredmény hibakódja (cudaSuccess, cudaErrorInvalidDevicePointer, cudaErrorInitializationError)

Vektorok összeadása int* a, b, c; //... for(i=0; i<n; i++) { c[i] = a[i] + b[i]; }

Vektorok összege GPU-n  04_VectorAdd.cu  A GPU-n a kernelek több példányban párhuzamosan indíthatóak el.  Az indítási struktúrát függvényhíváskor a >> operátorral adhatjuk meg.  pl.: add >>(…) az add függvényt N példányban (blokkban) indítja el.  Minden vektor indexhez külön szálat indíthatunk.  Az indexelés a függvényen belül történik  A kernelen belül a szálak egy egyedi azonosítót kapnak, amelyet a blockIdx beépítet változón keresztül érhetünk el.  Ez egy 3 dimenziós struktúra, aminek most csak az leső, x dimenzióját használjuk.

n. szál 6. szál 5. szál 4. szál 3. szál 2. szál 1. szál Vektorok összege GPU-n  A GPU kódban általában minden adatelemhez külön feldolgozó szálat rendelünk. A[1]A[2]A[3]A[4]A[5]A[6]…A[n] B[1]B[2]B[3]B[4]B[5]B[6]…B[n] C[1]C[2]C[3]C[4]C[5]C[6]…C[n]

Vektorok összege GPU-n __global__ void addKernel(int* a, int* b, int* c) { int tid = blockIdx.x; if(tid < N) c[tid] = a[tid] + b[tid]; return; } __global__ void addKernel(int* a, int* b, int* c) { int tid = blockIdx.x; if(tid < N) c[tid] = a[tid] + b[tid]; return; } __global__ void addKernel(int* a, int* b, int* c) { int tid = blockIdx.x; if(tid < N) c[tid] = a[tid] + b[tid]; return; } __global__ void addKernel(int* a, int* b, int* c) { int tid = blockIdx.x; if(tid < N) c[tid] = a[tid] + b[tid]; return; } 1. blokk 3. blokk 2. blokk 4. blokk

Vektorok összege GPU-n  Az indexelés a függvényen belül történik  A kernelen belül a szálak egy egyedi azonosítót kapnak, amelyet a blockIdx beépítet változón keresztül érhetünk el.  Ez egy 3 dimenziós struktúra (x, y, z) indexekkel.  Most csak az leső, x dimenzióját használjuk. __global__ void addKernel(int* a, int* b, int* c) { int tid = blockIdx.x; if(tid < N) c[tid] = a[tid] + b[tid]; return; }

Ami kimaradt  A blokkokat lehet 2-, vagy 3- dimenziós struktúrában (rácsban) is indítani. Ilyenkor a >> operátor első tagját dim3 típusú struktúra-ként kell megadni.  Hasznos lehet 2-3 dimenziós adatok feldolgozáskor  Pl.: mátrixok, képek, térfogati adatok, stb…  A 2D tömbstruktúrát minden GPU támogatja, a 3D-t csak az újabbak.  A rács méretére gpu-tól függően különböző korlátozásaok lehetnek.  A megkötésekkel kapcsolatban lásd: CUDA C Programming guide - G függlék /számítási képességek/)

Ami kimaradt - 2  A függvényeknek a CUDA kódban valójában 3 típusát különböztetjük meg.  A megkülönböztetésre a függvény definíciója elé írt előjegyzést használjuk.  __host__: CPU-n fut.  __global__: GPU-n fut, a CPU-ról hívható.  __device__: GPU-n fut, GPU kódból hívható.  És nem mellékesen a GPU kód kezeli az objektumorientáltságot is.

Egy érdekes példa  Julia halmaz megjelenítése a GPU-n.  Adott egy Z konstans komplex szám, és egy Z 0 kiindulópont.  A Z 0 pont eleme a Julia halmaznak, ha a Z n+1 = Z n *Z n + C sorozat konvergens.  2-D képpont koordinátákra fordítva kezdőpont meghatározása: Z 0 = x + y*i  Ha egy (x, y) pixel koordinátához tartozó szám konvergens sorozatot ad, akkor egy adott színt adunk a pixelnek, ha nem, akkor egy másik színt.

Példa megvalósítása a GPU-n for (i=0; i<200; i++) { a = a * a + c; if (a.magnitude2() > 1000) return 0; } return 1;

Eredmény