Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor

Hasonló előadás


Az előadások a következő témára: "Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor"— Előadás másolata:

1 Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Orvosi képfeldolgozási algoritmusok párhuzamos megvalósítása CUDA technológiával Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor

2 I. GPGPU és a CUDA

3 GPGPU General Purpose Computation on GPUs

4 CPU vs GPU

5 NVIDIA® CUDA™ GPGPU elősegítése Compute Unified Device Architecture
általános programozhatóság shader-nyelvek számítógépes grafika skálázhatóság szál-hierarchia memória-hierarchia

6 A CUDA Architektúra

7 CUDA támogatottság Java Python, Fortran, … Windows / Linux / MacOS
C/C++ C Runtime for CUDA .NET nyelvek CUDA.NET – ltd.co.il/en/products/cuda.net Java JaCuda – Python, Fortran, … Windows / Linux / MacOS

8 Kernelfüggvények

9 Szálhierarchia

10 Memóriahierarchia

11 NVIDIA GeForce 9800GTX+ 16 multiprocesszor 8 szálprocesszor / MP
Memória: 512MB GDDR3 256-bit busz 1100 MHz 70.4 GB/s 1.1-es számítási kapacitás

12 1.0 - ás számítási kapacitás:
rácsdimenziók : , , 1 blokkdimenziók : , , 64 szál/proc : 512 konstans memória : 64KB MP : 8KB regiszter/MP : 8192 aktív blokk : 8 atív szál : 768 1.1 - es számítási kapacitás: 32-bites atomi függvények

13 II. CUDA programozás

14 Program felépítés A hoszton és az eszközön futó kód együtt
C nyelvi kiterjesztések Szétválasztás fordítási időben Ajánlott fejlesztőkörnyezet: Microsoft Visual Studio

15 Nyelvi kiterjesztések - függvények
__host__ a hoszton fut, csak a hosztról lehet hívni __device__ az eszközön fut, csak az eszközről hívható __global__ kernel függvény a párhuzamosítás eszköze az eszközön fut, csak a hosztról lehet hívni Pl.: deklaráció: __global__ void func(float* parameter); meghívás: func<<<dimGrid, dimBlock>>>(parameter);

16 Nyelvi kiterjesztések - változók
__device__ az eszköz globális memóriájában foglal helyet __shared__ egy szál blokk közös memóriájában van csak a blokkban lévő szálakból érhető el __constant__ az eszköz konstans memóriaterületén helyezkedik el minden szálból, ill. a hosztról is elérhető Beépített változók (kernel függvényekben) gridDim, blockDim blockIdx, threadIdx

17 Példa – mátrix összeadás
__global__ void matAdd(float A[N][N], float B[N][N], float C[N][N]) { int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * blockDim.y + threadIdx.y; if (i < N && j < N) C[i][j] = A[i][j] + B[i][j]; } int main() // kernel hivas dim3 dimBlock(16, 16); dim3 dimGrid((N + dimBlock.x – 1) / dimBlock.x, (N + dimBlock.y – 1) / dimBlock.y); matAdd<<<dimGrid, dimBlock>>>(A, B, C);

18 Memória menedzsment Textúra memória: cache-elt
foglalás, felszabadítás: cudaMalloc(void** ptr, size_t nbytes); cudaFree(void* ptr); másolás: cudaMemcpy(void* dst, void* src, size_t nbytes, enum cudaMemcpyKind direction);

19 Szinkronizáció Szálak között Hoszt - eszköz kernel hívás aszinkron
memória másolás szinkron Szálak között ha több szál írja/olvassa ugyanazt a memóriaterületet, a sorrend nem determinisztikus megoldás: __syncthreads(); szinkronizációs pont: csak akkor halad tovább a végrehajtás, ha a blokkban minden szál eljutott eddig az utasításig

20 CUDA program általános menete
Adatok beolvasása a hoszton Adatok másolása a hosztról az eszköz globális memóriájába Kernel függvény hívása adatok másolása a globális memóriából a közös memóriába számítások párhuzamos eredmények visszaírása a közös memóriából a globális memóriába Eredmény másolása az eszközről a hoszt memóriájába Eredmény kiírása

21 III Párhuzamosan megvalósított algoritmusok

22 Kulcscsontkeresés

23 Kulcscsontkeresés Előfeldolgozás (gyors)
Radon transzformáció (~1-2 mp) kulcscsont főtengelyének meghatározása Snake algoritmus (~2-3 mp): Kulcscsont körvonalának iteratív meghatározása Kulcscsont-eltűntetés…

24 6 5 5 4 3 2 1 Előfeldolgozás Bejövő kép Gauss szűrés Gradiens számítás
Bejövő képpel pixelenkénti szorzás Kulcscsont iránya szerinti szurés Maximális értékek „elfojtása”  Kimeneti kép 6 5 5 4 3 2 1

25 Radon-transzformáció
(2D-s, vonal szerinti Randon transzformáció) 1 -1 -90° -45° 45° 90°

26 Mátrix konvolúció

27 Párhuzamos megvalósítás
Az eredmény mátrix minden egyes eleméhez külön szál Egy szálon belül az összeg kiszámítása for ciklussal Blokk méret: 16x16 Textúra memória használata

28 Tesztelés: Prewitt operátor

29 FFT DFT: Radix-2 FFT: A A+B A-B B

30 Butterfly diagram W80 W80 W82 W80 W80 W81 W80 W82 W80 W83 W80 W82 x(0)

31 Párhuzamos megvalósítás
Annyi szál, ahány pillangó egy szinten (N/2) Minden iterációban minden szál egy pillangó műveletet végez Közös memória használata __syncthreads() iterációnként 2D FFT: 1D FFT-k sorozata horizontálisan, majd vertikálisan

32 Teszt

33 Kitekintés 100-szoros gyorsítás az elvi határ
Számításintenzív feladatoknál (ahol sok egyszerű számolási műveletet végzünk egy adattal) ez jó közelítéssel elérhető Memóriaintenzív feladatoknál szoros gyorsítás reális A tüdőkörvonal meghatározás inkább az utóbbi jellegű


Letölteni ppt "Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor"

Hasonló előadás


Google Hirdetések