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

Slides:



Advertisements
Hasonló előadás
CUDA.
Advertisements

3. A programozás eszközei, programozás-technikai alapismeretek
V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Parallel.For()
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás.
BMEEOVKMKM4 Házi feladat megoldás áttekintés
Digitális képanalízis
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
 Adat- és feladat párhuzamos modell  Az ISO C99 szabvány részhalmaza  párhuzamos kiegészítésekkel  Numerikus műveletek az IEEE754 alapján  Beágyazott.
 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC.
Rekurzió (Horváth Gyula és Szlávi Péter előadásai felhasználásával)
Bevezetés a Java programozásba
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalá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.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Szoftver bonyolultsági mértékek alkalmazási területei Király Roland 2011.
Programozás I. Horváth Ernő.
Utasítás végrehajtás lépései
PIC processzor és környezete
CISC - RISC processzor jellemzők
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
A RobotinoView programozása
Kivételkezelés a C++ nyelvben Bevezetés
1 Operációs rendszerek Az NT folyamatok kezelése.
1 Operációs rendszerek Az ütemezés megvalósítása.
Számítógépes grafika 3. gyakorlat.
A számítógép teljesítménye
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
A legolcsóbb szuperszámitógép
GPGPU A grafikus hardver általános célú felhasználása
Podoski Péter és Zabb László. Bevezető Algoritmus-vizualizáció témakörében végeztünk kutatásokat és fejlesztéseket Felmértük a manapság ismert eszközök.
Programozás I. Típus algoritmusok
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.
A Visual Basic nyelvi elemei
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.
ProgramozásProgramozás célja hosszabb számítások elvégzése ill. kiíratása akkor érdemes programot írni, ha sok számolni való van illetve ha ugyanazt az.
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.
DLL használata és készítése Feladat
ifin811/ea1 C Programozás: Hardver alapok áttekintése
1 Számítógépek felépítése 5. előadás a CPU gyorsítása, pipeline, cache Dr. Istenes Zoltán ELTE-TTK.
Képek, képfeldolgozás Szirmay-Kalos László.
Informatikai gyakorlatok 11. évfolyam
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Utasítás és blokk. Elágazás típusai, alkalmazása Kovács.
1 A számítógépek felépítése jellemzői, működése. 2 A számítógép feladata Az adatok Bevitele Tárolása Feldolgozása Kivitele (eredmény megjelenítése)
Scilab alapok Mi a Scilab ? A Scilab telepítése
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Alapvető programozási tételek megvalósítása Czigléczky Gábor 2009.
Google Summer of Code 2015 OpenCL image support for the r600g driver.
Bevezetés.  Miért …  … egyszálúan programozunk?  … probléma ez?  Hogyan …  … változik ez?  … tudjuk kihasználni?  Megéri-e párhuzamosítani?
Operációs rendszerek Az operációs rendszerek működésének alapfogalmai.
Alkalmazásfejlesztés F#-ban Dunaújvárosi Főiskola Kiss Gyula mérnökinformatikus hallgató Nemzeti Tehetség Program Tehetségútlevél Program „NTP-TÚP ”
Programozási nyelvek csoportosítása.
Szécsi László 3D Grafikus Rendszerek 15. előadás
Adatstruktúrák Algoritmusok Objektumok
GPGPU – CUDA 1..
a programegységek között
Programozási nyelvek típusossága.
Beépített függvények használata programozáskor
Lineáris egyenletrendszerek megoldása
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
GPGPU – CUDA 2..
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Bevezetés GPGPU Alkalmazások.
Informatikai gyakorlatok 11. évfolyam
A számítógép működésének alapjai
Algoritmus készítés.
CUDA – OpenGL.
Pipeline példák (IMSC, 2019).
Cache példák 2019 (IMSC).
Előadás másolata:

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

I. GPGPU és a CUDA

GPGPU General Purpose Computation on GPUs

CPU vs GPU

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

A CUDA Architektúra

CUDA támogatottság Java Python, Fortran, … Windows / Linux / MacOS C/C++ C Runtime for CUDA .NET nyelvek CUDA.NET – http://www.gass- ltd.co.il/en/products/cuda.net Java JaCuda – http://jacuda.wiki.sourceforge.net Python, Fortran, … Windows / Linux / MacOS

Kernelfüggvények

Szálhierarchia

Memóriahierarchia

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

1.0 - ás számítási kapacitás: rácsdimenziók : 65535 , 65535 , 1 blokkdimenziók : 512 , 512 , 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

II. CUDA programozás

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

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);

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

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);

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);

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

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

III Párhuzamosan megvalósított algoritmusok

Kulcscsontkeresés

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…

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

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

Mátrix konvolúció

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

Tesztelés: Prewitt operátor

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

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

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

Teszt

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 20-30-szoros gyorsítás reális A tüdőkörvonal meghatározás inkább az utóbbi jellegű