Radeon HD 2900XT - DirectX 10 v podání AMD / ATi | Kapitola 5
Seznam kapitol
Po letech a s několikaměsíčním zpožděním firma ATi (pardon, vlastně AMD) konečně vydává dlouho očekávaný čip R600 v podobě grafické karty Radeon HD 2900 XT. Pokud váš zajímá historický vývoj, architektura čipu, technologické novinky, souvislost se zmíněným projektem R400 a také samozřejmě testy výkonu, stačí pokračovat ve čtení dnešního článku...
Nejvíce otázek kolem čipu R600 souviselo s výpočetními jednotkami. R600 jich nese 64, resp. 320. Lépe řečeno jsou uspořádány v 64 skupinách po pěti. Jsou superskalární a každá zvládá MADD operaci (MUL + MAD). Jedna z pěti navíc ještě funguje i jako SFU (special-function unit tedy specifické operace - např. EXP, LOG, RCP, RSQ, SIN, COS a další...).
Neměli bychom přehlédnout ani roztomile malou branch-execution unit, kterou ale známe již z R520.
Jedno vysvětlení... proč jsou skupiny organizované po pěti jednotkách? Operace s pěti komponentami (5D) jsou typické pro vertex shading, takže jde o jistou formu optimalizace unifikovaných jednotek i pro tyto účely (již výpočetní jednotky Xenosu se v součtu mohly chovat jako 5D, ale byly zčásti vektorové).
Proč započítávat SFU mezi standardní výpočetní jednotky, když se to obvykle nedělá? Protože SFU R600 podporuje i klasické multiply+addition operace - je to tedy plnohodnotná výpočetní jednotka obohacená o podpoporu pro SF. Společnost nVidia tvrdila, že kdyby počítala výpočetní jednotky stejným způsobem jako ATi, tak by k základním 128 (G80) musela přičíst ještě 128 SFU jednotek. Což je ale nesmysl - SFU jednotky G80 klasické aritmetické operace (MUL+ADD) pro general shading nepodporují.
Proč právě jedna jednotka podporuje navíc SFU? Na obrázku vidíte pixel shader jednotku R3xx/R4xx:
znázorněna je tří-cestná (3D = pro práci se třemi komponenty) vektorová jednotka (vector ALU 2) a jedno-cestná (1D) skalární jednotka (scalar ALU 2). Tyto jednotky podporují MADD operace. "Nad" nimi je ještě vidět jedna vektorová (3D) ALU a jedna skalární (1D) ALU. Ty podporovaly pouze sčítání (ADD) a SFU operace. Tato základní architektura byla prakticky nezměněna od R300 až do R580.
(c) Jawed, Beyond 3D forums
Na schématu je znázorněna praktická využitelnost takové konfigurace výpočetních jednotek (vpravo 3D + 1D MAD, vlevo 3D + 1D ADD). Řádky znázorňují čas/takty a bílá políčka nevyužité výpočetní jednotky. Je tedy zřejmé, že vektorová 3D ADD+SFU ALU se příliš nevyužívala. Pokud si jí ze schématu vyškrtneme, získáme tak mnohem efektivnější výpočetní jednotku, která bude celkem 3D+1D+1D = 5D, tedy pěticestná, neboli schopná pracovat na pěti komponentách.
Mírnou úpravou ze 3D+1D+1D na 4D (MAD) +1D (ADD+SFU) jsme se dostali na výpočetní jednotku Xenosu:
(c) Jawed, Beyond 3D forums
Jak je vidět, množství bílých políček kleslo = efektivita vzrostla. 4D vektorová jednotka je schopná na všech komponentách (x,y,z,w) provádět jen jednu stejnou operaci. Pokud se vyskytne situace, kdy pracujeme např. jen se dvěma komponentami (např. x, y - druhý řádek), zůstane zbytek výpočetní jednotky nevyužit. Na R600 šla proto ATi ještě dál a použila superskalární výpočetní jednotky - tedy takové, které se ve většině případů dokážou dělit a pracovat nezávisle.
Skalární výpočetní jednotky (v trošku jiné podobě) používá už nVidia na G80. Hlavní rozdíl oproti R600 je v tom, že G80 si úlohu přeorganizuje a vždy na celé osmici komponent provádí jednu operaci:
(c) Jawed, Beyond 3D forums
Předchozí čipy vždy v jednom taktu zpracovali celou čtveřici/dvojici, zatímco G80 si výpočet otočí jakoby o 90° a zpracovává vždy najednou stejné komponenty různých pixelů. Zpracování sice zabere více taktů, ale každá výpočetní jednotka může zpracovávat jiné vlákno a vytížení je optimální.
Naproti tomu superskalární R600 preferuje tradiční přístup, kdy více jednotek v jednom taktu pracuje na všech komponentách najednou:
(c) Jawed, Beyond 3D forums
R600 je ale schopna oba zmíněné přístupy kombinovat, takže pokud má provést např. operace s pěti 4D hodnotami:
X Y Z W
X Y Z W
X Y Z W
X Y Z W
X Y Z W
...je schopna si tento úkol rozložit mezi pětice svých výpočetních jednotek tak, že čtyři výpočetní jednotky (1 2 3 4) zpracovávají každý takt jednu kompletní 4D hodnotu a pátá výpočetní jednotka (5), aby se "neflákala", běží ve stylu G80 a zpracovává každý takt jednu složku z 4D hodnoty:
1 2 3 4 5
X Y Z W X
X Y Z W Y
X Y Z W Z
X Y Z W W
Nutno však podotknout, že může dojít i na situaci, kdy superskalární jednotky R600 nebudou vytížené naplno - konkrétně je to při závislých skalárních instrukcích (v této situaci může být využita jen jedna z pěti jednotek). Jde ale o nejhorší možný případ - v reálných shaderech je taková situace velice vzácná.