Ich versuche, ein einheitliches Array von Matrizen in meinem Compute-Shader zu verwenden. Es ist jedoch sehr langsam. Ich habe es auf diese Codezeilen eingegrenzt:
uniform mat4 someMatrixArray[64];
...
vec4 result = vec4(0);
for (int i = 0; i < 2048; i++) {
result += someMatrixArray[i%64][0] * 0.01;
}
Wenn ich nicht auf someMatrixArray zugreife, erhalte ich mehr als 700 fps. Beim Zugriff habe ich 10 fps. Hat jemand eine Idee, was das verursachen könnte? Könnte es ein Treiberproblem sein?
Ich habe bereits versucht, die Schleifen (via #pragma optionNV (unroll all)
) abzuwickeln, aber das hat nicht geholfen. Ich verwende eine GTX670 mit den neuesten Treibern unter Windows 7.
Bearbeiten:
Die generierte Baugruppe für die innere Schleife lautet:
MAD.F R0.xyz, c[196], {0.0099999998, 0, 0, 0}.x, R0;
opengl
shaders
performance
tobspr
quelle
quelle
result
statisch bestimmt werden, ohne dass er im Shader ausgewertet werden muss. Warum nicht auf der CPU berechnen und den Endwertresult
als Uniform an den Shader übergeben?result += someMatrixArray[i%64][0] / 100;
Antworten:
Ja, der Zugriff auf den Speicher kann immer wesentlich langsamer sein als der Nichtzugriff auf den Speicher. Besonders in einer for-Schleife, die 2000 Mal in einem Shader ausgeführt wird.
Ich denke, dass es hier nichts besonders Überraschendes gibt - die Aufteilung der Aufgabe in kleinere Schritte, die jeweils parallel ausgeführt werden können, und die Verwendung kleinerer Datenmengen sollten auf jeden Fall helfen.
quelle