KUTATÁSOK INFORMATIKAI TÁMOGATÁSA Dr. Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar Alkalmazott Informatikai Intézet
Alapvető jellemzői NVIDIA GTX 1080 2560 végrehajtó egység 8.22 TFlops
Intel ASCI Red (2000 Top 1) Alapvető jellemzői 6000 pentium processzor 2.3 TFlops
Intel ASCI White (2001-2002 Top1) Alapvető jellemzői 8192 IBM Power3 processzor 12.2 TFlops
Történeti áttekintés GPU programozás sajátosságai Gyakorlati alkalmazások
A videokártya a számítógép megjelenítésért felelős alkotórésze Egyidős a PC-k megjelenésével Alaplapra integrált változatok Különálló bővítőkártya változatok Fejlesztések Csatolók fejlesztése Felbontás növelése Színmélység növelése Grafikus kártya Frissítési frekvencia növelése
90-es évektől kezdve általánossá vált a 3D megjelenítés Játékokban Grafikai programokban Tervező programokban Stb. Erre több lehetséges algoritmus is ismert Sugárkövetés Raszterizálás 3D megjelenítés A gyakorlatban főleg ez utóbbi terjedt el
Egy hálóval írja le a felületet, ami tipikusan háromszögekből áll Megfelelően sűrű háló esetén az eredmény már tökéletes További műveletek Z távolság megállapítása Árnyékolás Textúrázás Előnye Gyorsan végrehajtható Jól párhuzamosítható Raszterizálás
Alapvető lépések Háromszögek pontjainak leképezése a képernyő síkjába Bemenet: modell pontjai (x, y, z koordináták), kamera helyzete Kimenet: pontok x, y koordinátái Egyszerű transzformáció A képernyő síkjában lévő háromszögek kirajzolása Bemenet: a háromszögek pontjainak x, y koordinátái Kiegészítés: szín, textúra, fényhatások Kimenet: a képernyőre kirajzolt háromszög További műveletek Effektek Élsimítás 3D megjelenítés lépései
GPU szerepe a 3D megjelenítésben 90-es évek közepén nyilvánvalóvá vált, hogy A 3D megjelenítés egyre több helyen megjelent Szinte korlátlanul erőforrásigényes (gyorsabb eszköz nagyobb hálósűrűség szebb kép) Az alaplépései azonosak az alkalmazástól függetlenül Grafikai megjelenítésre speciális API-k DirectX OpenGL Fentiek miatt célszerű hardveres megoldást keresni Különálló 3D gyorsítókártyák Grafikus kártyákba integrált megoldások
Alapvető shader típusok Vertex shader Feladata a 3D modell pontjainak leképezése a 2D síkba Alapvetően lebegőpontos számokkal dolgozik Pixel shader Feladata a 2D koordináták által megadott háromszögek kirajzolása Alapvetően színekkel dolgozik Geometria shader Shaderek Feladata a geometria futásközbeni változtatása Használata csak később jelent meg Különböző hardver elemek valósították meg Párhuzamosítás shaderek számának növelése
Több shader megjelenése 2007 - NVIDIA GT8800 112 végrehajtó egység
Még több shader megjelenése 2008 - NVIDIA GTX 280 240 végrehajtó egység
És még több shader megjelenése 2010 - NVIDIA GTX 580 512 végrehajtó egység
Annál is több shader megjelenése 2012 - NVIDIA GTX 680 1536 végrehajtó egység
Még annál is több shader 2014 - NVIDIA GTX 980 2048 végrehajtó egység
Sok shader megjelenése 2016 - NVIDIA GTX 1080 2560 végrehajtó egység
A megvalósítás során problémát okoz a megfelelő arányok eltalálása Összetett árnyékolást használó képek Kevés vertex shader Sok pixel shader Bonyolult geometriát használó programok Sok vertex shader Shaderek elosztása Kevés pixel shader Megadott költség mellett nehéz olyan kártyát készíteni, ami minden célra tökéletesen alkalmas
Megoldás: megpróbálták közelíteni egymáshoz az egymástól eltérő részegységek felépítését Ez több éven keresztül történt meg Shader Model 1.x Shader Model 2.x Shader Model 3.x Shader generációk Unified Shader Model Végeredményként a közelítés elérte a végső célt, és a grafikus kártyákra már csak egy fajta, általános célú végrehajtó elemekek kerültek
GPGPU programozás A grafikus kártyák lehetővé tették a shaderek direkt programozását Ezt alapvetően grafikai funkciókra szánták, de lehetőség nyílt általános célú programok futtatására is (2001 mátrix szorzás megvalósítása) Kezdetben ez csak a grafikai funkciókon keresztül, meglehetősen nehézkesen működött. Ez neveztük GPGPU programozásnak (General Purpose Graphical Processing Unit) A Unified Shader model még vonzóbbá tette ezt a lehetőséget
A grafikus kártya gyártók is felismerték az ebben rejlő piaci lehetőséget Ezért támogatást nyújtottak a saját kártyáikhoz NVIDIA CUDA 1.0 2007 AMD/ATI CTM 2007 Mivel ezek eltérő nyelvek, készült egy szabány is OpenCL 1.0 2009 Ezt követően egyre többen foglalkoztak a témával Egyetemek Kutatóintézetek Nagyvállalatok GPU programozás
Fejlesztői környezetek tovább fejlődtek NVIDIA CUDA 8.0-2016 OpenCL 2.1 2015 AMD/ATI már nem fejleszt külön rendszert A GPU fejlesztés Stabil alapokon áll Elterjedt Jó alternatíva További hiányosságok Napjainkban Elméleti háttér hiányosságok Eszközök fejletlenek
Aktuális teljesítmény
Gyakorlati alkalmazások
Történeti áttekintés GPU programozás sajátosságai Gyakorlati alkalmazások
Előnyök Sok végrehajtó egység Gyors memória Gyors adatátvitel Hátrányok Miért ilyen gyors a GPU? A végrehajtó egységek lassabbak A végrehajtó egységek egyszerűbbek A végrehajtó egységek nem függetlenek A grafikus kártya saját memóriájában dolgozik Biztos hogy gyors? a feladattól függ
Felépítés különbsége Magok: CPU-n kevés, GPU-n sok Gyorsítótár: CPU-n sok, GPU-n kevés Vezérlés: CPU-n összetett, GPU-n egyszerű Függetlenség: CPU magok igen, GPU magok nem
Memória késleltetés CPU-n Memória késleltetés alatt értjük azt az időt, amíg a processzornak várakoznia kell a memóriából kért adatokra Csökkenteni nem, csak elrejteni tudjuk CPU esetén a módszerek a csökkentésre Összetett végrehajtás Utasítás futószalag Spekulatív végrehajtás Elágazás becslés Gyorsítótár használata Az egyszer már beolvasott adatot ne kelljen újra megvárni
Memória késleltetés GPU-n A probléma ugyanaz, de a megoldás egészen más GPU esetén a módszerek a csökkentésre Gyors kontextusváltás Nagy mennyiségű szál futtatása Minimális gyorsítótár A GPU a memória késleltetést úgy próbálja meg elrejteni, hogy egy memóriából való olvasás után a várakozás helyett azonnal elkezd egy másik, aktuálisan futtatható szálat végrehajtani Így nem kell gyorsítótár és bonyolult vezérlés
Egyszerű végrehajtóegységek A vezérlés egyszerűsítése érdekében több ALU-hoz tartozik egy vezérlő egység Ezek összekötve egyidőben csak ugyanazt a műveletet tudják végrehajtani Viszont arra van mód, hogy ezt különböző adatokon végezzék el Emiatt az összes szál célszerűen ugyanazt a kódot kell, hogy futtassa
Elágazások esetén meg kell oldani azt, hogy az összekapcsolt szálak feltételtől függően más kódot futtassanak Erre szolgál a SIMT technika Ez a feltételtől függően bizonyos egységeket lekapcsolhat Az ilyen elágazás végrehajtása nem hatékony emiatt SIMT végrehajtás
Memória hierarchia GPU memória felépítésének jellemzői CPU központi memóriától független Összetett hierarchia, optimalizálás főként kézzel történik Másolási műveletek költségesek
Multiprocesszorok Egyszerű skálázhatóság Független végrehajtás On-chip, off-chip memória
GPU előnyei Összefoglalva Kiemelkedő elméleti csúcsteljesítmény Ideális teljesítmény/költség arány Jól skálázható Dinamikusan fejlődő terület GPU előnyei akkor használhatók ki, ha Nagy mennyiségű szálat kell indítani Ezek lehetőleg mind ugyanazt az algoritmust futtatják Kellően magas a számítás/memóriahozzáférés arány Egyéb szempontok
Szöveg keresés CPU 1 A szöveg amiben keresünk (29 karakter) E z e g y h o s s z ú s z ö v e g e s t e s z t! A szó amit keresünk (6 karakter) s z ö v e g CPU megvalósítás 1 szálon Az eredeti szöveg minden karakteréből indítsunk egy keresést (24 vizsgálandó indulópont) Hasonlítsuk össze az ott lévő betűket a keresendő szó betűivel (1 és 6 lépés között) Értékelés Legjobb esetben műveletek száma: 6 Legrosszabb esetben műveletek száma: 24 6=144
Szöveg keresés CPU 2 A szöveg amiben keresünk (29 karakter) E z e g y h o s s z ú s z ö v e g e s t e s z t! A szó amit keresünk (6 karakter) s z ö v e g CPU megvalósítás 4 magos CPU-val Az eredeti szöveget összuk szét a 4 mag között CPU 1 : 1..6, CPU 2 : 7..12, CPU 3 : 13..18, CPU 4 : 19..24 A 6 hosszú szövegek feldolgozása azonos, mint az előbb Értékelés Műveletek száma: 24 144 Időszükséglet: 6 36
Szöveg keresés - GPU A szöveg amiben keresünk (29 karakter) E z e g y h o s s z ú s z ö v e g e s t e s z t! A szó amit keresünk (6 karakter) s z ö v e g GPU megvalósítás (több ezer végrehajtó egység) Minden végrehajtó egység egy kiinduló pontot vizsgál GPU 1 : 1, GPU 2 : 2, GPU 3 : 3,..., GPU 24 : 24 Minden GPU szál csak egy szót ellenőriz Értékelés Műveletek száma: 24 144 Időszükséglet: 1-6
Szöveg keresés GPU 2 A szöveg amiben keresünk (29 karakter) E z e g y h o s s z ú s z ö v e g e s t e s z t! A szó amit keresünk (6 karakter) s z ö v e g GPU megvalósítás (több ezer végrehajtó egység) Indítsunk 24 6 darab szálat Minden szál csak egy karakter megfelelőségét ellenőrzi Lépésszám Műveletek száma: 144 Időszükséglet: 1
Történeti áttekintés GPU programozás sajátosságai Gyakorlati alkalmazások Képfeldolgozás
Main components Sejtmag Mirigy Surface epithelium
Előfeldolgozás Wallis szűrő Átlagoló szűrő Kiinduló pont választás Feltételezések Régió növelés 1. lépés Lokálisan maximális intenzitás Még nem feldolgozott Nem része egy már létező régiónak
Kontúr felépítése a környező pixelek alapján Régió növelés 2. lépés
Régió növelés 3. lépés Jósági függvény kiszámítása a kontúr pontokra Szín egyezőség Körkörösség Méret Stb. 5 8 5 4
Régió kiterjesztése a legjobb kontúrpont irányába Régió növelés 4. lépés
Előző lépések ismétlése amíg egy megállási feltétel be nem következik Nincs több szomszéd Maximális méret Másik sejtmagba növelés Régió növelés 3. lépés
Szekvenciális megoldás A régió növelés tipikusan nem jól párhuzamosítható feladat Az egyes lépések az előző lépések eredményein alapulnak Inicializálás Szomszédság ellenőrzés Kontúr pontok felvétele Jóság függvény Régió növelés Utófeldolgozás Kilépési feltétel
Párhuzamosítható részek Az egész régiónövelő algoritmus nem párhuzamosítható Az egyes rész lépések azonban igen Inicializálás Szomszédság ellenőrzés Kontúr pontok felvétele Jóság függvény Régió növelés Utófeldolgozás Kilépési feltétel
Jóság függvény számítása Jóság függvény számítás A jóság függvény néhány paramétere minden iterációban változik (régió középpontja, áltagos színe, stb.) Ezért minden iterációban, minden kontúrpont esetén újra kell számolni Számítás párhuzamosítása Minden kontúrpontnál ugyanazt a számítást kell elvégezni, csak más adatokkal Ez tipikusan jól párhuzamosítható feladat
Párhuzamos jóság számítás 1 GPU szál mindig 1 kontúrpont jóságát számolja ki 1 GPU blokk egy sejtmaggal dolgozik A szükséges szálak száma egyenlő a kontúr méretével Ez 4 - ~1000 közötti érték lehet
További párhuzamosítható részek Szomszédok vizsgálata Egy új pont felvétele után meg kell vizsgálni, hogy merre bővíthető a kontúr Utófeldolgozás Külső- és belső kontúr megállapítása Egyéb konvolúciók Kiinduló pontok keresése
Végrehajtási idő Egy sejtmag esetében a végrehajtási idő közel azonos a CPU-n mért értékkel Ez azonban még nem használja ki a kártya erőforrásait, így további párhuzamosításra van szükség Regio grow execution time on GPU Regio grow execution time on CPU
Párhuzamosság magasabb szintje Ismert a sejtmag legnagyobb mérete (sugara) Megfelelő távolságból indított keresések (ahol táv > 4*maxR) egymástól függetlenek Tehát egyidőben, párhuzamosan is indíthatók
Párhuzamosan futó régiónövelések Egyidőben keresett sejtmagok száma Amennyiben a bemeneti kép azt megengedi, számos sejtmagot lehet feldolgozni egy időben Ez jelentősen növeli a processzor kihasználtságát
Teljes végrehajtási idő Teljes futásidő A gyakorlatban a teljes kép feldolgozási idő a mérvadó Ebben a GPU általában 3-4x gyorsabb, mint a CPU implementáció Kép felbontás Nagyobb felbontások esetében az eredmények még jobbak Entire execution time in case of 8096 2 images Entire execution time by image resolution
Több grafikus kártya használata Teljes kép felosztása átfedő részekre Több régiónövelés indítása Eredmények összefésülése Eredmény kb. 8x gyorsabb mint az eredeti módszer
Történeti áttekintés GPU programozás sajátosságai Gyakorlati alkalmazások IHCP
Hőátadás Hőátadási tényező Hőátadás Valódi alkalmazás 3D Hőkezelési eljárások
Háttér Hőátadási együttható függ időtől/helytől
Hővezetés Fourier-egyenlete
HTC Lehülési görbe 1800 1600 1400 1200 1000 800 600 400 200 0 0 5 10 15 20 900 800 700 600 500 400 300 200 100 0 0 2 4 6 8 10 12 14 16 18 20
Lehülési görbe HTC 1800 1600 1400 1200 1000 800 600 400 200 0 0 5 10 15 20 900 800 700 600 500 400 300 200 100 0 0 2 4 6 8 10 12 14 16 18 20
Lehülés valóságban
HTC valóságban
Megoldandó feladat 1800 1600 1400 1200 1000 800 600 400 200 0 0 5 10 15 20 25 30 1000.000 900.000 800.000 700.000 600.000 500.000 400.000 300.000 200.000 100.000 0.000 0 2 4 6 8 10 12 14 16 18 20
A meglévő módszerek számításigényesek Végeselem analízis Véges differenciák módszere Hőátadás mértéke Problémák Közvetlenül nem mérhető Inverz hőtani modellek segítségével származtatható Inverz hőátadási folyamat Rosszul feltett matematikai probléma Nem lineáris Nincs közvetlen megoldása Heurisztikus módszerek
Particle Swarm Optimization 1995, James Kennedy, Russell C. Eberhart Madár és hal rajok mozgásán alapul
Minden egyednek van Saját térbeli helyzete Aktuális sebessége (vektor) A sebességet befolyásolja Eddig talált legjobb saját pozíció A teljes raj által eddig talált legjobb pozíció A mi esetünkben PSO felépítése Egyed: egy vizsgált paraméterkészlet Pozíció: HTC paraméterek Jóság: referencia lehülési görbék közelítése Cél: minél közelebbi görbét generáló HTC megtalálása
PSO lépései Start Induló pozíciók generálása Jósági függvények számítása Legjobb adatok kiválasztása Megállási feltétel vizsgálata Stop Új sebesség meghatározása Mozgatás
Előnyök A módszer ideális nagyméretű paramétertérben való keresésre Hatékonyabban kerüli el a lokális optimumokat, mint a hasonló módszerek Problémák IHCP megoldása PSO-val Nagyszámú részecske minden iterációjában ki kell számolni a lehülési görbét (kb. 15ms/részecske) Ezért egy teljes szimuláció futásideje: 3000 elem/iteráció * 4000 iteráció * 15 ms/elem = 50 óra
Lehűlés szimuláció GPU-val Véges differencia módszer 10x40 rács 4000 időegység Egy GPU multiprocesszor = 1 lehűlés 400 szál 400 érték a belső memóriában Az egyes lehűlések egymástól függetlenek Minden multiprocesszor dolgozhat GPU teljesítménye kiaknázható
CPU-GPU megoldás összehasonlítása
Optimalizációs lépések Általános GPU optimalizálási ötletek Shared memória használata Warp divergencia kiküszöbölése CPU-GPU együttműködés elősegítése Memória mozgatások csökkentése Shared memória használata A mátrix és a szükséges segédadatok elférnek az on-chip memóriában Ezért minden számítás ott elvégezhető Memória késleltetés emiatt minimális
A grafikus kártya 32-es csoportokba rendezve futtatja a szálakat Ezek egyidőben mindig ugyanazt a feladatot hajtják végre Elágazás esetén a szálak egy részének várakoznia kell (lásd SIMT végrehajtás) Lehetőségek Warp divergencia Elágazások kiküszöbölése (általában nem megoldható) Szálak átcsoportosítása (divergencia csökkentése)
Warp divergencia DHCP A testet reprezentáló mátrix bizonyos pontjainál másmás képlettel kell számolni
Warp divergencia megoldása Mátrix méret: 10x34 Csak utolsó warp divergens
Optimalizáció eredménye Optimalizált megoldás futásideje
Ideális terheléseloszlás CPU-GPU együtt
Memória másolások problémája CPU-GPU memóriák közötti másolás költséges Egymásra épülő lépések CPU GPU másolás GPU kernel futtatás GPU CPU másolás
Memória másolások átfedése GPU három végrehajtó egysége: 2 másoló, 1 futtató Ezek párhuzamosan működnek, így a memória másolás ideje részben elrejthető
CPU, core 1 CPU, core 2 CPU, core 3 CPU, core 4 GPU 2 GPU 1 Mérnöki Látásmód az Informatikában Kutatások Informatikai Támogatása Eredmény Végrehajtási idő: 50 óra 27 perc
Gyakorlati alkalmazás PSO/GA configurálás Kérdéses paraméterek Ideális populáció méret Ideális módszerek Időszükséglet További lehetőségek Paraméterenként 500-1000 teszt CPU: 3,5 év GPU: 2 hét Egyéb heurisztikák kipróbálása Fireworks Ant colony optimization
Populáció méret kísérlet
Irodalomjegyzék/képek forrásai https://en.wikipedia.org/wiki/ray_tracing_(graphics) http://www.cmap.polytechnique.fr/~peyre/geodesic_computations/ http://graphics.stanford.edu/~henrik/images/imgs/bunny.jpg http://images.bit-tech.net/content_images/2014/02/nvidia-geforce-gtx-titan-blackreview/zotactb-2b.jpg http://www.top500.org/featured/systems/asci-red-sandia-national-laboratory/ http://www.pcper.com/reviews/graphics-cards/nvidia-geforce-8800-gtx- Review-DX10-and-Unified-Architecture/G80-Architecture https://docs.nvidia.com/cuda/cuda-c-programming-guide/ http://www.nvidia.com/object/cuda_home_new.html https://en.wikipedia.org/wiki/swarm_behaviour http://i.imgur.com/ypskk.png https://upload.wikimedia.org/wikipedia/commons/f/fb/dolphin_triangle_mesh.png http://web.eecs.umich.edu/~sugih/courses/eecs487/f15/pa1/aatriangle.png https://circecharacterworks.wordpress.com/2012/05/12/framing-object-beyondbounding-box-projection/ http://images.nvidia.com/pascal/img/gtx1080/geforce_gtx_1080_3qtr_front_le ft.png
Köszönöm a figyelmet