13. 1. 2013

GPGPU - smer next gen


General purpose graphics processing unit /alebo presnejšie General purpose computing on graphics processing units/. Sľúbil som vám tento článok, napíšem ho maximálne user friendly. Pojem GPGPU je dnes moderné zaklínadlo a zdanlivý všeliek na všetky výpočetne náročné problémy na ktoré môžme naraziť nielen v hernom kóde. Otázka teda zneje, prečo to v hernej praxi použité široko ďaleko nikde masovo nevidíme. Xcrap GPU sa chváli niektorými GPGPU vlastnostiami, avšak sú takmer na 100% nevyužité. Nintendo sráči sa išli zadusiť od nadšenie, lebo nedostatky veľmi slabého CPU Wee Urinalu dorovná jeho GPGPU. Operácie typické pre CPU sa zrealizujú na grafickom čipe. Aká je teda realita ?

CUDA, OpenCL, Direct compute - programujeme GPGPU, technicky nekonečné aplikačné možnosti

Je drsná a temná, samozrejme to má niekoľko zákerných háčikov. Uvediem iba zopár, ide o veľmi komplexnú tému /draw calls dostanú špecialny článok/. Definujme si veľmi hrubo fundament bežného CPU. Je to čip s malým počtom jadier/vláken, avšak s veľmi vysokým výkon na jedno jadro/vlákno, s veľmi dobrým "vetvenim" /predikcia "vektora" ďalšej inštrukcie/, s nízkom priepustnosťou do hlavnej ram. GPU - obrovský počet "jadier"/vláken, veľmi nízky výkon na jadro/vlákno, slušný branch prediktor, mimoriadne vysoká priepustnosť do vlastnej vram. Ako vidíte, ide o dve úplne rozdielne architektúry. Klasicky beži CPU kód veľmi pomaly na GPU a vice versa. GPU doslova vyžaduje aby ste CPU program paralelizovali /výkon na jadro-vlákno má GPU slabučký/ a navyše prispôsobili pre jej SIMD jednotky /vektorizovali/. Fajn. Nejako sa vám to podarí prekonať /technická poznámka: presne takto funguje PS3 - keď kód pre GPU beží na SPE v "jazyku" GPU/.

Efektivita aj na ninja PC je však stále nízka - prečo ? Máme tu totiž nejaký proces bežiaci na CPU a nám sa zdá, že mu bude lepšie na GPU. CPU ho teda predžuje a pošle z RAM do VRAM, GPU ho spracuje a pošle ho naspäť z VRAM do RAM, CPU urobí ďalšiu zmenu a pošle ho z RAM do VRAM, GPU to spracuje a pošle to z VRAM do RAM. CPU to .. všetko 60+ krát za sekundu a donekonečna. Ak ste to nepochopili, tak hovorím napríklad o takej banalite akou je 3D dym, alebo simulácia pohybu šiat, ktorá reaguje na pohyb postavy /na vaše ovládanie toho objektu-postavy, auta/. To je tá zákernosť. Ak chcete interaktívny GPGPU efekt potom neuveriteľným spôsobom zaťažujete hlavne priepustnosť celého systému. GPGPU efekt môže ísť z VRAM rovno na výstup na display, ale potom stratíte "interakciu" - CPU nevie, nemá spätnú väzbu čo s ním vlastne GPU urobilo !! Fyzika alebo AI bežiace na GPU je na tom ešte o dosť horšie.

Toto je ten obrovský problem, prečo vlastne GPGPU efekty dnes v PC hrách takmer vôbec nevidíte. A prečo nijako Wee Urinal nespasia. Čas strávený kopirovaním dát tam a späť veľmi často nuluje akýkoľvek benefit z tejto akcelerácie získaný. Opäť platí to isté aj pre PS3, keď si RSX pomáha výpočtami na "druhom GPU", teda na SPE jednotkách. Máme však jedno veľmi elegantné riešenie /nielen jedno/. AMD na tom pracuje roky, má niekoľko etáp a bohužiaľ sa do PS4 v žiadnom prípade konečná verzia celého projektu nedostane, veríme však v aspoň čiastkový medzistupeň.

Heterogeneous Systems Architecture /HSA/. O čo vlastne ide. Snaha zladiť CPU/GPU/MEM do jedného efektívneho celku. Skúsme najprv obmedziť pamäťové transfery. Namiesto dvoch mem bánk /RAM, VRAM/ zavedieme iba jednu spoločnú RAMku /Uniform Memory Access UMA/ a musí byť pekelne rýchla. Dáta teda nebudú lietať medzi dvoma pamäťami, ale iba vnútri jednej. Poďme však ďalej. Čo tak zaviesť unified mem addressing /spoločný adresný register, ignorujme dnešne virtualizované pokusy/. Bingo. Dáta budú ležať stále na tej istej adrese, len ku nim bude na striedačku pritupovať raz CPU, potom GPU. Poďme ešte ďalej. Zjednoťme CPU a GPU do jedného bloku. Vytvorme SOC /system on chip/, na jednom silikóne obe výpočetné jednotky. A poďme na úplný koniec. Vytvorme novú architektúru, kde bude iba jedna globálna výpočetná jednotka s unifikovanými hybridnými CPU/GPU "inštrukciami" pristupujúca do jednej unifikovanej RAMky. Dosiahnete bezprecedentný nárast výkonu a efektivity a podarí sa nám udržať Moorov zákon pri živote aj bez zvyšovania hrubého výkonu nárastom počtu tranzistorov alebo pracovnej frekvencie.

Pointa. AMD sa pri next gen konzolách snaží práve o toto, samozrejme v rámci dostupných technických možností. Zoberme si PS4ku. Insajderi sa zaprisahavajú, že posledný PS4 dev kit obsahuje hlavnú UMA RAM o veľkosti 4 gigabajty a rýchlosti 192GB/sec /xcrap údajne 8 giga výrazne pomalšej RAM + eDRAM?/. To číslo je určite povedomé aj vám, náhodou totiž rovnako rýchlu ramku používa aj najnovšie PC GPU NVidia 680. Skrátim to. GDDR5 /6Gbit-sec na modul/ pri frekvencii 1500Mhz na 256 bit buse a teda - 1500 x 4 x 256 / 8 / 100 = 192GB/sec. Pre finálnu verziu PS4ky sa predpokladá použitie ďaleko úspornejšej Wide I/O zbernice na bežnejšej DDR3-4 o šírke 512-1024 bitov. Spotrebu GDDR5 o veľkosti 4 giga odhadujem nad 60 watt, to je neakceptovateľne veľa.

AMD je topiaci sa titanik a všetci rátajú s tým, že bude chcieť integrovať HSA v nejakej forme do next gen konzol za každú cenu. Trójky koň a presadenie vlastnej architektúry na úkor Intelu. Ak HSA beriem ako 4 krokový taktický plán, tak next gen konzoly sa nedostanú najviac tak po dvojku, maximálne 2.5ku. Opakovane sa napríklad zdorazňuje, že MS doslova utopilo v prachoch svoju časť vývojarskej AMD skupiny /hovorí sa otvorene o vytvorení BU = business unit .. AMD bunky v rámci MS !!/ a horúčkovito pracujú na niečom veľmi pokrokovom. Behom 30 dní očakávam významnejší leak informácii o PS4, už teraz však zdorazňujem, že experti /aj laickí/ sledujú podstatnejšie veci ako len typ použitého GPU alebo veľkosť RAM. Future proof konzola potrebuje aj zapracovanie nejakého revolučného konceptu. V našom prípade vysokoefektívnej HSA architektúru.