Wskazówki: używanie diagnostyki grafiki do debugowania cieniowania obliczenia
W tym instruktażu przedstawiono sposób użycia narzędzia Visual Studio diagnostyki grafiki do zbadania cieniowania obliczenia, które generuje nieprawidłowe wyniki.
Ten instruktaż ilustruje następujące zadania:
Używanie Listy zdarzeń grafiki do lokalizowania potencjalnych źródeł problemu.
Stos wywołań zdarzenia grafiki umożliwia określenie cieniowania obliczenia, które jest wykonywane przez zdarzenie DirectCompute Dispatch.
Za pomocą okna Etapy potoku grafiki i debugera HLSL można badać cieniowanie obliczenia będące źródłem problemu.
Scenariusz
W tym scenariuszu zaprojektowałeś symulację dynamiki płynów, której używa DirectCompute do wykonywania najintensywniejszej obliczeniowo części aktualizacji symulacji.Po uruchomieniu aplikacji renderowanie zestawu danych i interfejs użytkownika są poprawne, ale symulacja nie zachowuje się zgodnie z oczekiwaniami.Przy użyciu programu Graphics Diagnostics można przechwytywać problemy do dziennika grafiki, dzięki czemu można debugować aplikację.Problem w aplikacji wygląda następująco:
Informacje o sposobach przechwytywania problemów z grafiką w dzienniku grafiki — zobacz Przechwytywanie informacji graficznych.
Dochodzenie
Możesz użyć narzędzi programu Graphics Diagnostics do załadowania pliku dziennika grafiki, aby skontrolować przechwycone klatki.
Aby sprawdzić ramkę w dzienniku grafiki
W programie Visual Studio załaduj dziennik grafiki zawierający ramkę, która wykazuje niewłaściwe wyniki symulacji.Nowa karta programu Graphics Diagnostics pojawia się w programie Visual Studio.W górnej części tej karty jest obiekt docelowy renderowania zaznaczonej klatki.W dolnej części znajduje się Lista klatek, która wyświetla miniaturę każdej uchwyconej klatki.
W oknie Lista klatek zaznacz klatkę, która pokazuje zachowanie nieprawidłowe.Nawet jeśli błąd najwyraźniej pojawia się w kodzie symulacji, a nie wyrenderowanym kodzie, i tak należy wybrać ramkę, ponieważ zdarzenia interfejsu DirectCompute są przechwytywane na zasadzie klatka po klatce, łącznie ze zdarzeniami interfejsu Direct3D.W tym scenariuszu karta dziennika grafiki wygląda następująco:
Po zaznaczeniu klatki, która demonstruje problem, można użyć okna Lista zdarzeń grafiki do zdiagnozowania go.Lista zdarzeń grafiki zawiera zdarzenia dla każdego wywołania interfejsów API DirectCompute i Direct3D dla aktywnej ramki — na przykład wywołania interfejsu API w celu uruchomienia obliczeń w procesorze GPU albo wyrenderowania zestawu danych lub interfejsu użytkownika.W tym przypadku jesteśmy zainteresowani Dispatch zdarzeniem, które reprezentuje części symulacji, działającej na GPU.
Aby znaleźć zdarzenia wysyłki dla aktualizacji symulacji
Na pasku narzędzi Diagnostyka grafiki wybierz Lista zdarzeń , aby otworzyć okno Lista zdarzeń grafiki.
Przegląda Listę zdarzeń grafiki dla zdarzenia remis, które renderuje zestaw danych.Aby to ułatwić, wprowadź Draw w oknie Wyszukaj w prawym górnym rogu okna Lista zdarzeń grafiki.Filtruje listę, tak aby zawiera tylko zdarzenia, które mają "Draw" w tytule.W tym scenariuszu użytkownik odkryjete, że te zdarzenia remisu wystąpiły:
Przejdź przez każde zdarzenie remisu podczas oglądania obiektu docelowego renderowania na karcie graficznej dziennika dokumentu.
Zatrzymaj, gdy obiekt docelowy renderowania po raz pierwszy wyświetli wyrenderowany zestaw danych.W tym scenariuszu obiekt zestawu danych jest renderowany w pierwszym zdarzeniu remisu.Pokazywany jest błąd w symulacji:
Teraz zbadaj Listę zdarzeń grafiki dla zdarzenia Dispatch, które aktualizuje symulację.Ponieważ istnieje duże prawdopodobieństwo, że symulacja zostanie zaktualizowana, zanim zostanie renderowana, użytkownik może skupić się najpierw na zdarzeniach Dispatch, które mają miejsce przed przed zdarzeniem rysowania, które renderuje wyniki.Aby to ułatwić, zmodyfikuj pole Wyszukaj do odczytu Draw;Dispatch;CSSetShader(.Filtruje listę, tak aby zawierała także zdarzenia Dispatch i CSSetShader oprócz zdarzeń rysowania.W tym scenariuszu użytkownik odkryje, że kilka Dispatch zdarzeń wystąpiło przed zdarzeniem remisu:
Teraz, gdy wiesz, które kilka z potencjalnie wielu Dispatch zdarzeń może odnieść się do problemu, można zbadać je bardziej szczegółowo.
Aby określić, które cieniowanie obliczenia wykonuje wywołanie wysyłki
Na pasku narzędzi Diagnostyka grafiki wybierz Stos wywołań zdarzenia , aby otworzyć okno Stos wywołań zdarzenia grafiki.
Począwszy od zdarzenia rysowania, które renderuje wyniki symulacji, poruszaj się do tyłu przez każde poprzednie zdarzenie CSSetShader.Następnie w oknie Stos wywołań zdarzeń grafiki wybierz pierwszą funkcję, aby przejść do witryny wywołania.W miejscu wywołania można użyć pierwszy parametr wywołania funkcji CSSetShader do określenia, które cieniowanie obliczenia jest wykonywane przez następne zdarzenie Dispatch.
W tym scenariuszu istnieją trzy pary CSSetShader i Dispatch zdarzenia w każdej ramce.Licząc od tyłu trzecia para reprezentuje krok integracji (gdzie cząstek płynu faktycznie się poruszyły), druga prezentuje kroku obliczenia siły (gdzie siły, które wpływają na wszystkie cząstki są obliczane), a pierwsza krok obliczania gęstości.
Aby debugować cieniowanie obliczenia
Na pasku narzędzi Diagnostyka grafiki wybierz Etapy rurociągu , aby otworzyć okno Grafika etapów rurociągu.
Wybierz trzecie zdarzenie Dispatch (bezpośrednio poprzedzające zdarzenie draw), a następnie w oknie Etapy potoku grafiki, w obszarze Cieniowanie obliczenia wybierz opcję Rozpocznij debugowanie.
Debuger HLSL zostanie uruchomiony dla programu do cieniowania, który wykonuje krok integracji.
Poszukaj w kodzie źródłowym cieniowania obliczenia kroku integracji na potrzeby wyszukania źródła błędu.Podczas debugowania kodu cieniowania obliczenia HLSL za pomocą diagnostyki grafiki, można przetwarzać kod i użyć innych znanych narzędzi debugowania, takich jak okna czujki.W tym scenariuszu należy określić, że nie wydaje się, żeby w cieniowaniu obliczenia znajdował się błąd, który wykonuje krok integracji.
Aby zatrzymać debugowanie cieniowania obliczenia, na pasku narzędzi debugowania wybierz opcję Zatrzymaj debugowanie (klawiatura: Shift+F5).
Następnie, wybierz drugie zdarzenie Dispatch i rozpocznij cieniowania obliczenia, podobnie jak w kroku wcześniejszym.
Debuger HLSL zostanie uruchomiony dla programu do cieniowania, który oblicza siły działające na wszystkie cząstki płynu.
Poszukaj w kodzie źródłowym cieniowania obliczenie kroku wymuszonego obliczania.W tym scenariuszu należy określić, czy źródło błędu jest tutaj.
Po określeniu lokalizacji błędu, można zatrzymać debugowanie i zmodyfikować kod źródłowy compute-shader, aby poprawnie obliczyć odległość między wchodzącymi w interakcje cząstkami.W tym scenariuszu, po prostu zmień wiersz float2 diff = N_position + P_position; na float2 diff = N_position - P_position;:
W tym scenariuszu, ponieważ cieniowania obliczenia są kompilowane w czasie wykonywania, można tylko ponownie uruchomić aplikację po wprowadzeniu zmian, aby obejrzeć ich wpływ na symulację.Nie trzeba ponownie kompilować aplikacji.Po uruchomieniu aplikacji, można wykryć, że teraz symulacja zachowuje się poprawnie.