CUDA C/ C ++ programozás
-
Upload
hilel-stanley -
Category
Documents
-
view
18 -
download
0
description
Transcript of 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.
Ami eddig kimaradt
Események
Sztream-ek
Fejlett memóriakezelés
Több GPU használata
Egyéb CUDA eszközök
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
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 )
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-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)
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.
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
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
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?
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.
…
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