Ako funguje grafická karta. Určené pre stredné školy

Grafická karta je komponent počítača, ktorý počíta grafické operácie v hrách, ale môže slúžiť k výpočtom alebo na rôzne pracovné činnosti. Okrem výpočtových funkcií má aj jednoduchšiu úlohu – zabezpečuje samotný obrazový výstup na monitor, ktorý sa pripája k výstupu grafickej karty. Túto úlohu môže mať aj GPU integrované v procesore (alebo ešte predtým čipovej súprave). My sa ale budeme zaoberať samostatnými grafickými kartami.

Technikálie pre zvedavých: Čím sa GPU ako procesor líši od CPU?

GPU je možné chápať ako procesor v niečom podobný CPU, ale stavaný na veľmi masívny paralelizmus používajúci až tisíce súčasne spracovávaných vlákien. Je dobré vedieť, že jadrám CPU v GPU zodpovedajú celé výpočtové jednotky (bloky SM pri Nvidii, tzv. CU či WGP pri AMD), nie to, čomu sa bežne hovorí jadrá CUDA, shadery alebo stream procesory.

Jadro GPU používa veľmi široké jednotky SIMD a jednotlivé shadery či jadrá CUDA sú v skutočnosti len jeden SIMD „pruh“ takejto jednotky. Podstatné je, že pri jednotke SIMD jedna inštrukcia vykonáva vždy rovnakú operáciu súčasne s mnohými dátami v jednotlivých pruhoch, ako keď vedľa seba idú autá rovnakým smerom na viacpruhovej diaľnici. Pri GPU je to typicky 32 pruhov čiže 32 hodnôt v jednotke SIMD, s ktorými je naraz počítaná rovnaká inštrukcia (jedna výpočtová jednotka čiže „jadro GPU“ má ale napríklad dve alebo štyri tieto jednotky SIMD). Jednotlivé shadery preto nie sú nezávislé a musia vždy spracovávať rovnakú inštrukciu.

Schéma jednej výpočtovej jednotky SM. Obsahuje štyri SIMD32 (pracujúce s 32 hodnotami naraz) jednotky, zdieľanú cache, textúrovacie jednotky a jadro RT

Na rozdiel od CPU jedno jadro GPU (teda blok SM alebo CU) nemá príliš vysoký jednovláknový výkon a nevie sa dobre vysporiadať s latenciou pamätí alebo vetvením. Na GPU teda nemôže efektívne bežať akýkoľvek kód. Je vhodné na spracovanie masívneho množstva dát vtedy, keď môže spracovanie prebiehať v mnohých paralelných vláknach súčasne, a výpočtov bez zložitého vetvenia a správania algoritmu a previazanosti medzi jednotlivými vláknami. Preto je GPU vhodné na výpočty hernej grafiky, numerické výpočty v masívnej škále alebo na akceleráciu AI (ktorá pozostáva z maticových výpočtov nad veľkými objemami dát). Úlohy ako napríklad dekompresia formátu zip, spracovanie javascriptu na webových stránkach alebo beh operačného systému by architektúre GPU naopak išli zle.

Úloha API

Dôležitá odlišnosť GPU od CPU je tiež to, že na GPU obvykle nespúšťame binárny kód programu štýlom, akým spúšťate program na CPU. Beh kódu na GPU je sprostredkovaný softvérovou vrstvou v ovládačoch, ktorá prekladá kód programu (napríklad shadery hry) na preložený kód používajúci inštrukcie konkrétneho typu GPU. GPU preto nemajú stabilnú a kompatibilnú inštrukčnú sadu ako napríklad x86 procesory. Inštrukčné sady sa u GPU medzi generáciami môžu meniť a tieto odlišnosti sú schované za ovládačom (softvérovým „stackom“), ktorý ešte len predstavuje ono stabilné rozhranie, na ktoré autor softvéru mieri.

Namiesto priameho spúšťania preloženého binárneho kódu sú pri programovaní GPU používané rôzne API, ktoré vytvárajú abstrakciu od samotnej architektúry konkrétneho GPU. Pre hry a 3D grafiku sú tradične používané API DirectX na platforme Windows a multiplatformné API Vulkan a OpenGL. Na výpočtové použitie existujú API OpenCL a veľmi široko je dnes používaná softvérová vrstva CUDA, ktorú ponúkajú GPU firmy Nvidia. Obdobou u GPU od AMD je vrstva ROCm alebo pre GPU Intelu oneAPI. Tieto API poskytuje pre software práve ovládač GPU.

Grafická pipeline: Ako v GPU vzniká obraz hier?

Proces vykresľovania snímok 3D grafiky prebieha v tzv. grafickej pipeline, ktorá sa skladá z väčšieho počtu krokov. V historických začiatkoch bolo viac krokov tohto procesu zverených CPU, než sa začali akcelerovať na GPU. Pipeline mala spočiatku z väčšej časti tzv. fixné funkcie, čo znamená, že operácie boli grafickým procesorom vykonávaným daným spôsobom obvykle na k tomu vyhradených hardvérových jednotkách (tento princíp sa doteraz uplatňuje pri jednotkách ako ROP a TMU).

Postupom času sa ale s rastom významu shaderových programov v hrách čoraz väčšia časť pipeline menila na flexibilnú a programovateľnú. V súčasnosti jej prevažnú časť spracúvajú všeobecné výpočtové jednotky („shadery“) ako shaderové programy. Má to tú výhodu, že autor softvéru môže tieto procesy rôzne upravovať a ovplyvňovať a pri tvorbe hier alebo iných aplikácií má tak väčšie možnosti.

1. Výpočty v rámci aplikácie na CPU

Začiatok spracovania obrazu v grafickej pipeline leží ešte mimo samotného GPU. To nie je samostatným výpočtovým systémom a aplikácia – či už hra, alebo nejaký pracovný program – beží primárne na procesore počítača. V prípade hry beží na procesore jej „engine“ a ďalšie súčasti a tiež spracovanie vstupov gamepadu, klávesnice alebo myši, ako aj ďalšie vstupy (simulácia AI nepriateľov v hre, pohyby súperov, o ktorých prídu informácie po sieti). Aplikácia tiež v tejto fáze musí riešiť aj napríklad kolízie objektov.

Engine hry na základe týchto vstupov zadáva grafickej karte (GPU) úlohu vykresliť budúcu snímku. V tomto zadaní sú zahrnuté všetky prvky (tzv. „primitives“), ktoré majú byť vo výslednej snímke, teda objekty zložené z polygónov a textúr, ich osvetlenie a na ne aplikované efekty. Spolu s objektmi je definovaná aj „kamera“, definujúca, čo zo scény bude premietané na výsledný obraz.

Keď aplikácia odovzdáva prvky snímky na jej vykreslenie GPU, komunikuje pritom cez API a grafický ovládač, ktorý API implementuje a ktorý ešte len „hovorí“ so samotným grafickým čipom. Kód shaderov je tiež najprv spracovaný na procesore, ovládače GPU musia shadery skompilovať pre architektúru použitého čipu GPU. Táto kompilácia sa spravidla vykonáva vopred (pri spustení hry, pred načítaním úrovne) a výsledok býva často uložený do cache na disku, aby sa kompilovanie nemuselo neustále opakovať. Kompilácia shaderu nie je bežnou súčasťou grafickej pipeline, stojí mimo (niekedy však môžu byť shadery kompilované štýlom „just in time“ za behu hry).

2. Spracovanie geometrie a osvetlenia

Prvým krokom, ktorý sa dnes vykonáva už na samotnom GPU, je spracovanie geometrie scény a manipulácia a transformácia, ktoré na nej treba vykonať. Geometriou sa myslí „drôtový model“ 3D scény tvorený polygónmi, ktoré sa skladajú z jednotlivých trojuholníkov a ich vrcholov (tým sa hovorí vertexy).

Každý tvar je v 3D grafike zložený zo siete trojuholníkov (trojuholník je základná grafická tzv. „primitive“, vedľa bodov a línií) napojených svojimi hranami a vrcholmi, ktoré celkovo tvoria tvar objektu. Trojuholník sa ako základ používa preto, že vždy tvorí rovinu – v histórii existovali pokusy používať ako základ 3D grafiky štvoruholníky, ale viac-menej sa neujali. Viditeľný povrch objektu je vytvorený tak, že je každému trojuholníku priradená textúra, v ktorej je uložený dvojrozmerný obraz povrchu.

Príklad polygónového modelu objektu, na ktorom je viditeľná skladba z trojuholníkov (zdroj: Nvidia)

Geometria scény dávnejšie bývala spracovávaná fixným spôsobom, dnes je programovateľná pomocou geometrie shaderov, mesh shaderov a ďalších typov shaderových programov (historicky prvý typ shaderov pracujúcich s geometriou boli vertex shadery). Spracovanie geometrie dnes tiež môže samo generovať nové prvky geometrie priamo pomocou kódu bežiaceho na GPU – príkladom je napríklad tzv. teselácia, ktorá môže do nejakej časti modelu pridávať ďalšie vrcholy a tvary.

V rámci spracovania geometrie prebieha aj tzv. culling. Ten spočíva v detekovaní objektov, ktoré nie sú vidieť buď preto, že sa nachádzajú mimo zorného uhla kamery, alebo sú prekryté objektmi nachádzajúcimi sa bližšie k kamere. Architektúry GPU sa snažia neustále zlepšovať v detekovaní takých častí scény, pretože ich vyradenie zo scény v čo najskoršom štádiu spracovania pomáha ušetriť viac výkonu pre objekty, ktoré sú vidieť.

Na spracovanie geometrie prislúcha čiastočne aj spracovanie osvetlenia v scéne, hoci sa reálne realizuje až neskôr. V tejto fáze grafickej pipeline jednotlivým trojuholníkom, respektíve vertexom, môžu byť vypočítané a pridelené hodnoty udávajúce mieru iluminácie, ktoré potom budú aplikované neskôr v nasledujúcej fáze. Osvetlenie môže byť globálne alebo pochádzajúce z lokálnych zdrojov. Jeho simuláciu však výrazne mení raytracingové vykresľovanie, pokiaľ je použité.

Textury a výsledný objekt po namapování na polygonové modely (zdroj: Nvidia)
Textury a výsledný objekt po namapování na polygonové modely (zdroj: Nvidia)

3. Rasterizácia

V predchádzajúcom kroku objekty scény existovali definované svojou geometriou a číselnými hodnotami v 3D priestore. Rasterizácia spočíva v tom, že sa na základe týchto údajov premietne scéna ako už dvojrozmerný obraz do plochy, ktorá už je tvorená rastrom individuálnych bodov. Pri tomto premietnutí sa teda už vytvoria body snímky.

Každý jednotlivý bod ako súprava farebných hodnôt (niekedy sa používa označenie fragment) je vypočítaný tak, že sa stanoví, ktoré primitívy (trojuholníky) ho tvoria. Na trojuholníky sa mapujú textúry (povrchy) podľa zadania, ktoré GPU na začiatku dostalo – podľa tohto mapovania sú vybrané vzorky textúry, ktoré vypočítavanému bodu zodpovedajú. Je tiež aplikovaný efekt intenzity osvetlenia vypočítanej v predchádzajúcom kroku. A na bod sa pred jeho zápisom aplikujú požadované pixel shadery (tiež označované „fragment shadery“).

Geometrické útvary a jejich výstup po rasterizaci (ilustrace: Drummyfish, Wikimedia Commons)
Geometrické útvary a ich výstup po rasterizácii do obrazových bodov (ilustrácia: Drummyfish, Wikimedia Commons)

V tejto fáze sa tiež pomocou hodnôt priehľadnosti vypočítava, ako majú vyzerať body ovplyvnené napríklad polopriehľadnosťou alebo priehľadnosťou nejakého objektu. Na zlepšenie kvality a zabránenie aliasingu (efektu viditeľných prechodov medzi pixelmi, vedúce k vnemu zubatých hrán a čiar), sa používajú metódy vyhladzovania (anti-aliasingu), napríklad MSAA, kedy sa na stanovenie farebných hodnôt bodu použije viac vzoriek, čo simuluje vyššie rozlíšenie.

Rasterizácia ako taká bývala fixným procesom, čo v základe platí. Ale postupom času získala programovateľnosť. Na body môžu byť aplikované rôzne druhy shaderových programov, čím je možné realizovať zložitejšie efekty, než aké sú možné len pomocou procesu rasterizácie polygónov a textúr.

4. Post-processing a zobrazenie

Akonáhle je hotový rastrový obraz, môže byť odoslaný na monitor, čím grafická pipeline končí. To sa deje tak, že výstupný blok GPU začne z frame bufferu, v ktorom výsledok je v pamäti uložený, dáta čítať a postupne odosielať cez rozhranie monitora. Aby sa predišlo odoslaniu nehotovej snímky, môže byť používaný dvojitý buffer a vertikálna syncrhonizácia zmiňovaná na predošlej strane, kedy sa kreslí do odlišného priestoru, než z akého výstupný blok GPU číta dáta pre monitor. Po dokončení snímky sa tieto buffery prepnú.

V moderných hrách ale medzi krokom rasterizácie do bodov a odoslaním snímky na monitor môžu prebiehať ešte mnohé ďalšie operácie pracujúce ďalej so snímkou ​​zostavenou v predchádzajúcom kroku, ktorým sa hovorí post-processing. Shaderové programy tu môžu aplikovať ďalšie efekty, vykonávať upscaling snímky, alebo mu upravovať farby (napríklad pre potreby mapovania HDR obrazu). Niektoré metódy vyhladzovania fungujú práve v tejto fáze na princípe post-processingu.

Polygonálny model tvoriaci základ 3D scény. Spolu s textúrami aproximuje reálny svet (ilustrácia, zdroj: Nvidia)

Upscaling a generovanie snímok

V posledných rokoch začali byť v hrách dôležité technológie upscalingu alebo interpolácie snímok, ktorých cieľom je zvýšiť výstupnú snímkovú frekvenciu 3D vykresľovania nad rámec toho, čo poskytuje čistý výpočtový výkon GPU. Upscaling (tiež zvaný technika Super Resolution) spočíva v tom, že sa hra či program vykresľuje s nižším rozlíšením, ktoré je potom preškálované na vyššie v rámci post-processingu.

Aby sa kvalita priblížila kvalite plného (tzv. „natívneho“) rozlíšenia, sú používané pokročilé techniky ako nasadenie umelej inteligencie pre škálovanie rastrového obrazu snímky. Tá nahrádza bežné škálovacie algoritmy. AI model pre toto použitie sa trénuje na korpuse obrazových dát zostavených z vysoko kvalitných referenčných snímok a verzií rovnakých snímok s nižším rozlíšením. AI sa potom počas trénovania učí odvodiť z verzie snímky s nízkym rozlíšením taký obraz, ktorý sa čo najviac podobá referenčnému snímku s vysokou kvalitou. Pri hernom upscalingu potom umelá inteligencia robí takto naučené zmeny. Tieto techniky môžu využívať špeciálne jednotky na akceleráciu AI v GPU.

Temporálna rekonštrukcia aplikovaná po upscalingu je jedna z najúčinnejších techník na zlepšenie kvality. Využíva dáta o pohybe v scéne na tzv. kompenzáciu pohybu, čo dovoľuje skombinovať obrazovú informáciu v aktuálnej snímke s informáciou z predchádzajúcich snímok vďaka tomu, že na základe znalosti vektorov pohybu v scéne vieme, ktoré body predchádzajúcich snímok je možné použiť ako referenciu pre bod v aktuálnej snímke (čiže ktoré body v rôznych snímkach patria k určitému objektu).

Skombinovaním potom máme viac vizuálnej informácie pre aktuálnu snímku, než sa nachádza v jej vykreslenej verzii so zníženým rozlíšením, takže pridaním tejto informácie je možné obraz v snímke vylepšiť. Vďaka temporálnemu filtrovaniu cez niekoľko po sebe idúcich snímok táto technika dokáže potlačiť niektoré chyby v obraze, ktoré spatiálne techniky (fungujúce len v rámci rastra bodov jednej snímky) majú problém eliminovať alebo im predísť a ktoré sa môžu prejavovať chvením alebo blikaním obrazu. Na druhú stranu je pri temporálnom filtrovaní riziko, že vzniknú chyby („duchov“ či rozmazanie) jeho chybnou aplikáciou, čomu musí byť venovaná starostlivosť pri ladení týchto techník.

Dôležité je, že pri temporálnej rekonštrukcii sú snímky zo zníženým rozlišením, z ktorých sa robí upscaling, vždy vykreslované na GPU s malým subpixelovým posunom, ktorý sa postupne strieda. Posun je pak kompenzovaný pri upscalingu aj pri temporálnom zkomobinovaní dát z týchto snímok. To, že vstupné vzorky snímok pochádzajú z vždy trocha inakých pozícií, efektívne zlepšuje výsledné rozlišenie a kvalitu výstupného obrazu, keď sú tieto vzorky interpolované a temporálne zkombinované s dátami z predošlých snímok (aj keď dimenzia snímok použitých pre upscaling ostává rovnaká).

DLSS 3 pri generovaní snímok kombinuje vektory komunikované hrou s vektormi nájdenými technikou Optical Flow pre lepšiu kvalitu (zdroj: Nvidia)

Na kompenzáciu pohybu pomocou pohybových vektorov stojí aj technológia tzv. generovania snímok. Tá z informácií o pohybe odhaduje pohyb objektov v scéne medzi snímkami, ktoré GPU už vykreslilo. Na základe toho potom dokáže zostaviť novú medzisnímku, ktorá odhaduje, aká by mala byť poloha objektov v časovom bode medzi reálne vykreslenými snímkami. Ide o podobnú techniku, aká je používaná na zvýšenie snímkovej frekvencie v televíziách. GPU takto môže pridať jeden aj viac snímok medzi každé dve snímky reálne vykreslené hrou.

Fungovanie pipeline DLSS 3 s generovaním snímok (zdroj: Nvidia)

Nevýhoda je, že generované snímky môžu trpieť nižšou kvalitou alebo vizuálnymi chybami spôsobenými chybne odhadnutým pohybom alebo vyplývajúcimi z toho, že na odhadnutie týchto snímok sú ako podklad dostupné len neúplné informácie. Táto technika tiež potrebuje na prácu, aby už boli hotové posledné dva snímky, z ktorých jeden potom vždy čaká na zobrazenie vygenerovaných snímok, než príde na rad. Generovanie snímok preto o trochu zvyšuje latenciu (oneskorenie medzi vstupom a obrazom) hry. Obraz v generovanej snímke tiež nijako nereaguje na vstup ovládania alebo diania v hre, pretože je zostavený čisto z výstupných vizuálnych dát susedných snímok a program hry do neho nezasahuje.

Tieto techniky sa objavili v roku 2018 a nasledujúcich, najprv v technológii DLSS od Nvidie (vyžaduje grafické karty GeForce), potom tiež v rámci alternatív: FSR od AMD a XeSS od Intelu. Časovo sa ich príchod kryje s rozširovaním raytracingovej grafiky a môžu slúžiť ako nástroj, ktorý kompenzuje veľkú výpočtovú náročnosť ray tracingu. Zároveň môžu pomôcť k dosiahnutiu vyšších snímkových frekvencií na špeciálnych monitoroch schopných vysokých obnovovacích frekvencií alebo na monitoroch a televíziách s veľmi vysokými rozlíšeniami, akým je napríklad 8K.

Contents

NVIDIA GeForce RTX řady 50: Vaše ideální grafické studio

Grafické karty NVIDIA GeForce RTX jsou nejoblíbenější řešení pro hraní her na PC, ale jsou navržené také pro využití ve velké škále polo i plně profesionálních pracovních a kreativních činností. Ovladače NVIDIA Studio otevírají majitelům grafik GeForce RTX řady 50 v desktopech i noteboocích možnosti, dříve dostupné jen s mnohem dražšími profesionálními GPU. Můžete se tak s nimi směle pustit do tvorby náročné 3D grafiky, jak si ukážeme. Celý článok „NVIDIA GeForce RTX řady 50: Vaše ideální grafické studio“ »

Byli jsme v továrně Gigabyte: Galerie z výroby grafik a desek

Minulý týden jsme reportovali z veletrhu Computex, kde jsme prostřednictvím našeho kolegy navštívili stánky různých firem. Z Tchaj-wanu máme ještě jednu fotoreportáž. Dostali jsme se totiž také do továrny firmy Gigabyte vyrábějící například základní desky a grafiky, odkud máme galerii fotografií. Vzdor populární představě neprobíhá všechna výroba hardwaru jenom v Číně, dost komponent se totiž vyrábí přímo na Tchaj-wanu. Celý článok „Byli jsme v továrně Gigabyte: Galerie z výroby grafik a desek“ »

Test Gigabyte AMD Radeon RX 9070 Gaming OC 16G: levnější a lepší

Levnější grafické karty nové generace už jsou v našich obchodech dostupnější než před pár týdny. Radeon RX 9070 Gaming OC patří k těm nejlevnějším modelům, které už mají obchody běžně skladem. Konstrukci má podobnou jako výkonnější Gigabyte AMD Radeon RX 9070 XT Gaming OC, ale díky nižší spotřebě nabídne mnohem lepší provozní vlastnosti a celkově je zajímavější volbou než jeho výkonnější příbuzný. Celý článok „Test Gigabyte AMD Radeon RX 9070 Gaming OC 16G: levnější a lepší“ »

One comment Pridať komentár

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *