Analisar quadros com capturas de GPU
As capturas de GPU (ou quadro) registram todas as chamadas à API do Direct3D 12 que seu aplicativo faz, normalmente em um único quadro (consulte Fazer uma captura de GPU). O PIX pode reproduzir essas chamadas de API para mostrar informações sobre parâmetros de chamadas de API, estados de pipeline e recursos, conteúdo de recursos e muito mais.
Dica
Nem sempre é possível que o PIX faça uma captura de GPU com êxito se um jogo estiver chamando o Direct3D 12 de formas inválidas. O PIX se esforça ao máximo para ser robusto, mesmo no caso de padrões de uso incorretos, mas, inevitavelmente, às vezes é um caso de entrada e saída de lixo. Se estiver tendo dificuldade em fazer capturas de GPU, tente usar a opção Camada de depuração D3D12 e validação baseada em GPU para localizar e corrigir qualquer chamada de API incorreta.
Fazer uma captura de GPU
No modo de exibição conexão inicie ou anexe o processo desejado (garantindo que a opção Para captura de GPU esteja marcada).
Configure suas opções de captura de GPU conforme necessário. Para fazer a captura, clique no botão Fazer uma captura de GPU no PIX ou pressione Alt+Print Screen (ou F11, configurável nas configurações do PIX). Você verá uma miniatura da captura na interface do usuário do PIX. Neste ponto, você pode encerrar seu aplicativo, se desejar. Clique na miniatura para abrir a captura.
Capturas programáticas
Você pode fazer uma captura de forma programática usando o WinPixEventRuntime. Para obter detalhes, consulte a postagem do blog Captura programática.
Exibir chamadas de API com a visualização de eventos
A visualização Eventos mostra todas as chamadas de API que foram gravadas em uma captura de GPU. Há uma lista separada para cada fila do Direct3D 12 (gráficos, computação ou cópia) que foi usada pelo jogo.
A lista de eventos pode ser filtrada, opcionalmente usando expressões regulares (clique no botão .*). Por padrão, ele mostra apenas os eventos que resultaram em trabalho de renderização real para o hardware da GPU, em vez de apenas preparar o estado para uso em operações posteriores. Para incluir eventos que não sejam de GPU, clique no botão !G.
Mais informações sobre cada evento, como o conjunto completo de parâmetros de chamada de API, estão disponíveis na visualização Detalhes do evento. Essa visualização é incluída por padrão na guia Pipeline, mas também pode ser adicionada ao layout atual por meio do botão Modo de design de layout no canto superior direito da janela principal do PIX.
Perfil do quadro
Com uma captura de GPU aberta, mude para a guia Visão geral. Aqui você verá alguns detalhes básicos sobre a captura.
Para iniciar a criação de perfil, você precisará coletar dados de tempo. Para fazer isso, clique no botão Coleta de dados de tempo no canto superior direito da tela na visualização Eventos ou clique no texto Clique aqui para iniciar a análise e coletar dados de tempo na visualização Linha do tempo. Isso reproduz o trabalho da GPU na captura e coleta de dados básicos de tempo, como durações de execução (anotado com PixEvents, se seu aplicativo os tiver). Depois de concluído, você pode coletar dados adicionais para serem representados graficamente nas faixas da linha do tempo, como informações de ocupação e outros contadores específicos da GPU.
Dica
Para obter melhores resultados, não interaja com seu computador enquanto o PIX estiver coletando dados de tempo e feche todos os outros aplicativos que possam estar usando a GPU.
Você também pode ver os contadores divididos por chamada de API na visualização Eventos. Para habilitar/desabilitar contadores, clique no botão Contadores da lista de eventos (canto superior direito da visualização Eventos).
Dados de tempo
Há duas fontes de informações de tempo da GPU:
- Os relatórios de data e hora do início do pipe informam quando a GPU começa a processar cada parte do trabalho. Observe que esses dados estão disponíveis apenas ao executar o Windows 10, build 14393 (ou superior) com um driver gráfico adequado (consulte a postagem do blog Requisitos). Os dados de tempo demoram mais para serem coletados se os carimbos de data/hora do início do pipe não estiverem disponíveis.
- Os carimbos de data e hora do fim do pipe (EOP) relatam quando a GPU terminou de processar cada parte do trabalho.
Como as GPUs são maciçamente paralelas e profundamente canalizadas, é comum que mais de uma parte do trabalho seja executada ao mesmo tempo e que operações adjacentes se sobreponham. O PIX mede o tempo de duas formas diferentes que podem oferecer informações sobre o modelo de execução paralela do hardware:
- A duração da execução é medida desde o início do pipe até o carimbo de data e hora do fim do pipe de cada parte separada do trabalho. Quando medidos dessa forma, os itens de trabalho da GPU que são executados em paralelo com itens anteriores podem parecer mais longos do que se fossem executados isoladamente, devido à contenção na GPU.
- A duração do EOP é medida apartir do carimbo de data e hora do fim do pipe (EOP) do item anterior até o carimbo de data e hora do EOP deste item. Portanto, os itens de trabalho que são executados em paralelo com itens anteriores parecerão mais curtos do que se fossem executados isoladamente, e alguns itens podem até ser relatados como tendo duração zero se forem concluídos totalmente em paralelo com o item anterior.
A visualização Linha do tempo exibe uma ou mais raias mostrando o tempo de cada operação da GPU. Há uma faixa separada contendo dados de duração de EOP para cada fila (gráficos, computação ou cópia) usada pelo jogo, além de uma única faixa mostrando dados de duração da execução (quando disponíveis) combinados em todas as filas.
Dica
Atualmente, o PIX no Windows não sobrepõe o trabalho da GPU em filas diferentes ao analisar o tempo nas capturas da GPU. Considere fazer uma Captura de tempo se quiser ver dados de tempo de computação assíncrona sobrepostos. Em Capturas de GPU, se um jogo usar computação assíncrona para executar trabalhos de renderização e computação simultaneamente, o PIX medirá primeiro um e depois o outro. Isso pode resultar em durações relatadas mais curtas para cada parte do trabalho em comparação com a forma como ele seria executado dentro do jogo original (devido à redução da contenção na GPU), mas um tempo total mais longo (devido à redução da paralelização).
Contadores e ocupação de GPU
O PIX expõe contadores de desempenho específicos de hardware fornecidos por IHVs por meio de um plug-in de GPU. Esses contadores podem ser habilitados e coletados na visualização Contadores de lista de eventos (botão para habilitar no canto superior direito da visualização Eventos ou a visualização Contadores de linha do tempo (botão para habilitar no canto superior direito da visualização Linha do tempo.
Em algumas GPUs, o PIX também pode coletar informações de ocupação. As GPUs geralmente são construídas como uma hierarquia de blocos repetidos, onde cada nível pode compartilhar um recurso. Por exemplo, uma GPU imaginária pode ser estruturada dessa forma
As GPUs executam sombreadores dividindo o trabalho do sombreador em ondas (também chamadas de warps ou frentes de onda). No diagrama acima, cada bloco azul é capaz de executar uma onda. Cada bloco verde pode executar até quatro ondas.
Como todos os azuis compartilham um único conjunto de registros, se uma carga de trabalho precisar de todos os registros, apenas uma onda por vez poderá ser executada no bloco verde. Nesse caso, a ocupação do bloco verde seria 1, de um total de 4 ocupações possíveis.
A qualquer momento, todos os blocos verdes podem estar executando um número diferente de ondas. Dos quatro blocos verdes acima, um pode estar executando 3 ondas, outro 2 ondas e o restante 1 onda. O PIX resume todos esses dados em um único valor: a ocupação máxima, que nesse exemplo seria 3.
Isso é apresentado no PIX na faixa Ocupação que mostra a ocupação máxima, separada por estágio do sombreador. Essa é uma indicação de quanto trabalho a GPU é capaz de fazer em paralelo. Barras mais altas mostram melhor utilização da GPU.
Depuração de problemas de renderização
Com uma captura de GPU aberta, alterne para a guia Pipeline. Essa guia contém uma visualização Eventos, várias exibições do inspetor de estado e recursos e uma visualização Pipeline.
A seleção de um evento na visualização Eventos preenche várias visualizações, principalmente a Pipeline, que pode ser usada para inspecionar assinaturas raiz, estado do pipeline e recursos associados. A visualização Pipeline também é o ponto de entrada para o Sombreador de depuração.
Dica
Para executar a maioria dos recursos, você precisará iniciar a análise. A análise é como o PIX coleta os dados de tempo, as informações de estado e os recursos. Há muitas maneiras de iniciar a análise, mas a maneira global é por meio do botão Iniciar reprodução de análise no canto superior direito do aplicativo. Certifique-se de que a GPU desejada esteja selecionada.
Visualizar objetos, parâmetros e estado do Direct3D 12
Depois de selecionar um evento na visualização Eventos, a visualização Estado e pipeline localizada na guia Pipeline mostrará detalhes do estado do Direct3D no momento desse evento. Lá, você pode visualizar quais recursos estão associados ao pipeline, ao código do sombreador, às entradas, às saídas e ao(s) destino(s) de renderização atualmente associado(s).
Depuração do sombreador
Depois de selecionar um evento apropriado e executar a análise, você poderá depurar seus sombreadores. Na visualização Pipeline há várias maneiras de iniciar a depuração do sombreador:
- Selecione a entrada Sombreador no estágio do sombreador desejado e clique no botão verde de reprodução. Antes de iniciar a sessão de depuração, certifique-se de configurar os parâmetros apropriados do sombreador (por exemplo, IDs de instância e vértice para sombreadores de vértice ou coordenadas de pixel para sombreadores de pixel).
- Clique com o botão direito do mouse em um visualizador de recursos (por exemplo, Saída do VS ou um SRV/UAV/RTV) e selecione a opção Depuração apropriada.
- Clicar no botão Depurar pixel na visualização Detalhes do pixel ao exibir um recurso apropriado (por exemplo, SRV/UAV/RTV).
Dica
Se não for possível ver a origem do sombreador durante a depuração, é provável que esteja faltando informações de depuração. Verifique se você está gerando os PDBs do sombreador para seu aplicativo e se configurou o PIX para carregar esses PDBs.
Edição e continuação do sombreador
O código do sombreador HLSL pode ser editado diretamente no PIX, permitindo que você veja imediatamente o efeito de suas alterações nos resultados de renderização ou no desempenho. Isso pode ser útil para a criação de protótipos e otimização de sombreadores, pois pode reduzir muito o tempo de resposta ao testar diferentes ideias.
Depois de selecionar um sombreador, você pode editar seu código como quiser e, em seguida, clique em Editar>Aplicar. Outras visualizações (como OM RTV 0) serão atualizadas para mostrar o efeito de sua alteração. Talvez seja útil encaixar mais de uma instância da visualização Pipeline uma ao lado da outra para visualizar os resultados do destino de renderização ao mesmo tempo que edita o código do sombreador.
Se você perder o controle exatamente do que alterou, clique com o botão direito do mouse no código do sombreador e escolha Comparação com o original.
Dica
O PIX no Windows ainda não oferece suporte para salvamento de sombreadores modificados de volta no arquivo de captura.
Visualizadores de depuração
Os visualizadores do destino de renderização estão disponíveis na visualização Pipeline ao inspecionar o conteúdo de um destino de renderização. O visualizador de imagem padrão apenas mostra a imagem como normal e pode ser alterado selecionando uma visualização diferente em Visualização.
Histórico de pixel
Para qualquer recurso semelhante ao pixel (por exemplo, RTVs, UAVs ou buffers de profundidade), você pode visualizar todas as operações que afetaram um pixel específico usando o Histórico de pixels. Isso pode ser acessado clicando com o botão direito do mouse no pixel desejado e selecionando Exibir histórico do pixel ou clicando no botão Histórico do pixel na visualização Detalhe do pixel.
Advertências e notas diversas
- Nem sempre é possível que o PIX faça uma captura de GPU com sucesso se um jogo estiver chamando o Direct3D 12 de maneiras inválidas. O PIX se esforça ao máximo para ser robusto, mesmo no caso de padrões de uso incorretos, mas, inevitavelmente, às vezes é um caso de entrada e saída de lixo. Se estiver tendo dificuldade em fazer capturas de GPU, tente usar a opção Camada de depuração D3D12 e Validação baseada em GPU para localizar e corrigir qualquer chamada de API incorreta.
- As capturas de GPU do Windows geralmente não são portáteis em diferentes versões de hardware e driver de GPU. Na maioria dos casos, uma captura feita em uma máquina será reproduzida corretamente em outras GPUs semelhantes da mesma família de hardware, e as capturas de alguns jogos podem até funcionar em GPUs de fabricantes totalmente diferentes, mas também é possível que algo tão simples como uma atualização de driver possa quebrar a compatibilidade com capturas mais antigas. O PIX pode garantir que a reprodução será bem-sucedida somente quando a GPU e o driver forem exatamente os mesmos. Portanto, o PIX avisará antes de iniciar a análise se não houver uma compatibilidade perfeita. Prossiga após esse aviso por sua conta e risco.
- O PIX tem suporte limitado para várias GPUs. Ele sempre reproduzirá capturas de GPU em um único adaptador, independentemente do número de adaptadores usados pelo aplicativo. O PIX permite que você selecione o adaptador de reprodução em um recurso suspenso na barra de ferramentas do PIX. O PIX tentará selecionar automaticamente o adaptador de reprodução se o aplicativo usar apenas um adaptador.
- Para cargas de trabalho ExecuteIndirect não determinadas, recomenda-se habilitar a configuração Usar buffers de argumento ExecuteIndirect em tempo de reprodução.