Seznam kapitol
Co jsou to asynchronní shadery a k čemu vlastně slouží? Jak zapadají do kontextu DirectX 12? Které grafické karty je podporují, které zase ne a proč? V dnešním článku odpovíme právě na takovéto otázky.
MDolenc test: AMD
Na diskuzním fóru
Beyond3d
vytvořil uživatel pod přezdívkou
MDolenc
poměrně zajímavý test, který zjišťuje chování grafických karet při odesílání mixovaných grafických a výpočetních úloh. Tento test spočívá v tom, že odesílá grafické příkazy (Draw calls) pomocí fronty grafické (3D queue) a zároveň paralelně také i výpočetní příkazy (Dispatch calls) pomocí fronty výpočetní (Compute queue). Počet těchto úloh je postupně navyšován až do počtu 512 a je měřen čas jejich zpracování. Dalo by se tedy říci, že tento
test simuluje chování grafických karet při použití DirectX 12 a Multi-engine
.
Test probíhá ve třech průchodech. V prvním průchodu jsou testovány pouze úlohy výpočetní, kde pro jejich odesílání na GPU je použita pouze jediná fronta (Compute queue) a zaznamenány časy exekucí. Ve druhém průchodu jsou pak na GPU zasílány souběžně úlohy grafické i výpočetní pomocí dvou front (3D queue a Compute queue) a opětovně měřeny časy. Třetím průchodem jsou pak všechny příkazy, jak grafické, tak také výpočetní, zasílány na GPU pomocí fronty jediné (3D queue) a samozřejmě opět měřeny časy. Tento třetí průchod ale v dnešních měřeních používat nebudeme a soustředíme se pouze na první dva průchody.
Pokud jsou naměřené časy snímků u obou průchodů totožné, znamená to, že výpočetní úlohy byly prováděny souběžně s úlohami grafickými a grafická karta pracuje v režimu
SMT
(simultánní multi-threading). V opačném případě, kdy se časy úloh v obou průchodech liší, výpočetní úlohy nebyly prováděny souběžně s úlohami grafickými, ale pouze sekvenčně, jedna po druhé a časy úloh se pak sčítají.
	Z grafu je patrné, že výpočetní úlohy (modrá) jsou dokončovány prakticky ve stejnou dobu jako úlohy grafické (červená). Latence výpočetních úloh jsou skryty v úlohách grafických a vše tedy funguje tak, jak by mělo.
Pomocí GPUView se pojďme podívat, jak věci fungují a probíhají uvnitř DirectX 12.
Průchod 1 – exekuce pouze výpočetních úloh
	- pro zvětšení klikněte na obrázek -
V tomto průchodu jsou zpracovávány pouze výpočetní úlohy, a jak se dalo očekávat, výpočetní Device Context aplikace
AsyncCompute.exe
(žlutá) odesílá příkazy do výpočetní fronty (
COMPUTE_0
), o kterou se následně stará příslušná jednotka
ACE
.
Průchod 2 – souběžné exekuce grafických i výpočetních úloh
	- pro zvětšení klikněte na obrázek -
V tomto průchodu jsou zpracovávány jak úlohy výpočetní, tak také grafické. Nyní aplikace
AsyncCompute.exe
vytváří kontexty hned dva. Device Context (světle fialová) odesílá výpočetní příkazy opět do fronty výpočetní (
COMPUTE_0
) a souběžně také Device Context (tmavě fialová) odesílá grafické příkazy do fronty grafické (
3D
). Jsou tedy využity zároveň dvě hardwareové fronty, kde o frontu grafickou se na GPU stará engine
GCP
a o výpočetní frontu pak zase engine
ACE
.