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;
result += someMatrixArray[i%64][0] / 100;
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?