DirectX 12 Multi-engine: asynchronní shadery v praxi
20.11.2015, Pavel Šantrůček, recenze
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.
Kapitoly článku:
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
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
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.