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:
Multi-engine - implementace AMD a Nvidia
Jistě jste si všimli, že jsme zatím prakticky všechny naše příklady demonstrovali na grafických kartách architektury GCN společnosti AMD. Je to z jednoho prostého důvodu, tato architektura je dnes poměrně dobře zdokumentována a v případě DirectX 12, společnost AMD do světa vypustila spoustu informací o tom, jak dobře jsou její grafické karty GCN na paralelní workload připraveny.
Pokud byste se nás zeptali na to, jak je na tom společnost Nvidia se svými architekturami Kepler a Maxwell, museli bychom vám prostě a jednoduše odpovědět, že nevíme. Jistě, na internetu se objevuje spousta „zaručených“ informací o tom, jak to či ono tyto grafické karty podporují či nepodporují, ale věřte, že většina těchto informací jsou pouze spekulace, navíc většinou nesprávné.
Prakticky všechny převzaté informace o podpoře Multi-engine na grafických kartách Nvidia pocházejí z článku Amd dives deep on asynchronous shading (anandtech.com), který je však uváděl chybně. Dnes je tento článek již opraven (některé chyby však v článku stále přetrvávají), nicméně objasnění podpory Multi-engine na grafických kartách Nvidia stále nenabízí.
Společnost Nvidia o tom, jak je technologie Multi-engine na jejich grafických kartách podporována, mlčí a my můžeme jen přemýšlet o pravých důvodech tohoto mlčení. Tajemství? Není se čím chlubit? V každém případě si na bližší informace přímo z úst Nvidia budeme muset ještě nějaký ten čas asi počkat.
To nám však nebrání v tom, abychom si vše na dostupných testech a hrách, které podporují DirectX 12, nezměřili a nepokusili se najít vysvětlení sami. Jak s co tedy budeme dnes měřit?
Dnešní testy budou specifické a budeme k nim potřebovat také poněkud sofistikovanější nástroje. Nástroje FRAPS ani FLA Calculator nám dnes stačit rozhodně nebudou, protože budeme potřebovat zejména zjistit, co přesně se v pipeline DirectX 12 v danou chvíli testu děje. Proto dnes využijeme nástroj opravdu silného kalibru, o kterém jste určitě již někdy slyšeli, ale zřejmě málokdo s ním již kdy pracoval. Tímto nástrojem je GPUView společnosti Microsoft. Kdo tento nástroj zná a ví, co přesně ukazuje, bude mít dnes velkou výhodu. Pro ty ostatní se pokusíme vše popisovat detailněji.
Kdo s GPUView ještě nikdy nepracoval, rozhodně se nemusí ničeho obávat, dnes rozhodně nepůjdeme do hlubokých analýz a profilování her. Pro dnešní účely nám bude stačit pouze zjistit, do kterých hardwarových front GPU jsou odesílány příkazy (Command buffers) z kontextu zařízení (kontext aplikace, ve kterém se Command buffers vytvářejí).
Na obrázku odshora vidíte červeně orámovanou grafickou frontu GPU (Hardware Queue 3D), pomocí které jsou na GPU zasílány příkazy grafické. Modře orámovaná fronta (Hardware Queue COMPUTE_0) představuje frontu výpočetní, pomocí které jsou zas na GPU odesílány příkazy výpočetní.
Aplikace s názvem AsyncCompute.exe disponuje dvěma kontexty (Device Context), kdy jeden vytváří příkazy grafické a druhý zase příkazy výpočetní. Šipky pak ukazují, do kterých hardwarových front GPU jsou příslušné příkazy odesílány. Věřte, že toto nám pro naše účely dnes bude bohatě stačit.