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 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ásokGPU 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ásokGPU Mem. kez.Kernel kez. Memcpy: a -> GPU Memcpy: b -> GPU Memcpy: d -> GPU Memcpy: c -> CPU a -> GPU b -> GPU a + b d -> 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 ) cudaError_tcudaSetDevice 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