GLSL: skalare vs Vektor-Performance

8

Alle modernen GPUs haben eine skalare Architektur, aber Schattierungssprachen bieten eine Vielzahl von Vektor- und Matrixtypen. Ich würde gerne wissen, wie sich Skalierung oder Vektorisierung von GLSL-Quellcode auf die Leistung auswirkt. Lassen Sie uns zum Beispiel einige "skalare" Punkte definieren:

%Vor%

und ihre Vektoräquivalente:

%Vor%

Haben diese Punkte, welche der folgenden mathematisch äquivalenten Codeabschnitte werden schneller ausgeführt?

Skalarkode:

%Vor%

oder es ist Vektoräquivalent:

%Vor%

?

Oder werden sie auf modernen GPUs gleich schnell ausgeführt?

Der obige Code ist nur ein Beispiel. Reale Beispiele für solche "vektorisierbaren" Codes können viel schwerere Berechnungen mit viel mehr Eingangsvariablen durchführen, die von globalen in s, Uniformen und Eckpunktattributen kommen.

    
Sergey 14.09.2016, 12:47
quelle

1 Antwort

2

Am besten ist es, ein Benchmarking für alle Arten von Systemen (dh GPUs) durchzuführen, von denen Sie glauben, dass sie mit diesem Code verwendet werden könnten, und herauszufinden, welche schneller mit dem vektorisierten Code sind und welche schneller mit dem skalierten Code sind . Dann würden Sie beide Versionen des Codes (oder, wahrscheinlicher, die Vielzahl der Versionen) schreiben und Laufzeitlogik schreiben, um zu wechseln, welche Version verwendet wird, basierend darauf, welche GPU / Treiber verwendet werden.

Das ist natürlich eine große Hektik. Die meisten Programmierer werden das nicht tun; GPGPU-Programmierer haben normalerweise nur einen einzigen Server- / GPU-Knotentyp, mit dem sie arbeiten, daher ist ihr Code speziell auf eine einzige Architektur zugeschnitten. In der Zwischenzeit, bei AAA Game Studios (die die einzigen anderen Orte sind, die das Budget und die Arbeitskraft haben, um diese Art von Aufgabe zu bewältigen), lassen sie NVidia und AMD in der Regel diese Magie ausklingen, wo NVidia / AMD besser schreiben wird, Optimierte Versionen der Shader, die von diesen Spielen verwendet werden, fügen sie zu ihren Treibern hinzu und sagen den Treibern, dass sie in den besseren Shadern anstelle von Gearbox / Bethesda / Wer auch immer zu laden versuchten.

Wichtig ist, dass Ihr Anwendungsfall darauf ausgerichtet ist, den Code besser wartbar zu machen; das wird Ihnen viel mehr Zeit ersparen, und Ihr Programm wird besser laufen, als jede "vorzeitige Optimierung" (was, lassen Sie uns klar sein, ist im Grunde das, was Sie tun).

    
Xirema 14.09.2016, 15:18
quelle