Monthly Archives: marec 2014

nVidia, OpenCL a frustrácia

Toto bude jeden z tých technickejších článkov, takže ak nepatríte k tým, ktorých tieto veci zaujímajú, môžete to tu pokojne preskočiť – alebo čítať ďalej pre náhľad do sveta, ktorý tak často nevidíte 🙂

Stručný úvod: na jednom predmete v škole (programovanie v paralelnom prostredí) sme dostali za úlohu napísať jednoduchý algoritmus pre výpočet fyzikálneho modelu pohybu častí. V podstate sa jednalo o veľmi primitívny model “gravitačného” rozmiestnenia vrcholov grafu. Mali sme použiť technológiu OpenCL 1.1 pre akcelerovanie výpočtov na grafickom HW.

So far, so good. Po iniciálnom zoznámení s technológiou som strávil netriviálne množstvo času (= cca 14 hodín) implementáciou prvotného návrhu riešenia. Čo sa nakoniec aj podarilo – môj kód bežal (nie práve super efektívne, ale predsa) a testy prechádzali pre prvý zo vzorových vstupov.

Nasledujúci deň som ešte vyoptimalizoval jeden z kernelov pre spracovanie hrán grafu a tešil som sa, že mám hotovo. Aké veľké bolo moje prekvapenie, keď sam zistil, že aj keď moje riešenie funguje správne na prvom vzorovom vstupe, na druhom a treťom má problém.

Prekvapujúce to bolo hlavne z toho dôvodu, že sme k úlohe dostali aj vzorové sériové CPU-bound riešenie, voči ktorému sa potom naše OpenCL riešenie bude porovnávať. A môj kód pre OpenCL kernely vychádzal z veľkej časti práve z tohto vzorového kódu. A napriek tomu dával iné výsledky. Nie o veľa, ale dosť na to, aby prekročil toleranciu 1% nastavenú vo validátore výsledkov.

Po troche diskusie s cvičiacim a experimentovania sa mi podarilo upraviť moje kernely tak, aby validácia prešla aj na vstupe číslo dva. Vysvitlo, že pow(x, 2) a pown(x, 2) != x * x, ak je x typu float. Použitie pow bolo samozrejme zbytočné – chybne som usudzoval, že intrinsická funkcia pow bude efektívnejčia ako násobenie. Well, nie je. A to bol jeden zo zdrojov nepresnosti v mojich kerneloch. Po nahradení obyčajným násobením moje riešenie prešlo validáciou aj na druhom vstupe.

Na treťom vstupe sa tiež zlepšilo – namiesto zlyhania v prvej iterácii výpočtu zlyhalo až v tretej. Sill not good enough, keďže pri validácii musí prejsť aspoň 50 iterácií bez chyby. Po ďalšom ladení som usúdil, že môj kód už nie je možné viac priblížiť k dodanému vzoru pre CPU. Vzal som teda kód kernelu a namiesto na GPU som ho vykonal na CPU (PRESNE rovnaký kód). Výsledok? Rozdielne hodnoty za ôsmym desatinným miestom.

Vysvitlo, že intrinsická funkcia sqrt v OpenCL počíta trochu inak ako std::sqrt. V OpenCL 1.1 implementácii od nVidie totiž nie je v súlade s IEEE 754, zatiaľ čo std::sqrt je. A toto je problém, pretože, na rozdiel od prípadu s pow, sqrt nie je možné jednoducho nahradiť. A navyše je vo výpočte táto funkcia nutná.

Človek by si povedal, že taký malý rozdiel (8 signifikantných desatinných miest) je zanedbateľný. To je ale pravda len pre prípady, keď sa táto nepresnosť nezačne kumulovať. Čo, nanešťastie, v tomto prípade nastane. Počítam v podstate intertakcie častíc “každá s každou”, takže keď máme desiatky tisíc bodov, nepresnosti sa začnú sčítavať a nakoniec prekročia povolené hranice. Preto moje riešenie fungovalo pre vstupy 1 a 2 – majú len 1k a 4k bodov. Vstup 3 ich má 16k.

Uvidíme, čo z toho vylezie. Som v kontakte so zadávateľom úlohy, možno bude mať nejaký usefull insight. Ak nie cez mail, asi si dohodnem konzultáciu, aby som mu mohol môj kód predviesť a zverifikovať, že nie je chybný v nejakom obskurnom aspekte.

Nech je to ako chce (a ak ste vydržali čítať až sem 🙂 ), veľmi som na kombináciu OpenCL 1.1 a nVidia HW nadával (nemám k dispozícii HW od AMD, takže neviem povedať, či je situácia lepšia tam). Naše riešenia sa budú po odovzdaní vyhodnocovať na kartách Tesla K20, takže opať nVidia. Taká hlúposť, ale stojí to človeka nekonečné množstvo času. Víkend zabitý, damn it.

Ale aspoň som sa naučil niečo, čo som vždy chcel, ale nenašiel dosť času a odhodlania ísť do toho – programovanie high-performance kódu pre GPU 🙂

UPDATE 8.4.2014

Tak sa nakoniec ukázalo, že som vo svojom zápase s presnosťou nebol sám. Minulý vikend nám všetkým prišiel e-mail od zadávateľa, že sa mu ozvalo hneď niekoľko ďalších ľudí, ktorí mali problémy. Nakoniec bol nútený upraviť systém vyhodnocovania presnosti riešenia a zvýšiť toleranciu.

Mal som teda v konečnom dôsledku pravdu – vyhodnocovanie bolo dosť prísne. V každom prípade, moje riešenie je odladené, funguje out-of-the-box aj s novým vyhodnocovačom a mám teda po starostiach. Screw it! 🙂

Within Temptation v Bratislave!

Hydra is on the road.

Už o pár hodín. Koncert, na ktorý sme sa s kamarátmi tešili už od momentu ohlásenia nového albumu. A to sme ani nečakali, že sa WT ukážu priamo v Bratislave.

Lístky kúpené 5 minút po tom, ako sa zahájil ich predaj. A potom sme pol roka čakali 😀 Ale dočkali sme sa, dnes o ôsmej v Incheba Aréne (pôvodná venue sa pre velký záujem presunula zo Slovnaftskej Rafinérie). This is gonna be fun (fun, fun!, FUN!, FUN!!, FUN!!!).

Snáď sa mi podarí zaobstarať aj nejaké decentné fotky, ale aj keby nie, rozhodne bude na čo spomínať. Ich posledný koncert (v Prahe, k albumu The Unforgiving) bol absolútne epický, Hydra bude podľa všetkého rovnaká.

A pred tým samozreme ešte “before-party”, pár pív a možno nejaká tá whiskey 🙂

Navyše je pre mňa tento koncert aj dôvodom urobiť si týždenné prázdniny a dovaliť sa z Prahy do Bratislavy, čo sú body navyše…

Bring the beast on!

Téma na diplomku schválená

Už je to tak, konečne, po prakticky roku vymýšľania, hľadania a zvažovania, sa mi dnes podarilo prísť s témou diplomovej práce, ktorá by ma bavila a zároveň by bola dostatočne komplexná.

Nebudem tu zabiehať do zbytočných technikálií, poviem len, že sa jedná o projekt, ktorý riešime v práci už nejaký čas. Zadanie má momentálne niečo cez 150 strán, ak si správne pamätám. Referenčná implementácia existuje, ale po troch rokoch vývoja štýlom “patchwork” je jej stav absolútne neudržateľný.

A keďže sa jedná o komerčný projekt európskeho významu, v tomto stave ho rozhodne nemôžme nechať ležať (a hniť). Bude teda na mne, aby som existujúcu verziu vzal, rozpitval (keďže je táto verzia nasadená v praxi, pôjde technicky o vivisekciu 😀 ), vybral z nej tých niekoľko kúskov, ktoré sa dajú zachrániť, a zvyšok komplet od podlahy prepísal.

Práce to bude neúrekom, ale mám na to prakticky rok. Zase TAK veľký projekt to nie je. Dúfam. Ale aspoň si pri tom prejdem celý tzv. “software-ový proces” od začiatku až po koniec – analýzu, návrh, architektúru, programovanie, testovanie, nasadenie aj údržbu.

A na jednu vec sa neskonale teším – konečne budeme mať v tej veci regresné testy. Už sa nikdy viac nestane, že opravíme jeden bug, aby sme touto opravou zaniesli dva ďalšie! Woohooo, prestaneme tápať v tmách!

Normálne sa už neviem dočkať. (Áno, je mi jasné, že toto nadšenie ma prejde prakticky okamžite, keď sa začne pracovať, ale na teraz si ho užívam 😀 ).