12. 12. 2014

Pixel Fill Rate


Zastaraná jednotka výkonu grafickej karty najčastejšie udávaná v miliónoch pixelov za sekundu. Zoberte si také 8 bitové ZX Spectrum a jeho hru v rozlíšení 256x192 pixelov /CPU inak samo prakticky bez podpory ťahá herný kod, tvorby grafiky aj 1 bit audio/, ak by ste chceli celú túto obrazovku animovať 50 krát za sekundu /PAL norma/ tak potrebujete "GPU" čo zvládne 2.5M pixelov/s. Ohromné číslo. A kde sú ešte desiatky, stovky sprajtov, nedajboh prekrývajúcich sa "transparencií". V troch rozmeroch sa na PSone situácia ešte oveľa zhorší, každý pixel obrazovky sa od vás vyžaduje o podstatne viac práce a ešte potrebujete zaplniť dve framebuffery. Asi nikde na internete nenájdete presné číslo PS1 fillrate, aj keď hrubý výpočet tohto parametru je technicky jednoduchý: pixel fill rate = (počet ROPs - raster jednotiek) x (pracovný kmitočet pixel jednotky GPU). PS1 CPU beží na 33.8685Mhz a PS1 GPU na 26.6015Mhz, čo nám pri jednej predpokladanej pixel jednotke dáva fillrate cirka na úrovni 27Mpix/s. Pre zaujímavosť - úplne prvá verzia 3Dfx čipsetu Voodoo 1 /nekomerčná, pre arcade kabinety/ bežala na 40Mhz, pre koncového uživateľa /napríklad Diamond Monster 3D/ na 50Mhz a ja som ju mal stabilne s lepším chladením pretaktovanú na 56Mhz - toto krát jedna pixel pipelajna nám dáva teoretických 56 mpix/s a takmer presný dvojnásobok Psone /viď aj nedokončený 3D amiga čipset HOMBRE/.

Malá vsuvka. Ako asi viete, PSone nemá klasickú podporu pre 2D grafiku, takže akákoľvek 2D hra so stovkami sprajtov namiesto nich používa "3D engine", kde sprajt je vlastne trojuholnikovitý /triangle/ alebo štvorcový /quad/ polygón s textúrou !! Pri Psone sa udáva maximálne polygónový výkon niekde medzi 180 000 a 360 000 polys/s. Čiste pre zjednodušenie si to dajme na nejakých 240K/s a teda  4000 polys na frame pri 60Hz NTSC hre. Zázračnou zhodou "náhody" je v špecifikáciach PSone pri "sprajtoch" uvedené presne toto isté číslo a stačí bohato na pravé sprajtové peklo.

"GTA3 on the PS2 had not even backface culling, as fillrate never was an issue. When they ported to PC, they had quite some fillrate issues."

Playstation 2: 16 pixel jednotiek krát 150Mhz GPU = 2400Mpix/s. Asi 100 násobok PSone, neuveriteľné !! Práve v tomto okamihu musíte začať riešiť aj nepríjemný fakt ako tu masu dát preniesť z bodu A do B. Výkon vášho pamäťového systému. Ak chcete plne saturovať tento obludný pixel výkon /kvalitný PC mainstream tej doby - Voodoo 3 hrubo zaostával/ tak potrebujete asi 38 gigabajtov/s len pre textúry a aspoň 10 giga/sec pre framebuffer. Opäť pre porovnanie Voodoo 1 disponoval asi 400 mega/s a Voodoo 3 cirka 2.5 giga/sec do svojich vram. PS2 to dokázala /a v tomto rozsahu ide o ojedinelý jav/ iba vďaka použitiu eDRAM so super širokou 2560 bit zbernicou /20 násobok bežného PC priemeru/ a presne s priepustnosťou ktorú potrebovali 38.4 + 9.6 giga/s.

Playstation 3: 8 pixel jednotiek krát 550Mhz = 4400Mpix/s. Ani nie je dvojnásobok toho čo PS2. Slabota. Otázka zneje prečo ? Pôvodný, hypotetický dizajn PS3 rátal s GPU v konfigurácií 16 ROPs a teda 8800Mpix/s na 256 bit zbernica - cca 45 GB/sec, dostali sme však presne polovicu. Na prvom mieste išlo o ekonomické dôvody, proste PS3 netrafila to správne obdobie nekonečného cyklu nerovnováhy /večný tanec medzi harmonickým CPU, GPU a mem systémom/. Fillrate PS3ky je teda veľmi nedostatočný a čo viac, tých 4400Mpix/s potrebuje aj tak vram s 70GB/sec priepustnosťou. Viac a viac sa zvýrazňuje problém s nedostatočne výkonnými pamäťami /sekundárne aj zbernicami/.

 polygóny, textúry, pixel shaders

Malá vsuvka. V tejto generácií dochádza ku zásadnej zmene pohľadu na spôsob "výpočtu" hodnoty základného grafického primitíva. Pri starej 16 bit konzole bol "pixel" uložený ako statická bitmapa v ROM kártridži, pri PS1/PS2 zas kus textúry na CD/DVD. Na PS3ke sme sa pohli trochu vpred. Shaders, algoritmus čo ráta farbu a polohu pixelu, bez toho aby ste na jedno miesto nanášali otrocky desiatky textúr. Aj tak by ste tie pokročilé svetelné fenomény bez úžasnej spotreby vram a priepustnosti nevedeli aproximovať /refrakcia s chromatickou aberáciou alias mydlová bublina/. Vaše PS3 GPU je konečne schopné veľmi komplikovaných per-pixel výpočtov /10-100+ na pixel pri PS3, 100-1000+ pri PS4/ prebiehajúcich vnútri GPU registrov. Veľmi často sa však stáva, že rasterizačná časť /fillrate/ čaká za ALU jednotkami až sa ku tomu finálnemu pixelu vôbec dopracujú. A dovtedy takmer niet čo "maľovať". A pretože GPU čip nie je nafukovateľný donekonečna, tak sa značná časť jeho tranzistor budgetu vyčleňuje práve v prospech ALUs /shaders/ na úkor ROPs /fillrate/.

Playstation 4. 32x800Mhz = 25 600Mpix/sec. Zhruba 1000 násobok PSone. PS4ka na 256 bit zbernici s 180GB/sec. Reálna požadovaná priepustnosť je pritom niekde na úrovni 412 giga/sec. Nič tak výkonné a zároveň lacné dnes na trhu ale opäť raz nemáme. Aj keď sa to môže zdať rovnako dramaticky zlé ako pri PS3ke nie je tomu celkom tak. Ako som napísal vyššie - pixely sú dnes hlavne o výkone ALU jednotiek /SIMD, FLOPs/. Xbone má polovičný pixel fillrate oproti PS4 a predsa to v hrách /má to samozrejme v prípade multiplat hier svoje logické dôvody / ako do oči bijúcu brzdu neuvidíte /masívny pixel fillrate sa ale aj dnes hodí pre všetky alfa efekty - dym, výbuch, partikle a hlavne foliage, teda zdanlivo, viac neskôr/. Technicky teda skôr než narazíte na obmedzenie v podobe ROPs fillrate, tak vás takmer určite zastaví nedostatočný výkon ALUs alebo mantinely priepustnosti /V/RAM.

Malá vsuvka. Zámerne sa vyhýbam trikom alebo situáciam, ktoré pixel fillrate modifikujú oboma smermi. Geometry/CPU bound, Z-buffer, double-tripple buffer, koherentné cache, TMU, kompresia textur/BW, render target formáty, PMW logika v eDRAM ako pri x360, zdvojnásobenie fillratu zabalením dvoch 32 bit bufferov do jedného 64 bitového, MSAA a G-buffer triky atd. atď., ide mi len o to aby ste pochopili ako sa vývoj grafiky točí dokola a "nevedomky" sa vraciame opäť ku starým postupom len z inej strany a oveľa efektívnejšie.

"Not even the modern BW monsters such as Radeon 7970 GE can reach their full fill rate on particle rendering, because the BW becomes a limit halfway there - 64 bit HDR blending with 32 ROPS at 1000 MHz requires 512 GB/s BW and the card only has 288 GB/s BW."

Budúcnosť. Možné riešenia. Hrubá sila - nenažraté ROPs, ALUs /TMUs, GPGPU tasks atď./ uspokojíme evolučným prechodom na tzv. 3D RAM alias HMC alebo HBM. Namiesto úzkych 128-256-384 bit zberníc na príšerne vysokých kmitočtoch prejdeme na super široké 1024 bit a viac ďialnice na nižších taktoch s nižšou spotrebou a odpadným teplom, ktoré by už o rok mohli pre GPU triedy PS4 bez problémov poskytovať 512GB/sec a neskôr až 1-2 terabajty pre ninja PC high end. Jeden problém vyriešený.

Druhým krokom bude smrť ROPs /rasterizačné jednotky, kontrola fillrate/ a absolútny dôraz na ALUs. Vrátim sa ku Voodoo 1 od 3Dfx. Vtedy sme im hovorili 3D akcelerátory. Blbosť, reklamný žvást. Voodoo akcelerovalo RASTERIZÁCIU, nie "3D scénu", teda nasvietenie a transformácie, to naopak zvládala PSone vďaka GTE hardvéru. Rasterizácia /read-modify-write hry s buffermi/ je dnes už celé veky mysteriózna, neprogramovateľná /!!/ a  veľmi komplexná časť GPU, ktorá sa postará o to, aby sa herný 3D svet transformoval do 2D matrixe vašej obrazovky. Pri starom ZX Spectre ste mali práve nad rasterizáciou totálnu a priamu kontrolu, o ňu sme prišli príchodom stále lepších GPU a košatejších grafických API.

A tú pride ta mňamka. PS4 GPU GCN 2.0 architektúra umožnuje obísť nielen ROPs ale takmer celú klasickú render pipelajnu. Vzletne povedané vás nemusí zaujímať hardverový pixel fillrate výkon, alebo či majú ROPs dosť priepustnosti, ten pixel tam môžte z GPU /ALUs, shaders/ hodiť ako za starých čias rovno na obrazovku /do textúry, UVA DX11+/. Nárast výkonu z pohľadu fillrate kriticky náročných scénach /obligátne výbuchy, dym, alfa, aj voda, atmosferické efekty, particle, foliage/ môže narásť o jeden rád. Nebudem vám však klamať, toto patrí do rúk iba skutočne majstrovských kóderov. A idem ešte ďalej. Do oči nás bije dosť žalostná IQ - image quality hier za posledných 10 rokov bez ohľadu na výkon HW a ako keby práve s príchodom programovateľných pixel shaders. Na vine je hlavne prechod na deferred engine s jeho G-bufferom /vynútený krok - opäť technologický cyklus, ekonomika tvorby hry/ a nekonzistentný rendering skrze početné rendertargets /každý v inom rozlíšení, presnosti, priorite/. Potrebujete teda AA kód osobitne pre geometriu scény, alfu, postfekty, aliasing textúr a hlavne všetkých shaderov.

pixel shader /GPU sa správa ako GPU/ versus compute shader /GPU sa správa ako CPU/

V priebehu poslednej 8.generácie teda v špičkových hrách čakám návrat ku starému, "prvému" ak chcete - forward renderingu /už dnes existuje mnoho vylepšených variánt/, značné časti grafického kódu budú naprogramované ručne a efektívne v "softvérom" režime mimo fixnej HW render pipelajny defaultne uloženej vo vašom GPU. A maximum práce sa bude odvádzať práve vnútri GPU /pre skutočne vyššiu hernú kvalitu je dôležité, aby herná logika+AI+fyzika a grafika bežali na jednom čipe/. A ak sa dožijeme PS5 v podobe domácej konzoly, tak bude niečo v štýle ZX Spectrum na steroidoch - jedno APU /v ktorom v kontextovej HSA symbióze splynie CPU a GPU v jedno telo/ a jeden typ unifikovanej hUMA 3D RAM o gigantickej priepustnosti. K tomu voliteľne aj úplná kontrola nad renderingom doslova s tvorbou vlastného "shader modelu" mimo špecifikácii DX či OGL. Viem si predstaviť, že AAA grafický engine schopný plne absorbovať všetky tieto možnosti bude stáť aspoň 250M euro a dovoliť si to budú môcť iba tí najbohatší z najväčších. Nevadí. Viac miesta pre zdravý stred a spodok, A/AA hry, skutočné inovácie a bezbrehé kambrijské bujnenie predstavivosti herného dizajnéra.