Partilhar via


Instruções passo a passo: usando diagnóstico de gráfico para depurar um sombreador computado

Essa explicação passo a passo demonstra como usar as ferramentas de diagnóstico de elementos gráficos do Visual Studio para investigar um sombreador de cálculo que produz resultados incorretos.

Essa explicação passo a passo ilustra essas tarefas:

  • Usando a Lista de Eventos de Elementos Gráficos para localizar fontes potenciais do problema.

  • Usando a Pilha de Chamadas do Evento de Gráficos para determinar qual sombreador de cálculo será executado por um evento DirectCompute Dispatch.

  • Usando a janela Estágios de Pipelines Gráficos e o depurador de HLSL para examinar o sombreador de cálculo que é a origem do problema.

Cenário

Neste cenário, você escreveu uma simulação de dinâmica de fluidos que usa DirectCompute para executar as partes de computação mais intensa da atualização da simulação. Quando o aplicativo é executado, a renderização do conjunto de dados e a interface do usuário parecem estar corretos, mas a simulação não se comporta conforme o esperado. Usando o Diagnóstico de Gráficos, você pode capturar o problema para um registro de gráficos de modo a depurar o aplicativo. O problema tem esta aparência no aplicativo:

O fluido simulado se comporta incorretamente.

Para obter informações sobre como capturar problemas de gráficos no log de gráficos, consulte Capturando informações de gráficos.

Investigação

Você pode as ferramentas de Diagnósticos Gráficos para carregar o arquivo de log gráficos para que você possa inspecionar os quadros capturados.

Para examinar um quadro no registro de elementos gráficos

  1. No Visual Studio, carregue um log dos gráficos que contém um quadro que exibe os resultados de simulação incorretos. Uma nova guia de Diagnósticos Gráficos aparece no Visual Studio. Na parte superior desta guia está a saída de destino da renderização do quadro selecionado. Na parte inferior está a Lista do Quadro, que exibe cada quadro capturado como a imagem miniatura.

  2. Na Lista do Quadro, selecionar um quadro que demonstre a simulação incorreta de comportamento. Mesmo que o erro pareça estar no código de simulação e não no código de renderização, você ainda tem que escolher um quadro porque os eventos de DirectCompute são capturados em uma base quadro a quadro, juntamente com eventos de Direct3D. Neste cenário, a guia do log dos gráficos parecem como esta:

    Documento de log de elementos gráficos no Visual Studio.

Depois de selecionar um quadro que demonstra este problema, é possível usar a Lista de eventos de gráficos para diagnosticá-lo. A Lista de Eventos de Gráficos contém um evento para cada chamada de DirectCompute e a chamada à API Direct3D que foi feita durante o quadro ativo—por exemplo, chamadas à API para executar uma computação em GPU ou para processar o conjunto de dados ou a interface do usuário. Nesse caso, estamos interessados nos eventos Dispatch que representam partes da simulação executada no GPU.

Para localizar o evento de distribuição da atualização de simulação

  1. Na barra de ferramentas Diagnósticos de Gráficos, escolha Lista de Eventos para abrir a janela Lista de Eventos de Gráficos.

  2. Inspecione a Lista de Eventos de Gráficos para o evento de desenho que renderiza o conjunto de dados. Para tornar isso mais fácil, digite Desenho na caixa Procurar no canto superior direito da janela Lista de eventos de elementos gráficos. Isso filtra a lista de modo que ela contenha somente os eventos que possuam “Desenho” em seus títulos. Neste cenário, você descobre que esses eventos de desenho ocorreram:

    A lista de eventos (EL) mostra os eventos de desenho.

  3. Mova-se por cada evento de desenho enquanto assiste à renderização do destino na guia de documentação de log de elemento gráfico.

  4. Interromper quando o destino de processamento exibir primeiro o dataset processado. Neste cenário, o conjunto de dados é renderizado no primeiro evento de desenho. O erro na simulação é mostrado:

    Isso desenhar evento processa o conjunto de dados de simulação.

  5. Inspecione agora a Lista de Eventos de Gráficos para o evento Dispatch que atualiza a simulação. Como é provável que a simulação seja atualizada antes de ser processada, você poderá concentrar-se primeiramente em eventos de Dispatch que ocorrem antes do evento de desenho que renderiza os resultados. Para tornar isso mais fácil, modifique a caixa Pesquisar para ler Desenho; Distribuição; CSSetShader(. Isso filtra a lista para que ela também contenha Dispatch e os eventos de CSSetShader além dos eventos de desenho. Neste cenário, você descobre que vários eventos Dispatch ocorreram antes do evento de desenho:

    Mostra o EL desenhar, eventos de expedição e CSSetShader

Agora que você sabe que provavelmente alguns de muitos eventos de Dispatch podem corresponder ao problema, você pode examiná-los com mais detalhes.

Para determinar qual sombreador de cálculo uma chamada de distribuição executa

  1. Na barra de ferramentas Diagnósticos de Gráficos, escolha Pilha de Chamadas do Evento para abrir a janela Pilha de Chamadas do Evento de Gráficos.

  2. A partir do evento de desenho que renderiza os resultados da simulação, mova para trás por meio de cada evento anterior de CSSetShader . Em seguida, na janela Pilha de Chamadas do Evento de Gráficos, escolha a primeira função para navegar até o site de chamada. No site de chamada, você pode usar o primeiro parâmetro CSSetShader de chamada de função para determinar qual computador sombreador é executado pelo próximo evento Dispatch.

Neste cenário, há três pares de eventos CSSetShader e Dispatch em cada quadro. Trabalhando de trás para a frente, o terceiro par representa a etapa de integração (onde as partículas fluidas são movidas realmente), o segundo par representa a etapa de cálculo por força (onde os pontos que afetam cada partícula são calculados), e o primeiro par representa a etapa de cálculo por densidade.

Para depurar o sombreador de cálculo

  1. Na barra de ferramentas Diagnósticos de Gráficos , escolha Estágios de Pipeline para abrir a janela de Estágios de Pipeline Gráficos .

  2. Selecione o terceiro evento de Dispatch (aquele que precede imediatamente o evento de desenho) e em seguida, na janela de Estágios de Pipeline Gráficos , na fase de Sombreador de cálculo , escolha Iniciar Depuração.

    Selecionando o terceiro evento expedição no EL.

    O depurador de HLSL é iniciado no sombreador que executa a etapa de integração.

  3. Examine o código-fonte do sombreador de cálculo para a etapa de integração à procura da fonte do erro. Ao usar os diagnósticos gráficos para depurar o código do sombreador de cálculo do HLSL, você pode percorrer o código e usar outras ferramentas de depuração familiares, como as janelas de observação. Neste cenário, você determina que aquele não parece ser um erro no computador sombreador que executa a etapa de integração.

    Depurando o sombreador de computação IntegrateCS.

  4. Para parar a depuração do sombreador de cálculo, na barra de ferramentas Depurar, selecione Parar Depuração (teclado: Shift+F5).

  5. Em seguida, selecione o segundo evento Dispatch e inicie a depuração no sombreador de cálculo, assim como fez na etapa anterior.

    Selecionar o segundo evento de expedição no EL.

    O depurador de HLSL é iniciado no sombreador que calcula os pontos que atuam em cada partícula fluida.

  6. Examine o código-fonte do sombreador de cálculo da etapa de cálculo por força. Neste cenário, você determina que a origem do erro é aqui.

    Depurando o sombreador de computação ForceCS_Simple.

Após determinar o local do erro, você poderá interromper a depuração e alterar o código-fonte do shader computado para calcular corretamente a distância entre as partículas em interação. Neste cenário, você altera apenas a linha float2 diff = N_position + P_position; para float2 diff = N_position - P_position;:

O código de sombreador de cálculo corrigido.

Neste cenário, como os computadores sombreadores são compilados em tempo de execução, você poderá simplesmente reiniciar o aplicativo depois de fazer as alterações para observar como eles afetam a simulação. Não é necessário recompilar o aplicativo. Ao executar o aplicativo, você descobre que a simulação agora se comporta corretamente.

O fluido simulado se comportará corretamente.