¿Cómo puedo perfilar la velocidad de mis sombreadores de vértices y fragmentos por separado?

11

Me gustaría saber cómo puedo verificar si mi vértice o mi sombreador de fragmentos es un cuello de botella en mi canal de renderizado.

He leído sobre el uso glQueryCountercon el GL_TIMESTAMPobjetivo para obtener puntos de control del reloj entre los comandos de OpenGL, pero estos no distinguen entre diferentes tipos de sombreadores.

Por ejemplo, si un cuadro en la GPU tardó 8 ms en renderizarse, ¿puedo decir que el sombreador de vértices tardó 7 ms y el sombreador de fragmentos tardó 1 ms?

Tyler
fuente

Respuestas:

12

Los sombreadores de vértices y fragmentos se ejecutan simultáneamente, no secuencialmente, y la GPU equilibra automáticamente la carga entre ellos, por lo que no es posible asignar significativamente tiempos específicos como 7 ms para uno y 1 ms para el otro.

Sin embargo, puede hacer un experimento simple para medir dónde se encuentra el cuello de botella: establezca la matriz de proyección de vista en todos los ceros para todas sus llamadas de sorteo. Esto hace que todos los vértices salgan a cero para sus posiciones y hace que todos los triángulos se degeneren; por lo tanto, cortocircuita todo el sombreado de rasterización y fragmentos, mientras mantiene todo el trabajo del sombreador de vértices (el compilador del sombreador no puede optimizar nada, ya que no sabe que la matriz se establecerá en cero en el tiempo de ejecución).

Cuando mide el rendimiento con las matrices puestas a cero, verá la cantidad de tiempo necesaria para ejecutar solo los sombreadores de vértices, sin ningún trabajo de rasterización concurrente o sombreado de fragmentos en la GPU. Luego puede comparar esto con la cantidad de tiempo necesaria para el renderizado ordinario de cada pase. Si las dos veces son similares, el pase probablemente esté muy ligado a los vértices; Si la representación de matriz puesta a cero es significativamente más rápida, probablemente esté unida a píxeles. También es posible obtener un resultado intermedio, lo que indica que el trabajo se divide de manera uniforme entre los dos.

Nathan Reed
fuente