22. 1. 2013

CPU volá GPU


Berieme to ako úplne samozrejmý fakt, že bežná PC grafická karta strčená do hernej konzoly zrazu ožije a správa sa ako niečo minimálne o 25-50% výkonnejšie /RSX v PS3ke/. A ani tu grafiku nemusíme nejako špeciálne upraviť. Konzolácke CPU sú prdlé väčšinou padavky, tak v čom spočíva to kúzlo ? Pokusím sa vám to jednoducho vysvetliť. Táto finta totiž fungovala pri starej PSone a bude aj pri prichádzajúcej PS4. Predovšetkým je v tom práve to PC CPU a GPU úplne nevinne. Jadro pudla je zakopané medzi nimi.

Grafický engine hry štandardne sedí v hlavnej systémovej pämati /povedzme XDR pri PS3ke/ a vždy keď sa rozhodne vykresliť na ploche nejaký objekt /primitívum, model, časticu/ tak skrze funkciu draw call to dá vedieť grafickej karte. Musíte obslúžiť každý frame, mnohokrát za sekundu. Ide o šialený ping-pong a obrovský tok informácii. Ak tam chcete v tom najjednoduchšom režime 4 objekty, tak 4 draw calls. Ak 1000, tak tisíc. Čas beží, milisekundy nabiehajú. Pri istom objeme týchto volaní zrazu zistíte, že ste narazili na hranicu možností - nie CPU ani GPU to paradoxne nebude /aj keď draw calls značne CPU zaťažujú/. Na vine, že sa celý proces "zastaví" je tá pustatina plná dier medzi CPU a GPU šírke tisícov kilometrov - grafické API a trochu aj zbernice a pomalé pamäte.

džungľa a v nej levy a tigre

PC je prekliate práve svojím zúfalo pomalými a komplexnými aplikačnými vrstvami /viď aj user space a kernel space grafických ovládačov/, ktoré zhoršujú celkovú latenciu. Problém je o to horší, že neexistuje niečo také ako unifikovaný PC hardvér, preklad draw calls do jazyka, ktorému dané GPU rozumie je ďalšia strata času. Čo výrobca, alebo platforma /typ, generácia GPU/ to ďalšia spomaľujúca vrstva. A bude horšie. Na PC GPU pristupuje viac rôznych softvérov naraz, grafický ovládač si ich preto pekne poskladá do fronty, synchronizuje, snaží sa aby sa medzi sebou nepožrali /pritom jeden obyčajný mutex zablokuje celú lajnu na 1000 cyklov - to je priam svetelný rok/. Windows by inak s rachotom skončil v BSOD.
"But it's still very hard to throw tremendous variety into a PC game. If you want each of your draw calls to be a bit different, then you can't get over about 2-3,000 draw calls typically - and certainly a maximum amount of 5,000. Games developers definitely have a need for that. Console games often use 10-20,000 draw calls per frame, and that's an easier way to let the artist's vision shine through.'bi-tech.net

Na konzolách máte na tej pustatine postavenú diaľnicu, dvadsaťprúdovú. CPU môže zapisovať svoje volanie priamo do GPU command zásobníka a to rovno v "jeho jazyku". Môžme upraviť GPU dáta bez toho aby ste celý bežiaci pás zastavili, stačí ak viete, že ich GPU v danom okamihu nepoužíva. Pri PC si musíte systém chrániť pred haváriou, dokonale všetko synchronizovať a tých bežiacich procesov sú tam desiatky. A to sa týka aj časovo veľmi časovo náročnej alokácie pamäti, ktorú si manažujú zaspaté ovládače grafickej karty /podľa potreby púšťate dnu a vyhadzujete von časti kódu tých početných programov/.

 "hrúbka" API - DX versus OGL - zásadným spôsobom ovplyvnila výkon stále toho istého GPU

S nárastom počtu draw calls teda klesá celkový výkon PC zostavy oveľa dramatickejší /a je jedno o koľko je výkonnejšia oproti konzolám/. Čítal som technickú rozborku hry Just Cause 2 /avalanche engine/ a progiš tam hovorí asi toto: "ninja PC DX 11 GPU síce má krajšiu vodu, ale úplne rovnakú draw distance pre tento a hento typ objektov ako 7 ročné konzoly." Exekúcia draw calls je proste na konzolách neporovnateľné rýchlejšia. Draw calls však maju svoju cenu aj na konzolách, preto sa všetci snažia ich počet znížiť na úplne minimum.

Príklad zo života. Neoptimalizovaný Gears of Joke 3 beží na 20 fps /50ms/ lebo sa tam motá príliš veľa týchto volaní. Konkrétne 2556 mesh draw calls, 2451 draw calls pre základné primitíva a 340 pre častice. Náročnosť spracovania draw calls na grafickej karte sa líši aj podľa ich typu /časticové efekty, tak obľúbené v tech ukážkách sú v tomto mimoriadne nenažrané/. Aby vám ta Gears hra bežala na 30 fps /33ms/ potrebujete sa dostať na tieto draw calls čísla - 1600, 1700 a 150 volaní pre jednotlivé grafické entity. To je ale iný príbeh.

Kúzlo konzol teda spočíva vo vysokooptimalizovanom "tenkom" API, schopnosti komunikácie medzi CPU a GPU na veľmi nízkej úrovni, veľmi adresne, close to metal prístup. Kustomizované GPU s väčším vertex/index bufferom pre príkazy prichádzajúce z CPU /RSX ich má o 50-100% väčšie alp NV 7800, z ktorej vychádza/. PS4 a xcrap 720 budú mať navyše dáta /engine, grafické asety/ uložené v jednej pamäťovej banke. CPU a GPU už pri dnešnej generácii konzol spája oveľa, oveľa rýchlejšia zbernica /s nižšou latenciou/ než bežná PCi16x mrdka v hernom PC za 60 litrov. Špičková hra programovaná pre špecializovanú konzolu je vzor efektivity. Ninja PC medzitým vyhadzaje desiatky wattov len tak do ľuftu, nie je to hyperbola, tak prekliato neefektívne je herné PC /celá PS3 na 28nm procese bude brať pri maximálnej záťaži do 45 wattov, lepšie herné PC okolo 450 a viac/.