CUDA alapok CUDA projektek. CUDA bemutató. Adatbányászat és Webes Keresés Kutatócsoport SZTAKI

Hasonló dokumentumok
Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

Párhuzamos és Grid rendszerek

Magas szintű optimalizálás

CUDA haladó ismeretek

OpenCL - The open standard for parallel programming of heterogeneous systems

Grafikus kártyák, mint olcsó szuperszámítógépek - I.

Grafikus kártyák, mint olcsó szuperszámítógépek - II.

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

KÉPFELDOLGOZÓ ALGORITMUSOK FEJLESZTÉSE GRAFIKUS HARDVER KÖRNYEZETBEN

GPU-Accelerated Collocation Pattern Discovery

Babeş Bolyai Tudományegyetem, Kolozsvár Matematika és Informatika Kar Magyar Matematika és Informatika Intézet

A CUDA előnyei: - Elszórt memória olvasás (az adatok a memória bármely területéről olvashatóak) PC-Vilag.hu CUDA, a jövő technológiája?!

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Szalai Péter. April 17, Szalai Péter April 17, / 36

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Pénzügyi algoritmusok

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Adatbányászati szemelvények MapReduce környezetben

7. Régió alapú szegmentálás

Szimuláció RICHARD M. KARP és AVI WIGDERSON. (Készítette: Domoszlai László)

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD

értékel függvény: rátermettségi függvény (tness function)

GPGPU. GPU-k felépítése. Valasek Gábor

Jurek Zoltán, Tóth Gyula

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Alap-ötlet: Karl Friedrich Gauss ( ) valószínűségszámítási háttér: Andrej Markov ( )

értékel függvény: rátermettségi függvény (tness function)

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon. Készítette: Kovács Andor. 2011/2012 első félév

Java és web programozás

Heterogén számítási rendszerek gyakorlatok (2017.)

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Adatszerkezetek 7a. Dr. IványiPéter

Közösség detektálás gráfokban

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése

Keresés képi jellemzők alapján. Dr. Balázs Péter SZTE, Képfeldolgozás és Számítógépes Grafika Tanszék

Rekurzív algoritmusok

GPU-k a gravitációs hullám kutatásban

Eichhardt Iván GPGPU óra anyagai

FEGYVERNEKI SÁNDOR, Valószínűség-sZÁMÍTÁs És MATEMATIKAI

Optimalizálás alapfeladata Legmeredekebb lejtő Lagrange függvény Log-barrier módszer Büntetőfüggvény módszer 2017/

Számítógépes képelemzés 7. előadás. Dr. Balázs Péter SZTE, Képfeldolgozás és Számítógépes Grafika Tanszék

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

egy szisztolikus példa

Felvételi tematika INFORMATIKA

3. ZH-ban a minimum pontszám 15

rank(a) == rank([a b])

Aradi Bernadett. 2017/18 ősz. TensorFlow konvolúciós hálózatokhoz 2017/18 ősz 1 / 11

Eichhardt Iván GPGPU óra anyagai

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Gyakori elemhalmazok kinyerése

I. LABOR -Mesterséges neuron

GPGPU-k és programozásuk

Szemidenit optimalizálás és az S-lemma

4. Funkcionális primitívek GPUn

A C programozási nyelv III. Pointerek és tömbök.

Gauss-Seidel iteráció

Szinguláris érték felbontás Singular Value Decomposition

SAT probléma kielégíthetőségének vizsgálata. masszív parallel. mesterséges neurális hálózat alkalmazásával

GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási

A C programozási nyelv III. Pointerek és tömbök.

Gauss elimináció, LU felbontás

Grafikus csővezeték 1 / 44

Számítógépek felépítése

Bevezetés a programozásba I.

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

IBM SPSS Modeler 18.2 Újdonságok

Shor kvantum-algoritmusa diszkrét logaritmusra

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás alapjai 9.Gy: Struktúra 2.

Idegennyelv-tanulás támogatása statisztikai és nyelvi eszközökkel

Matematikai programok

Algoritmuselmélet 7. előadás

Adatszerkezetek és algoritmusok

Partíció probléma rekurzíómemorizálással

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

A félév során előkerülő témakörök

Objektumorientált Programozás VI.

Mutatók és mutató-aritmetika C-ben március 19.

Heterogén számítási rendszerek gyakorlatok (2018.)

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

Gauss-eliminációval, Cholesky felbontás, QR felbontás

Abszolút folytonos valószín ségi változó (4. el adás)

Programozás alapjai II. (7. ea) C++

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Bevezetés a programozásba. 5. Előadás: Tömbök

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Győri HPC kutatások és alkalmazások

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

RHadoop. Kocsis Imre Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Átírás:

SZTAKI 2010

Tartalom 1 2

Tartalom 1 2

GPU-k és a CUDA El zmények grakus kártyák: nagy párhuzamos számítási kapacitás eredetileg csak grakus m veleteket tudtak végezni

GPU-k és a CUDA El zmények grakus kártyák: nagy párhuzamos számítási kapacitás eredetileg csak grakus m veleteket tudtak végezni Compute Unied Device Architecture (CUDA) a CUDA-enabled NVIDIA GPU-kat lehet programozni használhatók a kártya multiprocesszorai és a memóriája Tesla sorozat: már nincs is kép kimenet

Execution model a CUDA kód végrehajtása párhuzamos thread-ekben történik a thread-ek block-okba vannak rendezve egy block thread-jei együtt dolgoznak az egyes block-ok egymástól függetlenül dolgoznak technikai részlet: valójában a thread-ek 32-esével futnak együtt (ez egy warp)

Execution model a CUDA kód végrehajtása párhuzamos thread-ekben történik a thread-ek block-okba vannak rendezve egy block thread-jei együtt dolgoznak az egyes block-ok egymástól függetlenül dolgoznak technikai részlet: valójában a thread-ek 32-esével futnak együtt (ez egy warp) Példa: Kép szegmenseinek feldolgozása minden block egy külön szegmenst dolgoz fel egy block-on belül a thread-ek együtt, párhuzamosan számolják pl. a szegmens átlag színét

Memória fajták I. global a GPU hagyományos értelemben vett memóriája ide/innen tud adatot másolni a host GB-os nagyságrend viszonylag lassú adatátvitel, lassú elérés a GPU-ról, nincs cache

Memória fajták I. global shared a GPU hagyományos értelemben vett memóriája ide/innen tud adatot másolni a host GB-os nagyságrend viszonylag lassú adatátvitel, lassú elérés a GPU-ról, nincs cache egy block thread-jeinek a közös memóriája itt kommunikálnak egymással a thread-ek, valamint itt érdemes tárolni a sokszor elért adatot 16KB (/block) nagyon gyors elérés

Memória fajták II. constant kicsi, gyors, cache-elt elérés memória csak a host tudja módosítani

Memória fajták II. constant kicsi, gyors, cache-elt elérés memória csak a host tudja módosítani regiszterek minden block rendelkezésére áll néhány regiszter, amiket a thread-ek között oszt szét általában csak ciklus- és temp változókat tárol

Memória elérési trükkök, szabályok a globális memória elérésének sok szabálya van, amik betartása felgyorsítja azt (ld. ábra) globális memóriaterületeket texture-nek lehet kinevezni cache-elt elérés, viszont nem írható non-pageable host memória: gyorsabb másolás Két-két példa coalesced és non-coalesced elérésre:

A CUDA programok nyelve a CUDA kód lényegében C kód, néhány kiegészítéssel szintaktikai kiegészítések új függvény qualierek gpu-s függvények hívása

A CUDA programok nyelve a CUDA kód lényegében C kód, néhány kiegészítéssel szintaktikai kiegészítések új függvény qualierek gpu-s függvények hívása új host függvények pl. gpu memória foglalás, másolás, stb.

A CUDA programok nyelve a CUDA kód lényegében C kód, néhány kiegészítéssel szintaktikai kiegészítések új függvény qualierek gpu-s függvények hívása új host függvények pl. gpu memória foglalás, másolás, stb. GPU-specikus függvények, változók threadidx, blockidx, stb. thread-ek szinkronizálása gyors matematikai függvények (exp, sin, stb.)

CUDA kód futtatása a GPU memóriája közvetlenül nem elérhet, így egy CUDA programrészlet futtatása általában így néz ki: 1 GPU memória allokálás 2 adat másolása a host-ról az allokált memóriába 3 GPU függvény hívása, ami feldolgozza az adatot 4 az eredmény másolása a host-ra 5 (GPU memória felszabadítás)

Egy nagyon egyszer példa global void vecmult(float *v, float m) { int i = threadidx.x; v[i] = v[i] * m; } int main() { int N=100; float *v_h;... //v_h allokálás, inicializálás float *v_d; cudamalloc((void**)&v_d, N*sizeof(float)); cudamemcpy(v_d, v_h, N*sizeof(float), cudamemcpyhosttodevice); vecmult<<<1,n>>>(v_d, m); //kernel hívás: 1 block, N thread cudamemcpy(v_h, v_d, N*sizeof(float), cudamemcpydevicetohost); cudafree(v_d); return 0; }

Egy nagyon egyszer példa global void vecmult(float *v, float m) { int i = threadidx.x; v[i] = v[i] * m; } int main() { int N=100; float *v_h;... //v_h allokálás, inicializálás float *v_d; cudamalloc((void**)&v_d, N*sizeof(float)); cudamemcpy(v_d, v_h, N*sizeof(float), cudamemcpyhosttodevice); vecmult<<<1,n>>>(v_d, m); //kernel hívás: 1 block, N thread cudamemcpy(v_h, v_d, N*sizeof(float), cudamemcpydevicetohost); cudafree(v_d); return 0; }

Egy nagyon egyszer példa global void vecmult(float *v, float m) { int i = threadidx.x; v[i] = v[i] * m; } int main() { int N=100; float *v_h;... //v_h allokálás, inicializálás float *v_d; cudamalloc((void**)&v_d, N*sizeof(float)); cudamemcpy(v_d, v_h, N*sizeof(float), cudamemcpyhosttodevice); vecmult<<<1,n>>>(v_d, m); //kernel hívás: 1 block, N thread cudamemcpy(v_h, v_d, N*sizeof(float), cudamemcpydevicetohost); cudafree(v_d); return 0; }

Egy nagyon egyszer példa global void vecmult(float *v, float m) { int i = threadidx.x; v[i] = v[i] * m; } int main() { int N=100; float *v_h;... //v_h allokálás, inicializálás float *v_d; cudamalloc((void**)&v_d, N*sizeof(float)); cudamemcpy(v_d, v_h, N*sizeof(float), cudamemcpyhosttodevice); vecmult<<<1,n>>>(v_d, m); //kernel hívás: 1 block, N thread cudamemcpy(v_h, v_d, N*sizeof(float), cudamemcpydevicetohost); cudafree(v_d); return 0; }

Egy nagyon egyszer példa global void vecmult(float *v, float m) { int i = threadidx.x; v[i] = v[i] * m; } int main() { int N=100; float *v_h;... //v_h allokálás, inicializálás float *v_d; cudamalloc((void**)&v_d, N*sizeof(float)); cudamemcpy(v_d, v_h, N*sizeof(float), cudamemcpyhosttodevice); vecmult<<<1,n>>>(v_d, m); //kernel hívás: 1 block, N thread cudamemcpy(v_h, v_d, N*sizeof(float), cudamemcpydevicetohost); cudafree(v_d); return 0; }

Kernel függvények kernel: a GPU-n futó függvény mindig global void típusú kernelnev<<<blocks,threads>>>(parameterek) blocks, threads lehetnek int-ek, vagy dim3 típusúak, ahol dim3.x,dim3.y,dim3.z adják meg a dimenziókat kernel kódban a dim3 típusú threadidx, blockdim és griddim változók elérhet k a kernel hívás aszinkron (rögtön folytatódik a host kód végrehajtása)

Kernel függvények kernel: a GPU-n futó függvény mindig global void típusú kernelnev<<<blocks,threads>>>(parameterek) blocks, threads lehetnek int-ek, vagy dim3 típusúak, ahol dim3.x,dim3.y,dim3.z adják meg a dimenziókat kernel kódban a dim3 típusú threadidx, blockdim és griddim változók elérhet k a kernel hívás aszinkron (rögtön folytatódik a host kód végrehajtása) kernel csak a host-ról hívható kernelben nem lehet rekurzió nem elérhet k a host függvények, host memória, stb.

shared memória kezelés, szinkronizálás shared változó (vagy tömb) a shared qualier-rel deklarálható shared változók egy block-on belül minden thread számára elérhet k egy block thread-jei a syncthreads() paranccsal szinkronizálhatók

shared memória kezelés, szinkronizálás Példák shared változó (vagy tömb) a shared qualier-rel deklarálható shared változók egy block-on belül minden thread számára elérhet k egy block thread-jei a syncthreads() paranccsal szinkronizálhatók shared int var; //változó shared int arr[10]; //tömb

shared memória példa global void kernelfv(int N, int *array) { const int tid=threadidx.x; shared int sharedarray[maxn]; if (tid < N) sharedarray[tid]=array[tid]; if (tid < N-1) { } sharedarray[tid+1]+=sharedarray[tid]; }...

shared memória példa global void kernelfv(int N, int *array) { const int tid=threadidx.x; shared int sharedarray[maxn]; if (tid < N) sharedarray[tid]=array[tid]; syncthreads(); if (tid < N-1) { } sharedarray[tid+1]+=sharedarray[tid]; } syncthreads();...

shared memória példa global void kernelfv(int N, int *array) { const int tid=threadidx.x; shared int sharedarray[maxn]; if (tid < N) sharedarray[tid]=array[tid]; syncthreads(); if (tid < N-1) { int tmp=sharedarray[tid]; } sharedarray[tid+1]+=tmp; } syncthreads();...

shared memória példa global void kernelfv(int N, int *array) { const int tid=threadidx.x; shared int sharedarray[maxn]; if (tid < N) sharedarray[tid]=array[tid]; syncthreads(); if (tid < N-1) { int tmp=sharedarray[tid]; syncthreads(); } sharedarray[tid+1]+=tmp; } syncthreads();...

shared memória példa global void kernelfv(int N, int *array) { const int tid=threadidx.x; shared int sharedarray[maxn]; if (tid < N) sharedarray[tid]=array[tid]; syncthreads(); } if (tid < N-1) { int tmp=sharedarray[tid]; } syncthreads(); if (tid < N-1) { sharedarray[tid+1]+=tmp; } syncthreads();...

Tartalom 1 2

Tartalom 1 2

Bevezetõ : Singular Value Decomposition A feladat Egy n n méretû M szimmetrikus, ritka mátrixnak keressük a k legnagyobb szinguláris értékét és a hozzájuk tartozó szinguláris vektorokat, ahol k n.

Bevezetõ : Singular Value Decomposition A feladat Egy n n méretû M szimmetrikus, ritka mátrixnak keressük a k legnagyobb szinguláris értékét és a hozzájuk tartozó szinguláris vektorokat, ahol k n. Alkalmazások gráfok spektrál klaszterezése mátrixok kis rangú közelítése

Algoritmus Algoritmus Ezt a feladatot megoldja a Lánczos-módszer, ami implementálva van a LAPACK programcsomagban. Az algoritmus nagyrészt csak vektormûveleteket (lineáris kombináció, skalárszorzat, stb.) és mátrix-vektor szorzásokat végez. Ezek nyilván jól párhuzamosíthatók.

Algoritmus Algoritmus Ezt a feladatot megoldja a Lánczos-módszer, ami implementálva van a LAPACK programcsomagban. Az algoritmus nagyrészt csak vektormûveleteket (lineáris kombináció, skalárszorzat, stb.) és mátrix-vektor szorzásokat végez. Ezek nyilván jól párhuzamosíthatók. CUDA módosítások 1 vektormûveletek átírása CUDA-ra 2 ritka mátrix-vektor szorzás kernel 3 memóriakezelés

CUDA implementáció, CUBLAS CUBLAS A CUBLAS a BLAS lineáris algebra programcsomag CUDA implementációja. A mátrix-vektor szorzáson kívül minden megvan benne.

CUDA implementáció, CUBLAS CUBLAS A CUBLAS a BLAS lineáris algebra programcsomag CUDA implementációja. A mátrix-vektor szorzáson kívül minden megvan benne. Mátrix-vektor szorzás 1 minden block a szorzat egy szeletét számolja ki 2 az egyes block-ok soronként számolják az eredményt 3 a k. thread az adott sor k, 2k,... -adik elemeivel számol 4 a sor végére érve a thread-ek összesítik az eredményt (scan: ld. kés bb)

Memória gondok a használt GPU memória 2 GB, ennél nagyobb mátrixokra is szerettünk volna futtatni megoldás: concurrent copy and execution a GPU egyszerre számol az adat egy szeletével, és másolja a GPU memóriába a következ szeletet

Memória gondok a használt GPU memória 2 GB, ennél nagyobb mátrixokra is szerettünk volna futtatni megoldás: concurrent copy and execution a GPU egyszerre számol az adat egy szeletével, és másolja a GPU memóriába a következ szeletet minden mátrix szorzásnál az egész adatot meg kell mozgatni, ez túl lassú (mert túl sok a mátrix szorzás az algoritmusban)

Eredmények Méret, elemek CPU CUDA 10.000 10.000, 1.000.000 65 sec 5 sec 10.000 10.000, 4.000.000 191 sec 8 sec 20.000 20.000, 1.600.000 88 sec 28 sec 20.000 20.000, 4.000.000 207 sec 35 sec 20.000 20.000, 16.000.000 810 sec 53 sec

Tartalom 1 2

Bevezetõ A feladat Egy képet szeretnénk feldarabolni nagyjából k részre úgy, hogy az egyes részek összefügg k legyenek.

Bevezetõ A feladat Egy képet szeretnénk feldarabolni nagyjából k részre úgy, hogy az egyes részek összefügg k legyenek.

Naiv algoritmus Harish et al. Fast Minimum Spanning Tree for Large Graphs on the GPU iteratív minimális feszít fa algoritmus kezdetben minden pont egy fa, minden iterációban szomszédos fákat egyesít alkalmazható (kezdetleges) kép szegmentálásra scan és sort m veletekb l épül fel

Naiv algoritmus Harish et al. Fast Minimum Spanning Tree for Large Graphs on the GPU iteratív minimális feszít fa algoritmus kezdetben minden pont egy fa, minden iterációban szomszédos fákat egyesít alkalmazható (kezdetleges) kép szegmentálásra scan és sort m veletekb l épül fel CUDPP Library A CUDPP a sort és scan m veletek CUDA implementációját tartalmazó library

Scan prex összeg: prfsum[i] = i j=0 v[i] a scan a prex összeg általánosítása: + helyett ϕ asszoc. m velet scan[i] = ϕ (scan[i 1], v[i]) ebben az algoritmusban csak + és min -scan nagyon sokszor alkalmazható jól párhuzamosítható segmented scan: egy vektort szeletenként scan-elünk (de ezt egy scan m velet végzi el)

Párhuzamos scan

Az algoritmus részletei Egy iteráció lépései: 1 segmented minscan az (élsúly, végpont) párokra minden pont legközelebbi, legkisebb címkéj szomszédja successor graph S

Az algoritmus részletei Egy iteráció lépései: 1 segmented minscan az (élsúly, végpont) párokra minden pont legközelebbi, legkisebb címkéj szomszédja successor graph S 2 S-ben 2 hosszú körök lehetnek, ezeket eltávolítjuk 3 S-ben pointer ugrással mindenki a reprezántánsára mutat

Az algoritmus részletei Egy iteráció lépései: 1 segmented minscan az (élsúly, végpont) párokra minden pont legközelebbi, legkisebb címkéj szomszédja successor graph S 2 S-ben 2 hosszú körök lehetnek, ezeket eltávolítjuk 3 S-ben pointer ugrással mindenki a reprezántánsára mutat 4 reprezentáns szerint rendezünk, ag-ekkel bejelöljük a határokat 5 +scan-eljük a ag-eket új címkék

Az algoritmus részletei Egy iteráció lépései: 1 segmented minscan az (élsúly, végpont) párokra minden pont legközelebbi, legkisebb címkéj szomszédja successor graph S 2 S-ben 2 hosszú körök lehetnek, ezeket eltávolítjuk 3 S-ben pointer ugrással mindenki a reprezántánsára mutat 4 reprezentáns szerint rendezünk, ag-ekkel bejelöljük a határokat 5 +scan-eljük a ag-eket új címkék 6 (kezd pont, végpont, élsúly) hármasok rendezésével megkapjuk az új gráf éleit

Végs változat, eredmények az új gráf éleinek létrehozásakor nem a minimális súlyt választjuk, hanem összeadjuk a megfelel élek súlyát átlag súly ez szintén megy scan-nel a szegmensek belsejében is sok minden számolható scan-nel (pl. átlag szín) egy kép 100 szegmensre vágása kb. 3-4 sec.

Tartalom 1 2

Bevezetõ Gaussian Mixture Model azt feltételezzük, hogy a klaszterezend pontok K db. d-dim. Gauss eloszlásból származnak p i valószín séggel kiválasztjuk az i-edik Gauss-t, majd ebb l sorsolunk egy pontot az N i (µ i, σ i ) eloszlás szerint a modell paraméterei: p i, µ i, σ i

Bevezetõ Gaussian Mixture Model azt feltételezzük, hogy a klaszterezend pontok K db. d-dim. Gauss eloszlásból származnak p i valószín séggel kiválasztjuk az i-edik Gauss-t, majd ebb l sorsolunk egy pontot az N i (µ i, σ i ) eloszlás szerint a modell paraméterei: p i, µ i, σ i Alkalmazások, el nyök nom klaszterezés (csak valószín ségeket mond) a k-means a egy spec. esete (σ i 0) átfed klaszterek detektálása, stb.

EM algoritmus, párhuzamosítás EM algoritmus iteratív algoritmus 1 kiszámolja a p nk = P (n. pont a k. klaszterbe tartozik) valószín ségeket 2 p nk -k alapján frissíti a modell paramétereit a likelihood-fv. lok. maximumába konvergál

EM algoritmus, párhuzamosítás EM algoritmus iteratív algoritmus 1 kiszámolja a p nk = P (n. pont a k. klaszterbe tartozik) valószín ségeket 2 p nk -k alapján frissíti a modell paramétereit a likelihood-fv. lok. maximumába konvergál Párhuzamosítás a klaszterek paraméterei egymástól függetlenül frissíthet k egy klaszteren belül is sok számolás kell minden blokk egy klasztert számol ez csak addig m ködik, amíg N K elég kicsi (mert így az összes p nk -nak egyszerre rendelkezésre kell állni)

Részletek - algoritmus, numerikus trükkök Memóriagazdaságos párhuzamosítás az algoritmus nagy része sok tagú összegek számolásából áll az 1 block/klaszter munkamegosztás helyett egymás után dolgozzuk fel a klasztereket az összeg egy-egy részét számolják a block-ok a végén a block-ok részeredményeit egy újabb kernel összeadja

Részletek - algoritmus, numerikus trükkök Memóriagazdaságos párhuzamosítás az algoritmus nagy része sok tagú összegek számolásából áll az 1 block/klaszter munkamegosztás helyett egymás után dolgozzuk fel a klasztereket az összeg egy-egy részét számolják a block-ok a végén a block-ok részeredményeit egy újabb kernel összeadja Numerikus trükkök normális eo. s r ségfv.-eket kell számolni ez sok alulcsorduláshoz vezet logaritmusokkal kell számolni összegzés: log ( e z i ) = zmax + log ( e z i z max )

Részletek - memóriakezelés Újraszámolás az eredeti EM algoritmusban ki kell számolni az összes p nk valószín séget, majd frissíteni a modellt GPU-n ezek tárolása túl sok memória nem tároljuk, hanem mindig újra kiszámoljuk; ez elhanyagolható pluszmunka

Részletek - memóriakezelés Újraszámolás az eredeti EM algoritmusban ki kell számolni az összes p nk valószín séget, majd frissíteni a modellt GPU-n ezek tárolása túl sok memória nem tároljuk, hanem mindig újra kiszámoljuk; ez elhanyagolható pluszmunka Nagy adat kezelése az adat általában túl nagy a GPU memóriához az -nél alkalmazott trükk itt m ködik! az adatot feldaraboljuk, és amíg a GPU számol egy szeleten, addig párhuzamosan másoljuk a következ t itt elég sok a számítás ahhoz, hogy ez gyors legyen

Eredmények nagy adaton kb. 70-szeres gyorsulás!