Threading a Branching
Jednotku, ktorú nazývame „cluster dispatch processor“ má na starosti riadenie výpočtov v shader core clusteroch (AMD/ATi ich nazýva SIMDs). Podobný procesor sa nachádza v sampler array. Tieto bloky logických obvodov riadia threading model v R600, zakrývajú latenciu a snažia sa udržiavať tok inštrukcii a dát cez celý čip.
Vstup zo setup enginu predstavujú tri rady príkazov, jeden pre rozdielny druh threadu. Tieto rady príkazov obsahujú thready, ktoré dispatch hardware necháva spracovávať shader core. Každý cluster obsahuje dvojicu ariber-ov, ktoré spracuvávajú dvojice objektových threadov za dobu 4 vykonaných taktov predtým, než sa načítajú nové thready a sú spracovávané. Zaznamenávanie threadov (thread tracking) pre výpočet je kontrolované systémom, ktorý necháva hardwaru vykonávať thready v cluteroch neusporiadane. Zaznamenáva závislosti a iné parametre (aké operácie sú vykonávané, do ktorých registrov sa zapisuje, z ktorých sa číta), aby vedel rozhodnúť, čo sa bude vypočítavať ako ďalšie, namiesto momentálne vykonávaného threadu.
Základná heuristika je nastavená tak, aby sa shader thready, ktoré čakajú na sampler dáta uspali, zakryla sa latencia a vykonali sa nerušene shading operácie.
Pár sequencer-ov (1 pripadá na každý arbiter) vo vnútri dispatch procesora je tu preto, aby zaznamenával cestu threadov vo svojich blokoch, ktoré sa vypočítavajú. Dáta zo sequencer-a, ktoré sa dostávajú do arbiter-a mu dávajú vedieť, kedy je thread skoro kompletne hotový a je možné ho narhadiť novým.
R600 podobne ako iné architektúry zníži počet threadov v akomkoľvek čase, pokiaľ je silný nával na register. Teda nedochádza k brzdeniu („stall“) threadov z dôvodu preplneného registra.
Dynamic branching granularita je 64 pixelov a najvačší výkon sa dosahuje pri použití 4x4 quad blokov usporiadaných na obrazovke (čiže 8x8 pixelov). Pri použití branching shaderov s iným usporiadaním textúr pre sampling v shadery napr. 32x2, 16x4 alebo 2x32, 4x16 dochádza k strate výkonu.
Bloky inštrukcií a konštanty sú udržiavané dispatch procesorom vo vnútri čipu – v určených virtuálnych pamätiach cache. Využívajú sa preto, aby sa maximalizovala efektivita a aby mohol hardware prijať tak rýchlo stav threadu, ako je to len možné. Každý „miss“ (strata dát, ktoré boli potrebné, ale nie sú v pamäti cache) pamäte cache tu spôsobí, že thread, ktorý potreboval dané dáta sa „uspí“. Iný thread sa presunie na jeho miesto a potrebné dáta sa fetch-nu do cache, aby boli pripravené pokiaľ sa thread opäť „zobudí“. Cache „miss“ tu môže takisto spôsobiť, že sa zníži priorita threadu, čiže sa thread nemusí zobudiť po tom, ako ho thread za ním vymenil.
Pokiaľ sa pozrieme na množstvo threadov, ktoré sa dostáva len do shader core, tak sa hardware musí vedieť vysporiadať až s tisíckami threadov (ktoré môžu obsahovať aj stotisíc objektov). Pre sampler thready je heuristika jednoduchšia, nakoľko tu nemôže nastať silný nával na register. Je tu ale požiadavka, aby boli potrebné dáta v správny čas v správnej pamäti cache. Preto tu nenastáva refetch z dôvodu cache „miss“ a priepustnosť čipu je vysoká, zakrývajúca latenciu data fetch a každého filteringu po fetch.
To, že threading model pracuje dobre je aj zásluha pamäťového radiča a jeho schopnosti riadiť a zoraďovať dáta z hlavného pamäťového bloku („main pool“) spolu s DRAM blokom na grafickej karte ku klientom, ktorý si vyžadujú potrebné dáta a následne ich zapamätajú. Teraz sa pozrieme na shader core.
subz3ro
gabriel
epto
Pavol Bobik
MichiGen
koro
Ryko
glide
thimy
A2C
noben
cpy
teho
Dwarden
crux2005
mirke
Dwarden
crux2005