Extrém 3D pontfelhő kísérleteim

Fehér Krisztián weboldala
Fehér Krisztián weboldala
Tartalomhoz ugrás

Extrém 3D pontfelhő kísérleteim

Fehér Krisztián honlapja
Közzététel itt Szakmai munka · Kedd 16 Máj 2023
Aktuálisan minden figyelmemet a high-performance computing téma köti le a kutatási vonalon, amit a CUDA köré építettem fel. Azt a célt tűztem ki magam elé 3 héttel ezelőtt, hogy kiderítem, a meglévő 3 kártyás rendszeremet hogyan tudom maximálisan kihasználni 3D térinformatikai renderelésre. Ez végül több lépcsőben valósult meg.

A konfiguráció 2 darab GeForce 3060-as és 1 darab GeForce 3050-es kártyából állt, azaz összesen 32GB videomemória állt rendelkezésre. A tesztgép 4 magos Intel processzort és 32GB RAM-ot tartalmazott, SSD meghajtóval.

Először az egyik 3060-as kártyát vetettem be. 660 millió ponttal egy kb. 4,5 millió négyzetkilométeres terület domborzati modelljét sikerült megjeleníteni valós időben. 4 fps sebességgel. Felmerülhet a kérdés, hogy egy 12 GB-os videokártyával miért csak ennyit tudok feldolgozni?! Nos, számoljunk! 660.000.000 ponthoz összesen 4 leíró adat kell pontonként (X,Y,Z és szín), azaz 2.400.000.000 adat. Minden adat 4 bájtos változó, azaz 9.600.000.000 bájt a végére. Ez már önmagában 10GB körüli érték, amihez még pár megabájt járulékos adat tartozik a képernyőpufferek miatt. Tudni kell azt is, hogy teljesen csurig nem szabad megtölteni a kártyák memóriáját, mert az garantáltan lefagyásokhoz, rendszerösszeomlásokhoz vezet. Ezenkívül pedig minden kártyán, amire monitor van kötve, felhasznál még némi plusz memóriát az operációs rendszer is. Tehát az a 12GB valójában nem 12GB a végén... Ezért is lehet a maximálisnál csak kevesebb memóriát lefoglaltatni a ZEUSZ Ultra alkalmazásommal minden kártya esetében.

Az említett 4,5 millió négyzetkilométer azért is durva, mert a pontok közötti távolság kb. 83 méter csupán, ami brutális felbontást jelent ebben a nagyságrendben!



De itt még nem álltam meg. Ezután már bevetettem mind a 3 kártyát a konfigurációmban. Ezúttal már 1.3 milliárd képpontot tudtam a kártyákba gyömöszölni, 5 fps sebességet elérve, kb. 9 millió négyzetkilométer terület lefedve.



Ezen a ponton két dolgoba futottam bele. Az egyik egy hiba, amit eddig nem vettem észre: ha több, különböző memóriával rendelkező kártya van a gépben, akkor a ZEUSZ Ultra mindig sorrendben a legutolsónak beállított memrióa mennyiséget veszi alapul mindhárom kártya esetében. Ha tök ugyanolyan kártyákat használunk, vagy ha hajszálpontosan ugyanannyi memóriát állítunk be mindegyikre, akkor nem lesz gond, minden más esetben azonban futásidejű hiba keletkezhet, ha a sorban utolsó kártyán a beállított memória mérete nagyobb, mint valamelyik másik használt kártya kapacitása. A javítást a github-ra még nem raktam ki, de a lokális gépemen levő verzióban már sikerült kijavítanom. A másik dolog, hogy a gépben levő 32GB RAM egyszerűen nem volt elég több adat előfeldolgozására. Ugyanis először a RAM-ban történik meg az adatok előkészítése és csak utána töltődik át a kártyákra. 1.300.000.000 képpont esetén ez bizony kb. 21GB RAM-ot igényel, erre jön még az operációs rendszer és adott esetben a fejlesztőrendszer is. "Mit tegyek?" - gondoltam. A dologgal az a probléma, hogy ilyen módon csak valamivel kevesebb mint 8 GB memóriát tudtam felhasználni a 12 GB-os kártyákon is. Van ugyan egy 'extreme rendering'-re keresztelt megoldásom, amivel nagyobb adagokban lehet elvileg bármekkora mennyiségű adatot feldolgozni, de ekkor a valós idejű renderelésnek annyi, mert itt már hosszú másodpercekig is eltarthat egy képkocka kirajzolása. A másik megoldás a betöltő algoritmus finomítása lenne, ami némi plusz munkát igényelne a videokártyát kezelő kódok oldalán is, adminisztráció kapcsán. A harmadik megoldás a legegyszerűbb és a legdrágább is: még több RAM-ot pakolni a gépbe. Végül ez utóbbi mellett döntöttem, bár némi félelemmel vegyesen, hátha a hibát mégis más okozza. De végül megléptem. Besétáltam a kiszemelt kereskedésbe és elhoztam 64GB RAM-ot. Ez a megoldás hála Istennek azonnal működött, immár nem futott szó szerint (memória)lyukra a betöltési folyamat.

Így sikerült jó egy héttel ezelőtt előállítanom egy 1,96 milliárd elemből álló 3D pontfelhő-domborzatot, 3 videokártyával. A lefedett terület kb. 13 millió négyzetkilométer. Összesen 3-4 fps sebességet értem el, ami azért megdöbbentő, mert azt jelenti, hogy kb. 30GB adatot másodpercenként háromszor dolgoz fel ez az összeállítás a renderelés során! A CUDA egy fantasztikus technológia, nem csoda, hogy ennyire beleszerelmesedtem.



A téteket emelhetném további kártyák hozzáadásával, de valószínűleg ezzel már rohamosan tovább csökkenne a renderelési sebesség. 1fps sebesség pedig azt jelentené, hogy a CUDA kernelek végrehajtási ideje drámaian megnő, ami további hibák forrása lehet. Ez történt ugyanis, amikor 1,96 milliárd pont fölé mentem a tesztek során: a memória még elbírta volna, de a renderelés sokszor összeomlott a rengeteg adat feldolgozása alatt. Jelenleg PCIE 3.0-ás buszokon használom a kártyákat. PCIE 4.0 esetén lehet, hogy tovább tolhatnám a határokat, de az így keletkező nyereség már nem állna arányban a ráfordítással, hiszen új processzort, vagy alaplapot is vennem kellene. Azért egy határt szabni kell a kísérletezéseknek is... Másrészt ennél komplexebb renderelési feladatokat már hálózatba kötött gépek kicsi farmjával tervezek megoldani, ami a fejlesztések jelenlegi irányát jelenti egyébként. A "Kliens-szerver programozás tömören" című kiadványomban leírtakat fogom itt a gyakorlatban is kamatoztatni. De ez még odébb van, egyelőre az USB-s GPS vevők által szolgáltatott adatok megjelenítését kell tovább finomítanom.

Nagyon örülök a mostani eredményeknek, annál is inkább, mert tudomásom szerint ez az egyetlen PC-re írt térinformatikai megoldás, ami így dolgoz fel adatokat!


KAPCSOLAT

E-mail:
feher.konyvek@gmail.com
KAPCSOLAT

E-mail:
feher.konyvek@gmail.com
Vissza a tartalomhoz