PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GLSL: Wie gut sortieren die Compiler code um?


SavageX
2005-07-17, 16:20:45
Hallo,

ich versuche, dem GLSL pixel shader der Darkplaces engine (Grundlage von z.B. Nexuiz, http://www.nexuiz.com ) etwas mehr Performance abzuringen (ich bin nicht engine coder, mag es aber zumindest, zumindest die Grundzüge zu verstehen).

Der originale Shader: http://savage747.sa.funpic.de/shader.html

(Und ja, zukünftige Versionen werden partial precision auch für nicht-GFFX Karten haben - bringt auf meiner 6800LE schonmal bis zu 50% mehr Performance)

Auf dem NV40 ist normalize "kostenlos", kann also nach jedem Cycle eingeschoben werden, ohne die ALUs für weitere Instruktionen in diesem Takt zu sperren (AFAIK). Nun braucht normalize aber dennoch etwas Zeit, um Ergebnisse abzuliefern (mindestens einen Takt, denke ich).

Angenommen der nächste GLSL Befehl greift auf dieses Ergebnis zurück - wird er um einen Takt verzögert oder einfach in die Pipe hinterhergeschoben (also ohne Lücke)? Würde es sich lohnen, zuerst andere Berechnungen vorzunehmen, die das Ergebnis nicht brauchen? Wenn dem so ist: Sortiert der GLSL Compiler den Code halbwegs zuverlässig entsprechend um - oder lohnt es sich, die Reihenfolge im GLSL shader selbst händisch umzustellen?

Ich bitte um Verzeihung, wenn diese Frage etwas profan ist - allerdings habe ich leider bisher nichts gefunden, was meine Fragen beantworten würde.

Danke,

SavageX

ScottManDeath
2005-07-17, 16:56:54
Mit NVEmulate (http://developer.nvidia.com/object/nvemulate.html)kannst Du Dir den für NV GPUs generierten Assembler Shadercode ausgeben lassen. Damit kann man besser beurteilen ob sich Änderungen im GLSL Code auf den Assembler Code auswirken. Allerdings ist zu beachten dass der Assemblercode noch durch einen GPU spezifischen Optimierter verarbeitet wird.

Ansonsten Code verändern und durch Messen herausfinden ob es was bringt.

IMHO sind die GLSL Compiler ziemlich krass am Optimieren und tun einiges was man selbst gar nicht hinbkommt. Allerdings kann man sicherlich durch entsprechenden Code dem Optimierer unter die Arme greifen. z.B. durch Vektorisierung des Codes

Demirug
2005-07-17, 17:11:46
Ich würde eher ShaderPerf (http://developer.nvidia.com/object/nvshaderperf_home.html) nehmen. Der zeigt nicht nur den Code an sondern sagt auch noch gleich wie viele Takte dafür anfallen.

SavageX
2005-07-17, 17:32:05
Danke für die Verweise auf die NVidia tools - die scheinen sich ja gut zum "Erbsenzählen" zu eignen. Schade, dass die nur für Windows sind... aber man kann ja nicht alles haben (erst recht nicht für lau) (total OT: Ich knuddele die NVidida Treiber für Linux).

:biggrin:

Coda
2005-07-17, 18:12:46
Das Ding sollte wohl ohne Problem per Wine unter Linux ausführbar sein.

SavageX
2005-07-17, 18:43:12
Das Ding sollte wohl ohne Problem per Wine unter Linux ausführbar sein.

Nein, leider nicht. Die Applikationen sind zu eng an den (Windows)Treiber gebunden.

Xmas
2005-07-17, 21:47:02
NVShaderPerf kann gar nicht an den Treiber gebunden sein, denn es funktioniert auch ohne NVidia-Karte.

SavageX
2005-07-17, 22:08:33
NVShaderPerf kann gar nicht an den Treiber gebunden sein, denn es funktioniert auch ohne NVidia-Karte.

Nun, aber zumindest müssen die Statistiken vom Treiber (welcher auch immer) zur Applikation wandern können.

(Edit: Das setzt voraus, dass der Code tatsächlich auf der Hardware ausgeführt wird... oder ist NVShaderPerf ein Emulator?)

(Edit 2: Bei genauerer Betrachtung sieht es tatsächlich aus, als wäre es ein Emulator)

Ich habs mit Wine versucht, klappt nicht (warum auch immer).

Coda
2005-07-19, 00:28:02
Es emuliert gar nichts, das Teil weiß nur wieviel Takte eine bestimmte Instruktionssequenz brauchen wird.

ATi bietet sowas aus mir nicht ersichtlichen Gründen nicht an. Finde ich ziemlich schade. Man hat auch ohne das Wege es rauszufinden.

ollix
2006-01-16, 12:51:40
Es betrifft nur teilweise, dieses Thema, aber kann es sein, daß der ATi Compiler/Treiber bei GLSL Shadern/OpenGL mehr Informationen ausgibt? Habe hier ein Projekt, was auf jeden Fall einen Fehler hat - auf der ATi Maschine gibt es einige Warnungen. Der nVidia Treiber/Compiler "macht einfach" - es sieht bei beiden nicht richtig und auch ein bissle untershciedlich aus. Die Shader sind vom Syntax her richtig, hat eher was mit Texturen/Formaten zu tun. Meine Frage: kann ich den Treiber von nVidia dazu bewegen mir mehr Debug informationen auszugeben?

Demirug
2006-01-16, 13:15:49
Damit http://developer.nvidia.com/object/nvemulate.html kann man den Debug Output des Treibers aktivieren.

ollix
2006-01-16, 14:25:02
Vielen Dank. Er zeigt sich zwar dennoch nicht ganz so gesprächig, aber das man dazu sich immer den generierten ASM-Code anzeigen lassen kann, ist wirklich interessant.