CUDA C/ C ++ programozás

12
CUDA C/C++ programozás Egyéb eszköztárak vegyesen 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 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.

description

CUDA C/ C ++ programozás. Egyéb eszköztárak vegyesen. 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 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. - PowerPoint PPT Presentation

Transcript of CUDA C/ C ++ programozás

Page 1: CUDA C/ C ++ programozás

CUDA C/C++ programozás

Egyéb eszköztárak vegyesen

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 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.

Page 2: CUDA C/ C ++ programozás

Ami eddig kimaradt

Események

Sztream-ek

Fejlett memóriakezelés

Több GPU használata

Egyéb CUDA eszközök

Page 3: CUDA C/ C ++ programozás

Események

A CUDA programokban létrehozhatunk eseményeket.

Az kód adott pontján lehet rögzíteni őket.

A kódban szinkronizációs pontok tehetők, amik megvárják az egyes események bekövetkezését.

Időbélyegzővel ellátottak.

Kiválóan használhatóak:

Szinkronizációra,

Időmérésre

Page 4: CUDA C/ C ++ programozás

Események kezelése

Deklarálás:

cudaEvent_t típusú adattaggal.

Létrehozás:

cudaError_t cudaEventCreate ( cudaEvent_t* event )

Rögzítés:

cudaError_t cudaEventRecord ( cudaEvent_t event, cudaStream_t stream = 0 )

Egyéb (időmérés):

cudaError_t cudaEventElapsedTime ( float* ms,cudaEvent_t start,cudaEvent_t end )

Megszűntetés:

cudaError_t cudaEventDestroy ( cudaEvent_t event )

Esemény bevárása:

cudaError_t cudaEventSynchronize ( cudaEvent_t event )

Page 5: CUDA C/ C ++ programozás

Példa eseményhasználatára

Kernel futási idejének mérese:

// ...

int main(...) { cudaEvent_t start, stop; float ellapsedTime;

cudaEventCreate(&start); cudaEventCreate(&stop);

// ...

cudaEventRecord(start, 0);

kernel<<< ... >>>( ... );

cudaEventRecord(stop, 0); cudaEventSynchronize(stop) cudaEllapsedTime(&ellapsedTime, start, stop);

// ...}

Page 6: CUDA C/ C ++ programozás

Page-locked-, Mapped- memory

A CUDA a központi memória kezeléséhez is ad extra eszközöket a cudaHostAlloc függvénnyel.

„Page-locked” memória.

Nem lapozható memóriaterület a központi memóriába.

Nem kerül ki a háttértárra, ezért nem kell várni az elérésekkor.

A GPU nem vár a lapozásra

„Mapped” (zero-copy) memória:

A központi memóriában található nem lapozható memória.

A GPU kernel közvetlenül is képes elérni (olvasni/írni)

Gyorsítja a programot, ha egy adatra csak egyszer van szükség.

(Illetve, ha a GPU-nak nincs dedikált memóriája)

Page 7: CUDA C/ C ++ programozás

CUDA stream-ek

Egyes GPU-k képesek aszinkron módon párhuzamosan futtatni egy kernelt, és egy, vagy több memóriamozgató műveletet végezni. „Device Overlap” paraméter.

A programok működését felgyorsíthatjuk, ha párhuzamosíthatunk bizonyos műveleteket.

Ennek a kihasználásához CUDA stream-ek definiálhatóak. Egymástól független utasítás sorozatok sorok.

Átlapolva működhetnek.

De nem mindig gyorsít a kódon. Körültekintően kell vele bánni.

Page 8: CUDA C/ C ++ programozás

Stream példa egy szálon

2 vektorpár összeadás: a+b = c, d+e = e

utasítások GPU

Mem. kez. Kernel kez.Memcpy: a -> GPU

Memcpy: b -> GPU

Kernel: c = a + b

Memcpy: c -> CPU

Memcpy: d -> GPU

Memcpy: e -> GPU

Kernel: f = d + e

Memcpy: f -> CPU

a -> GPU

b -> GPU

c = a + b

d -> GPU

c -> CPU

e -> GPU

f = d + e

f -> CPU

Page 9: CUDA C/ C ++ programozás

Stream példa két szálon

2 vektorpár összeadás: a+b = c, d+e = f

utasítások GPU

Mem. kez. Kernel kez.

Memcpy: a -> GPU

Memcpy: b -> GPU

Memcpy: d -> GPU

Memcpy: c -> CPU

a -> GPU

b -> GPU

a + bd -> GPU

c -> CPU

e -> GPU

f -> CPU

d+e

Memcpy: d -> GPU

Memcpy: e -> GPU

Memcpy: d -> GPU

Memcpy: f -> CPU

1. stream 2. stream

Page 10: CUDA C/ C ++ programozás

Több GPU használata

Ha a számítógépben több GPU is van, akkor lehet azokat felváltva/egyszerre használni.

Működés:

Csak ki kell választani, hogy melyik GPU-ra akarunk küldeni feladatot:

cudaError_t cudaSetDevice ( int  device )

Viszont figyelni kell:

Az adat konzisztenciára, ha átlapoló adatokkal dolgoznak a GPU-k.

A szinkonizációra.

Pl.: Itaratív simítás több GPU-n?

Page 11: CUDA C/ C ++ programozás

Egyéb CUDA eszközök

CUFFT CUDA-ban megírt Gyors Fourier transzformáció.

Működik 1-, 2, és 3-Dimenziban.

Valós, és komplex adatokra is.

CUBLAS CUDA Basic Linear Algebra Subprograms

Lineáris algebra függvénykönyvtár CUDA-hoz.

Alapvető mátrix/vektorműveletek (addíció, szorzás, stb.)

Ritka mátrixok kezelése.

Valós, és komplex adatok.

Page 12: CUDA C/ C ++ programozás

CUDA eszközök Kód kezelésre

Debuggerek:

CUDA GDB:

GNU debugger kiterjesztés CUDA-ra.

Parallel Nsight:

Visual Studio kiterjesztés GPU kódok debugolására.

Kód elemzők:

CUDA Visual Profiler