Procédure pas à pas : utilisation de Graphics Diagnostics pour déboguer un Shader de calcul

Cette procédure pas à pas explique comment utiliser les outils Visual Studio Graphics Diagnostics pour analyser un nuanceur de calcul qui génère des résultats incorrects.

Cette procédure pas à pas décrit les tâches suivantes :

  • Utilisation de la Liste des événements Graphics pour identifier les sources possibles du problème.

  • Utilisation de la Pile des appels des événement Graphics pour déterminer quel nuanceur de calcul est exécuté par un événement DirectCompute Dispatch.

  • Utilisation de la fenêtre Étapes de canalisation Graphics et du débogueur HLSL pour examiner le nuanceur de calcul à l'origine du problème.

Scénario

Dans ce scénario, vous avez écrit une simulation à dynamique fluide qui utilise DirectCompute pour exécuter les parties nécessitant de nombreuses ressources de calcul pour la mise à jour de simulation. Lorsque l'application est exécutée, le rendu du groupe de données et de l'interface utilisateur semble correct, mais la simulation ne se comporte pas comme prévu. À l'aide de l'outil Graphics Diagnostics, vous pouvez capturer le problème dans un journal graphique afin de déboguer l'application. Dans l'application, le problème ressemble à cela :

Le fluide simulé est défaillant.

Pour plus d'informations sur la façon de capturer des problèmes de graphiques dans le journal de graphiques, consultez le Capture d'informations Graphics.

Examen

À l'aide des outils Graphics Diagnostics, vous pouvez charger le fichier journal de graphiques pour examiner les frames capturés.

Pour examiner un frame dans un journal de graphiques

  1. Dans Visual Studio, chargez un journal de graphiques qui contient un frame qui montre les résultats de simulation incorrects. Un nouvel onglet Graphics Diagnostics apparaît dans Visual Studio. La partie supérieure de cet onglet contient la sortie de cible de rendu du frame sélectionné. Dans la partie inférieure figure la Liste de frames, qui affiche chaque frame capturé sous forme d'une image miniature.

  2. Dans Liste de frames, sélectionnez un frame qui indique le comportement de simulation incorrect. Bien que l'erreur apparaisse dans le code de simulation et non dans le code de rendu, vous devez encore choisir un frame car les événements DirectCompute sont capturés image par image, avec les événements Direct3D. Dans ce scénario, l'onglet du journal des graphiques se présente comme suit :

    Document du journal des graphiques dans Visual Studio.

Après avoir sélectionné un frame illustrant le problème, vous pouvez utiliser la fenêtre Liste des événements Graphics pour le diagnostiquer. La Liste des événements Graphics contient un événement pour chaque appel DirectCompute et chaque appel d'API Direct3D effectué pendant le frame actif, par l'exemple, les appels d'API pour effectuer un calcul sur le GPU ou pour restituer le groupe de données ou l'interface utilisateur. Dans ce cas, nous sommes intéressés par les événements Dispatch qui représentent les parties de la simulation qui s'exécutent sur le GPU.

Pour rechercher l'événement Dispatch pour la mise à jour de la simulation

  1. Dans la barre d'outils Graphics Diagnostics, choisissez Liste des événements pour ouvrir la fenêtre Liste des événements Graphics.

  2. Inspectez la liste des événements Graphics pour l'événement de dessin qui restitue le jeu de données. Pour simplifier ce processus, entrez Draw dans la zone Rechercher dans l'angle supérieur droit de la fenêtre Liste des événements Graphics. La liste est filtrée, afin que les événements contenus comportent « draw » dans leurs titres. Dans ce scénario, vous découvrez que ces événements de dessin se sont produits :

    La liste des événements affiche les événements draw.

  3. Déplacez dans chaque événement de dessin lorsque vous examinez la cible de rendu dans l'onglet de document du journal des graphiques.

  4. Arrêtez lorsque la cible de rendu affiche d'abord le groupe de données rendu. Dans ce scénario, le groupe de données est affiché dans le premier événement de dessin. L'erreur dans la simulation est affichée :

    Cet événement draw restitue le jeu the simulation des données.

  5. Examinez maintenant la liste des événements Graphics de l'événement Dispatch qui met la simulation à jour. Étant probable que la simulation est mise à jour avant d'être affichée, vous pouvez vous concentrer d'abord sur les événements Dispatch qui surviennent avant l'événement de dessin qui affiche les résultats. Pour simplifier ce processus, modifiez la zone Rechercher pour lire Draw;Dispatch;CSSetShader(. Cela filtre la liste afin qu'elle contienne également les événements Dispatch et CSSetShader, en plus des événements de dessin. Dans ce scénario, vous découvrez que plusieurs événements Dispatch se sont produits avant l'événement de dessin :

    La liste des événements affiche les événements draw, Dispatch et CSSetShader

Maintenant que vous savez que quelques événements Dispatch peuvent correspondre au problème, vous pouvez les examiner en détail.

Pour déterminer le nuanceur de calcul exécuté par un appel Dispatch

  1. Dans la barre d'outils Graphics Diagnostics, choisissez Pile des appels des événements pour ouvrir la fenêtre Pile des appels des événements Graphics.

  2. Partant de l'événement de dessin qui affiche les résultats de simulation, revenez à chaque événement CSSetShader précédent. Ensuite, dans la fenêtre Pile des appels des événements Graphics, sélectionnez la fonction supérieure pour accéder au site d'appel. Dans le site d'appel, vous pouvez utiliser le premier paramètre de l'appel de fonction CSSetShader pour déterminer quel nuanceur est exécuté par l'événement Dispatch suivant.

Dans ce scénario, trois paires d'événements de CSSetShader et Dispatch dans chaque frame. En allant à rebours, la troisième paire représente l'étape d'intégration (où les particules fluides sont réellement déplacées), la deuxième paire représente l'étape de calcul des forces (où les forces qui affectent chaque particule sont calculées) et la première paire représente l'étape de calcul de la densité.

Pour déboguer le nuanceur de calcul

  1. Dans la barre d'outils Graphics Diagnostics, choisissez Étapes de canalisation pour ouvrir la fenêtre Étapes de canalisation Graphics.

  2. Sélectionnez le troisième événement Dispatch (celui qui précède immédiatement l'événement de dessin), puis dans la fenêtre Étapes de pipeline graphiques, sous l'étape Nuanceur de calcul, sélectionnez Démarrer le débogage.

    Sélection du troisième événement Dispatch dans la liste des événements.

    Le débogueur HLSL est démarré dans le nuanceur qui exécute l'étape d'intégration.

  3. Examinez le code source du nuanceur de calcul pour l'étape d'intégration permettant de rechercher la source de l'erreur. Lorsque vous utilisez Graphics Diagnostic pour déboguer le code du nuanceur de calcul HLSL, vous pouvez parcourir votre code et utiliser d'autres outils de débogage familiers tels que les fenêtres espion. Dans ce scénario, vous déterminez qu'il ne semble pas y avoir une erreur dans le nuanceur de calcul qui exécute l'étape d'intégration.

    Débogage du nuanceur programmable IntegrateCS.

  4. Pour arrêter le débogage du nuanceur de calcul, dans la barre d'outils Déboguer, sélectionnez Arrêter le débogage (clavier : Maj+F5).

  5. Ensuite, sélectionnez le deuxième événement Dispatch et commencez à déboguer le nuanceur de calcul comme vous l'aviez fait dans l'étape précédente.

    Sélection du deuxième événement Dispatch dans la liste des événements.

    Le débogueur HLSL est démarré dans le nuanceur qui calcule les forces agissant sur chaque particule fluide.

  6. Examinez le code source du nuanceur de calcul pour l'étape force-calcul. Dans ce scénario, vous déterminez que la source d'erreur est ici.

    Débogage du nuanceur programmable ForceCS_Simple.

Après avoir déterminé l'emplacement de l'erreur, vous pouvez arrêter le débogage et modifier le code source du nuanceur de calcul pour calculer correctement la distance entre les particules interactives. Dans ce scénario, vous modifiez juste la ligne float2 diff = N_position + P_position; par float2 diff = N_position - P_position; :

Code du nuanceur programmable corrigé.

Dans ce scénario, car les nuanceurs de calcul sont compilés au moment de l'exécution, vous pouvez simplement redémarrer l'application après avoir apporté les modifications pour observer leurs répercussions sur la simulation. Il n'est pas nécessaire de régénérer l'application. Lorsque vous exécutez l'application, vous découvrez que la simulation se comporte maintenant correctement.

Le fluide simulé se comporte correctement.