Como posso traçar o perfil da velocidade dos shaders de vértice e fragmento separadamente?

11

Gostaria de saber como posso verificar se meu vértice ou meu shader de fragmento é um gargalo no meu pipeline de renderização.

Eu li sobre o uso glQueryCountercom o GL_TIMESTAMPalvo para obter pontos de verificação de relógio entre os comandos do OpenGL, mas eles não fazem distinção entre diferentes tipos de shaders.

Por exemplo, se um quadro na GPU levou 8 ms para renderizar, posso dizer que o shader de vértice levou 7 ms e o shader de fragmento levou 1 ms?

Tyler
fonte

Respostas:

12

Os sombreadores de vértice e de fragmento são executados simultaneamente, não sequencialmente, e a GPU faz o balanceamento de carga automaticamente entre eles, portanto, não é possível atribuir significativamente intervalos específicos como 7 ms para um e 1 ms para o outro.

No entanto, você pode fazer um experimento simples para medir onde está o gargalo: defina a matriz de visão e projeção com todos os zeros para todas as suas chamadas de desenho. Isso faz com que todos os vértices produzam zero para suas posições e degeneram todos os triângulos; portanto, provoca um curto-circuito em toda a rasterização e sombreamento de fragmentos, mantendo todo o trabalho de sombreador de vértice (o compilador de sombreador não pode otimizar nada, pois não sabe que a matriz será zerada em tempo de execução).

Ao medir o desempenho com as matrizes zeradas, você verá a quantidade de tempo necessária para executar apenas os sombreadores de vértice, sem nenhum trabalho simultâneo de rasterização ou sombreamento de fragmentos na GPU. Em seguida, você pode comparar isso com a quantidade de tempo necessária para a renderização comum para cada passagem. Se os dois tempos são semelhantes, o passe provavelmente é altamente ligado ao vértice; se a renderização com matriz zerada for significativamente mais rápida, provavelmente será vinculada a pixels. Também é possível obter um resultado intermediário, indicando que o trabalho está dividido igualmente entre os dois.

Nathan Reed
fonte