Wie kann ich die Geschwindigkeit meiner Vertex- und Fragment-Shader separat profilieren?

11

Ich möchte wissen, wie ich überprüfen kann, ob entweder mein Scheitelpunkt oder mein Fragment-Shader ein Engpass in meiner Rendering-Pipeline ist.

Ich habe über die Verwendung glQueryCountermit dem GL_TIMESTAMPZiel gelesen , um Taktprüfpunkte zwischen OpenGL-Befehlen zu erhalten, aber diese unterscheiden nicht zwischen verschiedenen Arten von Shadern.

Wenn zum Beispiel ein Frame auf der GPU 8 ms zum Rendern benötigt hat, kann ich dann feststellen, dass der Vertex-Shader 7 ms und der Fragment-Shader 1 ms benötigt hat?

Tyler
quelle

Antworten:

12

Vertex- und Fragment-Shader werden nicht sequentiell, sondern gleichzeitig ausgeführt, und die GPU gleicht sie automatisch aus, sodass es nicht möglich ist, bestimmte Timings wie 7 ms für die eine und 1 ms für die andere sinnvoll zuzuweisen.

Sie können jedoch ein einfaches Experiment durchführen, um zu messen, wo der Engpass liegt: Setzen Sie die Ansichtsprojektionsmatrix für alle Ihre Draw-Aufrufe auf alle Nullen. Dadurch werden alle Scheitelpunkte für ihre Positionen auf Null ausgegeben und alle Dreiecke entartet. Daher werden alle Raster- und Fragmentschattierungen kurzgeschlossen, während die gesamte Vertex-Shader-Arbeit erhalten bleibt (der Shader-Compiler kann nichts optimieren, da er nicht weiß, dass die Matrix zur Laufzeit auf Null gesetzt wird).

Wenn Sie die Leistung mit den auf Null gesetzten Matrizen messen, sehen Sie, wie viel Zeit erforderlich ist, um nur die Vertex-Shader auszuführen, ohne dass gleichzeitig Raster- oder Fragment-Shading-Arbeiten in der GPU ausgeführt werden müssen. Sie können dies dann mit der Zeit vergleichen, die für das normale Rendern für jeden Durchgang benötigt wird. Wenn die beiden Zeiten ähnlich sind, ist der Durchgang wahrscheinlich stark vertexgebunden. Wenn das Null-Matrix-Rendering erheblich schneller ist, ist es wahrscheinlich pixelgebunden. Es ist auch möglich, ein Zwischenergebnis zu erhalten, das anzeigt, dass die Arbeit ungefähr gleichmäßig zwischen den beiden aufgeteilt ist.

Nathan Reed
quelle