Architektura Fermi - Nvidia GF100 se představuje | Kapitola 5
Seznam kapitol
Nová generace grafických karet Nvidia byla už několikrát odložena a každá novinka vzbudí rozruch. Velká většina dosavadních informací byla spíše spekulativního rázu, ale ve dnešním článku vám konečně můžeme nabídnou konkrétní fakta o architektuře a vlastnostech čipu. Získali jsme je přímo na konferenci Deep Dive v Las Vegas.
Jádro GF100 je založeno na škálovatelných GPC blocích, Stream procesorových blocích SM a paměťových řadičích. Jádro nese čtyři GPC bloky, šestnáct SM bloků a šest paměťových řadičů. S počtem těchto jednotek se může u finálních verzí karet na trhu hýbat, zde mluvíme o plném GF100 jádře. To znamená, že nejvyšší karta může nést plné jádro, ale také nemusí. Počet bloků u finálních karet bude zkrátka až do vydání stále nejasný, u karet Tesla to ale už víme, dva SM bloky budou vyplé a karta bude mít aktivních jen 448 CUDA Core. Jak to bude u GeForce nevíme, doufáme ale v plných 512 CUDA Core, NVIDIA se dušuje, že to tak bude. Výhody takovéto modulární architektury jsou asi jasné, umožní velice jednoduše vytvořit levnější čipy s menším výkonem.
Instrukce od CPU jsou předávány GPU skrze PCIe rozhraní, GigaThread engine označí data, která se překopírují ze systémové paměti do paměti grafické karty (framebuffer). GF100 je vybaveno šesti 64-bitovými řadiči pamětí GDDR5. Celková šíře sběrnice je 384-bitů. To je dostatečná šířka pro komunikaci s pamětí. Dále GigaThread engine rozdělí úlohy jednotlivým SM blokům, v rámci SM bloků se dále rozštěpí do jednotlivých CUDA Core a vykonávacích jednotek.
O postup do resterizačních, teselačních a dalších jednotek se také postará GigaThread engine. Jak už víme, jádro je tvořeno šestnácti SM bloky, každé s 32 CUDA Core. To jest maximálně 512 CUDA Core. Každý tento procesor je schopen vykonat vertex, pixel nebo geometry operaci. K uchování textur a potřebných dat slouží L2 cache. Ta na rozdíl od předchozí generace akcelerátorů dokáže rozlišovat mezi typu uložených dat a navíc umožní programátorům i cíleně zapsat data, která se v danou dobu vyplatí mít uložená v cache. Jádro je dále vybaveno 48 ROP jednotkami, pro operace s pixely, atomické operace a vyhlazování. ROP jednotky jsou organizovány v šesti skupinách po osmi, ke každé skupině náleží jeden 64-bit paměťový řadič. Paměťový řadič, ROP jednotky a L2 cache jsou vzájemně propojeny.
GPC blok - Jak už jsem řekl před okamžikem, jádro tvoří čtveřice GPC bloků. Tento blok nese Raster engine a čtyři SM bloky. Hlavními novinkami je právě přítomnost rasterizačního enginu nad SM bloky a PolyMorph enginu v každém SM bloku. V GPC bloku najdeme všechny nejdůležitější grafické jednotky jádra. Ve vzájemném vyváženém svazku najdeme vertex, geometry, raster i pixel procesing jednotky. Kdyby v této části byly i samostatné ROP jednotky, jednalo by se o kompletní a životaschopné GPU se vším všudy. Jde v podstatě o kompletní GPU, jichž jsou v GF100 čtyři. SM bloky a texturovací jednotky jsou také v blocích, nazývajících se TPC. Ke každému SM bloku náleží čtyři vyhrazené texturovací jednotky.
PolyMorph engine
Starší generace GPU používají monolitický frontend k práci s trojúhelníky. Fixní pipeline ale umožňuje pouze fixní výkon, který nelze dále škálovat ani při vysokém počtu výpočetních jader. V různých situacích se může pipeline přetížit nebo naopak zůstat nevyužitá, což činí problém pro geometrické operace a jejich výkon. Teselace totiž dramaticky mění rozložení zátěže jádra GPU a sériová pipeline by nestačila na její potřeby. Bylo potřeba strukturu pipeline změnit., k čemuž vznikl PolyMorph engine.
Každý ze šestnácti PolyMorph enginů má vlastní vertex jednotku a teselátor. Čtyři Raster enginy v každém GPC bloku mohou naráz poslat ke zpracování čtyři trojúhelníky. Společně lze dosáhnout velkého Teselačního a rasterizačního výkonu.
Samotný PolyMorph engine má pět fází zpracování. Vertex fetch, teselace, viewport transformce, attribute setup a Stream Out. Výsledek každé z fází je posílán do SM bloku, ten provede shader operaci a pošle data zpět do PolyMorph enginu k další fázi zpracování. Když jsou všechny fáze hotové, pošle se výsledek do Raster enginu v nadřazeném GPC bloku. Ještě krátký popis fází:
V první fázi se načtou vrcholy z globálního vertex bufferu, jsou pak poslány do SM bloku k provedení vertex a hull shading operace. Během této fáze se objekty transformují a určí se teselační faktor, ten je poté jako LOD poslán do Teselátoru.
V druhé fázi si Teselátor přečte teselační faktor a přenese ho na model z polygonů. Upraví odchylky a pošle informaci o vrcholcích do SM bloku. Tam se aplikuje Domain shader operace, která z hodnot Teselátoru a Hull shaderu vypočítá pozici každého vertexu objektu. V tuto chvíli se také na objekt aplikuje Displacement mapa. Geometry shader upraví model, odebere nebo přidá chybějící nebo přebývající části a pošle data zpět do Teselátoru k finálnímu zpracování.
Ve třetí fázi,Viewpoint transformaci, se vytváří korekce perspektivy a vzhledu. V dalších dvou fázích jsou jsou data přepočítána k další operaci. Když je vše hotovo uloží se data do paměti a jsou k dispozici dalším jednotkám, zde nastupuje Raster engine v GPC bloku.
Raster engine
Poté co objekt opustí PolyMorph engine, putuje z paměti do Raster enginu. V GF100 jsou samozřejmě operace paralelní, Raster engine je v každém GPC bloku. Ten je rozdělen na tři další fáze - Edge setup, Rasterizer a Z-Cull. V Edge setup se počítají napříč trojúhelníky s vertex pozicemi, ty jež nejsou vidět odstraní culling. Každá Edge setup jednotka dokáže provést jednu operaci s bodem, čárou nebo trojúhelníkem za takt.
Rasterizer podle výsledku Edge setup pokryje každý objekt pixely. Pokud je požadavek na vyhlazování, připraví jednotka i potřebné krycí samply. Za jeden takt dokáže Rasterizer zpracovat až osm pixelů.
Pixely vytvořené v Rasterizeru pak putují do Z-Cull jednotky. Ta poté porovnáním s framebufferem a pixely v něm zjistí, které pixely nepůjdou vidět a odstraní je z finálního zporacování.
Streaming Multiprocesor
V jádru GF100 se nachází třetí generace SM bloku, proti první a druhé generaci v jádrech G80 a G200 došlo k mnohým změnám. V SM bloku se nachází 32 CUDA procesorů, každý z nich obsahuje aritmeticko logickou (ALU) jednotku a výpočetní jednotku v plovoucí čárce (FPU). Novinkou je podpora standardu IEEE 754-2008 přidáním FMA instrukcí. Díky této změně pro single i double precision operace, narostl také výrazně výpočetní výkon a minimalizovaly se chyby. ALU jednotka podporuje 32-bitovou přesnost pro všechny instrukce, pro některé lze využít i 64-bitové. Podporována je celá škála matematických instrukcí.
Každý SM blok je dále vybaven šestnácti store/load jednotkami, umožňující provádět až šestnáct vláken za takt. V SM bloku se nachází také čtveřice speciálních jednotek (SFU), vykonávající speciální instrukce (cos, sin). Každá z jednotek umí vykonat jednu funkci v jednom vlákně za takt, v režimu Warp je vykonáno 32 vláken na osm taktů. Pipeline je u těchto jednotek nezávislá na dispatch unit v SM bloku a je možné pokud budou v jednom SM jednotky zaneprázdněné přesunout úlohu do jiného, méně vytíženého SM bloku.
Texturovací jednotky
Každý SM blok má čtyři texturovací jednotky. Každá z nich dokáže zpracovat čtyři operace nad texturou za jeden takt. Výsledek se může vrátit jako filtrovaný nebo nefiltrovaný. Filtrování je podporováno bilineární, trilineární a anisotropické. Větší efektivity texturovacích jednotek bylo dosaženo umístěním do SM bloku, včetně texture cache a navýšením pracovních frekvencí. U jádra G200 každé tři SM bloky sdílely osm texturovacích jednotek. U jádra GF100 má každý SM blok své čtyři jednotky. Také vnitřní struktura jednotek byla výrazně vylepšena. Nárůst výkonu by měl být hlavně patrný v práci se stíny a ambient occlusion. Díky přítomnosti L1 a L2 cache stoupl výkon jednotek až třikrát proti jádru G200. Důležitou změnou je pracovní frekvence, která byla u G200 stejná jako takt GPU. U GF100 ale pracují texturovací jednotky na frekvenci shaderů, to znamená na dvojnásobné frekvenci a vyšší. Mezi další inovace patří podpora DirectX 11 komprese BC6H a BC7, redukující nároky na paměť.
Obrázek ukazuje vylepšení texturovacích jednotek u jádra GF100 proti G200. Nárůst je od 40 procent do více než 60 procent proti staršímu jádru. Čísla jsou z reálných her, tedy s pozitivním vlivem na hry můžeme jistě počítat. I přesto, že jádro G200 má texturovacích jednotek 80, bylo počtem 64 u jádra GF100 výkonově překonáno.
Cache
U jádra G200 bylo z L2 cache možné jen číst, GF100 může i zapisovat. Architektura pamětí cache optimalizuje komunikaci mezi pipeline a redukuje přístupy do hlavního framebufferu karty. Rozdíly mezi starým a novým jádrem ukazuje tabulka na druhém obrázku.