Kosten für die Parameterübergabe in Webgl-Pixel-Shadern?

7

In einem Webgl-Pixel-Shader sind alle Funktionen so eingebunden, wie ich es verstehe. Sie können jedoch Parameter haben, die als in versus inout markiert sind , was bedeutet, dass sich ihr Wert ändern kann, der Wert jedoch außerhalb des Funktionsaufrufs nicht bestehen bleibt.

Bedeutet dies, dass der Shader eine Kopie des Werts erstellen muss, damit die Funktion arbeiten kann, wenn es sich um einen In- Wert handelt?

Sind Shader-Compiler / -Optimierer intelligent genug, um zu wissen, wann sie keine Kopie erstellen müssen, oder ist es am besten, alle Parameter einfach als inout zu markieren und sicherzustellen, dass diejenigen, die nicht geändert werden sollen, nicht geändert werden, wenn die Leistung ist das Hauptanliegen?

Vielen Dank!

Alan Wolfe
quelle

Antworten:

6

Meine Erfahrung mit Shader-Compiler-Stacks vor einigen Jahren ist, dass sie extrem aggressiv sind, und ich bezweifle, dass Sie einen Perf-Unterschied feststellen werden, aber ich würde empfehlen, so viel wie möglich zu testen.

Ich würde generell empfehlen, dem Compiler (und den menschlichen Lesern) mehr Informationen zur Verfügung zu stellen, sofern die Sprache dies zulässt, und die Parameter entsprechend ihrer Verwendung zu markieren. Die Behandlung eines In-Only-Parameters als In / Out ist für Menschen fehleranfälliger als für Compiler.

Einige Details: Shader werden fast ausschließlich mit Registern für Variablen ausgeführt (ich habe mit Architekturen gearbeitet, die bis zu 256 32-Bit-Register unterstützen) - das Verschütten ist enorm teuer. Physische Register werden von Shader-Aufrufen gemeinsam genutzt - stellen Sie sich dies als Threads im Sinne von HyperThread vor, die einen Registerpool gemeinsam nutzen - und wenn der Shader so eingestellt werden kann, dass weniger Register verwendet werden, besteht eine größere Parallelität. Das Ergebnis ist, dass Shader-Compiler sehr hart daran arbeiten, die Anzahl der verwendeten Register zu minimieren - natürlich ohne zu verschütten. Inlining ist daher üblich, da es ohnehin wünschenswert ist, die Registerzuordnung über den gesamten Shader zu optimieren.

Daniel M Gessel
quelle