Návod: Použití diagnostiky grafiky k ladění výpočetního shaderu
Tento návod ukazuje, jak použít nástrojů Diagnostika grafiky sady Visual Studio k vyšetření výpočetního shaderu, který generuje nesprávné výsledky.
Tento návod ilustruje tyto úkoly:
Použijte k vyhledání potenciálních zdrojů problému Seznam událostí grafiky.
Pomocí Zásobníku volání události grafiky ke zjištění, který výpočetní shader je proveden součástí událostí DirectCompute Dispatch.
Pomocí okna Fáze zřetězení grafiky a ladicího programu HLSL zkoumejte výpočetní shader, který je zdrojem potíží.
Situace
V tomto scénáři jste napsali simulaci dynamiky kapalin, která používá rozhraní DirectCompute k vykonání výpočetně nejnáročnějších částí aktualizace simulace.Při spuštění aplikace vykreslování datové sady a uživatelského prostředí vypadá správně, ale simulace se nechová podle očekávání.Pomocí Diagnostiky grafiky můžete zaznamenat problém do protokolu grafiky pro účely ladění aplikace.Problém v aplikace vypadá následovně:
Informace o tom, jak zachytit problémy s grafikou v protokolu grafiky, naleznete zde: Zaznamenání grafických informací.
Zkoumání
Pomocí nástrojů Diagnostiky grafiky můžete načíst soubor protokolu grafiky, abyste mohli kontrolovat rámce, které byly zaznamenány během testu.
Přezkoumání snímku v protokolu grafiky
V sadě Visual Studio načtěte protokol grafiky, který obsahuje rámec vykazující nesprávné výsledky simulace.Nová karta Diagnostika grafiky se zobrazí v sadě Visual Studio.V horní části této karty je výstup cíle vykreslení vybraného snímku.V dolní části je Seznam snímků, který zobrazuje náhled každého zachyceného snímku.
V seznamu snímků vyberte snímek, který ukazuje chování nesprávné simulace.Přestože se v kódu simulace objeví chyba a v kódu vykreslování nikoli, je třeba zvolit snímek, protože události DirectCompute jsou zachyceny na základě jednotlivých snímků spolu s událostmi Direct3D.V tomto scénáři vypadá karta protokolu grafiky takto:
Po vybrání rámce, který znázorňuje problém, můžete použít Seznam událostí grafiky k provedení diagnostiky.Seznam událostí grafiky obsahuje události pro každé volání DirectCompute a volání API rozhraní Direct3D, které bylo provedeno během aktivního rámce, například volání rozhraní API pro spuštění výpočtu na GPU nebo vykreslení objektu datové sady nebo uživatelského rozhraní.V tomto případě nás zajímají události Dispatch, které představují části simulace, která je spuštěna na jednotce GPU.
Nalezení události odeslání pro aktualizaci simulace
Na panelu nástrojů Diagnostika grafiky volbou možnost Seznam událostí otevřete okno Seznam událostí grafiky.
Zkontrolujte Seznam událostí grafiky pro událost draw, která vykresluje datovou sadu.Pro zjednodušení, zadejte v pravém horním rohu okna Seznam událostí grafiky v poli Hledání termín Draw.Seznam tak bude vyfiltrován, aby obsahoval pouze události, které obsahují v názvech řetězec „Draw“.V tomto scénáři zjistíte, že došlo k těmto událostem draw:
Procházejte všemi událostmi draw při sledování cíle vykreslení na kartě dokumentu protokol grafiky.
Zastavení při vykreslování cíle nejprve zobrazí vygenerovanou datovou sadu.V tomto scénáři je vykreslena datová sada při první události draw.Zobrazí se chyba simulace:
Nyní vyhledejte v Seznamu událostí grafiky událost Dispatch, která aktualizuje simulaci.Vzhledem k tomu, že je pravděpodobné, že simulace je aktualizován před vykreslením, můžete se nejprve soustředit na události Dispatch, které nastanou před událostí konceptu, která generuje výsledky.Usnadněte si to změnou pole Hledat na Draw;Dispatch;CSSetShader (.Vyfiltruje seznam tak, aby obsahoval také události Dispatch a CSSetShader vedle událostí draw.V tomto scénáři zjistíte, že několik událostí Dispatch nastalo před událostí draw:
Teď když víte, kolik málo z potenciálně mnoha událostí Dispatch by mohlo souviset s problémem, můžete je prozkoumat podrobněji.
Zjištění, který výpočetní shader odeslání výpočtu provede
Na panelu nástrojů Diagnostika grafiky volbou možnost Zásobník volání události otevřete okno Zásobník volání událostí grafiky.
Počínaje událostí draw, která vykresluje výsledky simulace, provádí přechod zpět každý pomocí jednotlivých událostí CSSetShader.Potom v okně Zásobník volání události grafiky zvolte funkci zcela nahoře a přejděte na lokalitu volání.V místě volání webu můžete použít první parametr funkce CSSetShader k určení, které výpočetní shadery jsou provedeny následující událostí Dispatch.
V tomto scénáři existují tři páry událostí CSSetShader a Dispatch v každém rámci.Při zpětné práci přestavuje třetí pár krok integrace (kam jsou skutečně přesunuty tekuté částice), druhý představuje krok vynucení výpočtu (kde se počítají síly ovlivňující jednotlivé částice) a první pár představuje krok výpočtu hustoty.
Ladění výpočetního shaderu
Na panelu nástrojů Diagnostika grafiky volbou možnost Fáze zřetězení otevřete okno Fáze zřetězení grafiky.
Vyberte třetí událost Dispatch (tu, která bezprostředně předchází události draw) a poté v okně Fáze zřetězení grafiky pod fází Výpočetní shader vyberte Spustit ladění.
Ladicí program HLSL je spuštěn na shaderu, který provádí krok integrace.
Zkontrolujte zdrojový kód pro výpočet shaderu v rámci integrace pro potřeby hledání zdroje chyby.Při použití diagnostiky grafiky k ladění kódu Shader výpočtu HLSL počítače můžete projít celý kód a použít další známé ladicí nástroje, jako jsou okna kukátka.V tomto scénáři zjistíte, že není chyba ve výpočetním shaderu, který provádí krok integrace.
Chcete-li zastavit ladění výpočetního shaderu, na panelu nástrojů Ladění zvolte možnost Zastavit ladění (klávesnice: Shift + F5).
Dále vyberte druhou událost Dispatch a spusťte ladění výpočetního shaderu, stejně jako v předchozím kroku.
Ladicí program HLSL je spuštěn na shader, který vypočítá síly, které působí na jednotlivé částice kapaliny.
Zkontrolujte zdrojový kód pro výpočet shaderu v rámci vynuceného výpočtu.V tomto scénáři zjistíte, že zdroj chyby je zde.
Po zjištění umístění chyby můžete zastavit ladění a upravit zdrojový kód pro výpočet shaderu na správný vypočet vzdálenosti mezi vzájemně komunikujícími částicemi.V tomto scénáři stačí změnit řádek float2 diff = N_position + P_position; na float2 diff = N_position - P_position;:
V tomto scénáři, protože jsou výpočetní shadery kompilovány za běhu, je možné pouze restartovat aplikaci po provedení změn, abyste viděli, jak ovlivňují simulaci.Nemusíte aplikaci znovu vytvořit.Při spuštění aplikace zjistíte, že simulace nyní pracuje správně.