PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : nVidia der Shadercompiler und Pixelshader 1.1


Demirug
2004-01-09, 17:26:24
Das ist mal wieder ein Post der Gruppe "Aufreger der Woche" von mir. Getragen von einer gnadenlossen Frustration aufgrund erwissener Unfähigkeit eines IHVs. Frust trübt ja bekannter die Objektivität deswegen könnte das folgende etwas unfair werden.

Im Rahmen eines nicht näher zu nenenden Projekts (Erklärungen nur in Verbindung mit 9mm Projektilen) habe ich mir erlaubt ein paar PS 1.1 rendern zu lassen. Da die Performance ja nicht ganz unwichtig ist muss man manchmal auch ein bischen messen. Das Ergebniss war zwar auf der einen Seite ganz nett weil sich die Shader teilweise schneller als befürchtet gezeigt hat. Auf der anderen Seite hat sich aber auch eindeutig gezeigt das die automatischen Codeoptimierungen im treiberinternen Shadercompiler bei PS 1.1 überhaupt nicht funktioniert.

Das ganze lässt sich sogar recht einfach beweisen:

Man nehme zwei Shader die das gleiche berechnen aber unterschiedlich sortiert sind:

Variante 1:


ps_1_1
mul r0,v0,c1
mul r0,r0,c2
mul r0,r0,c3
mul r1,v0,c4
mul r1,r1,c5
mul r1,r1,c6
mul r0,r0,r1


Variante 2:


ps_1_1
mul r0,v0,c1
mul r1,v0,c4
mul r0,r0,c2
mul r1,r1,c5
mul r0,r0,c3
mul r1,r1,c6
mul r0,r0,r1


In beiden Fällen 7 Multiplikationen . Der erste Shader braucht auf NV2X/NV3X 3 Takte. Der zweite Shader kommt mit 2 Takten aus.(soweit bisher überprüft) Lang lebe die Leistungsverschwendung.

Soweit so gut aber dann schiesst nVidia erst richtig den Vogel ab. Dort weiss man ganz genau das die zweite Reihenfolge besser ist. Programmiert man diesen Shader in HLSL und kompiliert man in mit dem Compiler aus dem SDK bekommt man Variante 1. Nimmt man dagegen den Cg Compiler bekommt man die zweite Variante.

Weiss hier wieder die Rechte nicht was die Linke tut? Warum kann man die Erkenntnisse des Cg Teams nicht in den Treiber einfliessen lassen?

Jetzt bleibt mir wieder nichts anderes übrig als den Cg Compiler wieder einzubauen aber so zu begrenzen das er sich nur die 1.1-1.3 Shader vornimmt wenn die im Rechner vorhande Karte von nVidia ist. Für die 2.0 und 2.X Shader baut nVidia die Optimierungen´in den Treiber ein (OK wie viel davon wirklich drin ist weiss ja auch keiner so genau) und der Cg Compiler ist Müll. Für 1.1-1.3 Shaderoptimierungen ist der Cg Compiler gut und der Treiber taugt nichts. Danke nVidia für diese so offentsichtliche und sofort verständliche Systematik. Erst erzählt ihr einem man soll den MS-Compiler benutzten und dann sowas. Ich will gar nicht wissen was mit bei den PS 1.4 noch erwartet. Wobei dort kann es einem ja egal sein. Wenn der Treiber mit dem vom MS-Compiler erzeugen Code nicht klarkommt kann einem sowieso keiner an die Karre fahren da es ja bei PS 1.4 keine Alternative als Compiler gibt.

Also liebe Freunde von nVidia schickt doch bitte mal das Treiber Team beim Cg Team vorbei damit die Optimierungen welcher der Cg Compiler für PS 1.1 vornimmt auch auch vom Treiber vorgenommen werden können.

StefanV
2004-01-09, 17:32:51
hm, und wie schauts mit ATI R300 Karten und Derivaten aus?? ;)

Ansonsten: sag mir die Adresse, wo ich das 'be extremly careful'* Paket hinschicken soll?? *eg*


*Aufgrund des darin enthaltenen Nitro Glycerins

del_4901
2004-01-09, 17:34:08
Wenn ich meine SK1 Schutzweste anziehen darf und du nur darauf schießt, dann rück raus mit der Sprache um welches Projekt es sich handelt in allen Details ;)

Achja und bitte nicht auf höhe des Sternus ziehlen, das könnte verdammt weh tun.

Riptor
2004-01-09, 17:43:43
Original geschrieben von AlphaTier
...und du nur darauf schießt...

Darf ich auch mitschießen? :naughty: BÜDDE! :love3:

Gibt es dafür eigentlich keine plausible Erklärung? Ich mein, nVidia hat doch eigentlich ein fähiges Treiber-Team, oder ist das jetzt nicht mehr der Fall?

mapel110
2004-01-09, 17:47:58
wieso ist das so überraschend?

die ps1.1-1.3 ist die alte generation. nvidia wäre doch blöd, wenn sie der alten geforce4 serie neue performance einhauchen würde.
und die neue generation hat halt mehr takt==mehr rohleistung :)

Demirug
2004-01-09, 18:28:50
Original geschrieben von Riptor
Darf ich auch mitschießen? :naughty: BÜDDE! :love3:

Gibt es dafür eigentlich keine plausible Erklärung? Ich mein, nVidia hat doch eigentlich ein fähiges Treiber-Team, oder ist das jetzt nicht mehr der Fall?

Der Treiber ist ja immerhin noch schlau genug überhaupt was einzusparen. Ein Shader mit 7 Anweisungen braucht normalerweise 4 Takte. So gesehen sind auch schon die 3 Takte nicht wirklich schlecht. Es ist eben nur sehr ärgerlich das er es nicht automatisch auf die 2 Takte reduziert.

Demirug
2004-01-09, 18:31:13
Original geschrieben von mapel110
wieso ist das so überraschend?

die ps1.1-1.3 ist die alte generation. nvidia wäre doch blöd, wenn sie der alten geforce4 serie neue performance einhauchen würde.
und die neue generation hat halt mehr takt==mehr rohleistung :)

Das betrifft auch die NV3X Chips wenn sie PS 1.1 - 1.3 Shader abarbeiten. Und da können sie jeden eingesparten Takt gut gebrauchen. Und mal soll ja auch bei den NV3X Chips PS 1.1-1.3 immer dort benutzten wo sie ausreichend sind.

Piffan
2004-01-09, 21:20:58
Original geschrieben von AlphaTier
Wenn ich meine SK1 Schutzweste anziehen darf und du nur darauf schießt, dann rück raus mit der Sprache um welches Projekt es sich handelt in allen Details ;)

Achja und bitte nicht auf höhe des Sternus ziehlen, das könnte verdammt weh tun.

Mein fachlicher Beitrag: "Sternum" muss es heißen, nicht Sternus! Als alter Asterix- Fan und Vater einer Tochter, die sich mit Latein plagt, weiß ich das :D

kmf
2004-01-10, 01:44:09
Original geschrieben von Demirug
Das ist mal wieder ein Post der Gruppe "Aufreger der Woche" von mir. Getragen von einer gnadenlossen Frustration aufgrund erwissener Unfähigkeit eines IHVs. Frust trübt ja bekannter die Objektivität deswegen könnte das folgende etwas unfair werden.

Im Rahmen eines nicht näher zu nenenden Projekts (Erklärungen nur in Verbindung mit 9mm Projektilen) habe ich mir erlaubt ein paar PS 1.1 rendern zu lassen. Da die Performance ja nicht ganz unwichtig ist muss man manchmal auch ein bischen messen. Das Ergebniss war zwar auf der einen Seite ganz nett weil sich die Shader teilweise schneller als befürchtet gezeigt hat. Auf der anderen Seite hat sich aber auch eindeutig gezeigt das die automatischen Codeoptimierungen im treiberinternen Shadercompiler bei PS 1.1 überhaupt nicht funktioniert.

Das ganze lässt sich sogar recht einfach beweisen:

Man nehme zwei Shader die das gleiche berechnen aber unterschiedlich sortiert sind:

Variante 1:


ps_1_1
mul r0,v0,c1
mul r0,r0,c2
mul r0,r0,c3
mul r1,v0,c4
mul r1,r1,c5
mul r1,r1,c6
mul r0,r0,r1


Variante 2:


ps_1_1
mul r0,v0,c1
mul r1,v0,c4
mul r0,r0,c2
mul r1,r1,c5
mul r0,r0,c3
mul r1,r1,c6
mul r0,r0,r1


In beiden Fällen 7 Multiplikationen . Der erste Shader braucht auf NV2X/NV3X 3 Takte. Der zweite Shader kommt mit 2 Takten aus.(soweit bisher überprüft) Lang lebe die Leistungsverschwendung.

Soweit so gut aber dann schiesst nVidia erst richtig den Vogel ab. Dort weiss man ganz genau das die zweite Reihenfolge besser ist. Programmiert man diesen Shader in HLSL und kompiliert man in mit dem Compiler aus dem SDK bekommt man Variante 1. Nimmt man dagegen den Cg Compiler bekommt man die zweite Variante.

Weiss hier wieder die Rechte nicht was die Linke tut? Warum kann man die Erkenntnisse des Cg Teams nicht in den Treiber einfliessen lassen?

Jetzt bleibt mir wieder nichts anderes übrig als den Cg Compiler wieder einzubauen aber so zu begrenzen das er sich nur die 1.1-1.3 Shader vornimmt wenn die im Rechner vorhande Karte von nVidia ist. Für die 2.0 und 2.X Shader baut nVidia die Optimierungen´in den Treiber ein (OK wie viel davon wirklich drin ist weiss ja auch keiner so genau) und der Cg Compiler ist Müll. Für 1.1-1.3 Shaderoptimierungen ist der Cg Compiler gut und der Treiber taugt nichts. Danke nVidia für diese so offentsichtliche und sofort verständliche Systematik. Erst erzählt ihr einem man soll den MS-Compiler benutzten und dann sowas. Ich will gar nicht wissen was mit bei den PS 1.4 noch erwartet. Wobei dort kann es einem ja egal sein. Wenn der Treiber mit dem vom MS-Compiler erzeugen Code nicht klarkommt kann einem sowieso keiner an die Karre fahren da es ja bei PS 1.4 keine Alternative als Compiler gibt.

Also liebe Freunde von nVidia schickt doch bitte mal das Treiber Team beim Cg Team vorbei damit die Optimierungen welcher der Cg Compiler für PS 1.1 vornimmt auch auch vom Treiber vorgenommen werden können.

Sowas, in der Art, passiert bei uns auch. Du kannst einfach nicht alle Abteilungen ab einer gewissen Größe zentralisieren, die mit dem Produkt was zu tun haben. Das wird sonst ein noch viel schlimmerer und unbeweglicherer Klotz. Dann läuft gar nix mehr, nur noch Verwaltung.

Hier greifen aber die Verbesserungsvorschläge der Mitarbeiter direkt. Kennst du niemand bei nV? Wäre ziemlich leicht verdientes Geld. :D

Odal
2004-01-10, 04:08:54
notfalls kannst du ja auch so mal jemanden bei nvidia anschreiben und die verbesserungsvorschlaege just4free liefern ;)

Tigerchen
2004-01-10, 07:17:35
[QUOTE]Original geschrieben von Piffan
Mein fachlicher Beitrag: "Sternum" muss es heißen, nicht Sternus! Als alter Asterix- Fan und Vater einer Tochter, die sich mit Latein plagt, weiß ich das :D [/QUOTE

Ja.Ab mit dem pillum ins Sternum. Das haut voll rein. Welcher Asterix war das nochmal?

StefanV
2004-01-10, 10:00:07
Original geschrieben von Stefan Payne
hm, und wie schauts mit ATI R300 Karten und Derivaten aus?? ;)

:bawling:

Auf mich achtet mal wieder keiner :...(

@Demi:

Welche Variante ist bei ATI schneller und was macht der Treiber daraus??
Sortiert der Treiber das auch um??

Demirug
2004-01-10, 12:08:50
Original geschrieben von Stefan Payne
:bawling:

Auf mich achtet mal wieder keiner :...(

@Demi:

Welche Variante ist bei ATI schneller und was macht der Treiber daraus??
Sortiert der Treiber das auch um??

Der Rechner mit der Radeon war gestern anderweitig belegt und am Wochende bin ich nicht mal in der Nähe von dem Rechner. Ich habe es also noch gar nicht ausprobiert.

In der Theorie darf es aber zwischen den beiden Varianten auf einem R3XX gar keinen Unterschied geben. Laut meinen Informationen ist der R3XX technisch gar nicht in der Lage diese Shader durch umsortierung zu beschleunigen. 7 Vector4 Multiplikationen benötigten 7 Takte pro Pixel unabhängig von der Reihenfolge.

StefanV
2004-01-10, 12:53:13
Original geschrieben von Demirug
Der Rechner mit der Radeon war gestern anderweitig belegt und am Wochende bin ich nicht mal in der Nähe von dem Rechner. Ich habe es also noch gar nicht ausprobiert.

In der Theorie darf es aber zwischen den beiden Varianten auf einem R3XX gar keinen Unterschied geben. Laut meinen Informationen ist der R3XX technisch gar nicht in der Lage diese Shader durch umsortierung zu beschleunigen. 7 Vector4 Multiplikationen benötigten 7 Takte pro Pixel unabhängig von der Reihenfolge.

THX, Demi ;)

BTW: auch für ein 'Keine Ahnung, kann ich momentan auch nicht testen' bin ich dankbar ;)

Mr. Lolman
2004-01-10, 13:11:55
Original geschrieben von Demirug
7 Vector4 Multiplikationen benötigten 7 Takte pro Pixel unabhängig von der Reihenfolge.

7 Takte auf der Radeon und 2 Takte auf der FX?

Demirug
2004-01-10, 13:42:56
Original geschrieben von Mr. Lolman
7 Takte auf der Radeon und 2 Takte auf der FX?

Ja. In diesem Fall aber bitte berücksichtigen das die Radeons 8 faches (eigentlich 2*4) SIMD hat die GF aber nur 4 faches (ich reden jetzt von den grossen Chips). Will man das also vergleichen muss man die GF Werte mal 8 nehmen oder die Radeonwerte durch 2 teilen. Ich bevorzuge das mit 2 Multiplizieren weil es sonst immer wieder zu halben Takten kommt.

Mr. Lolman
2004-01-10, 13:46:27
Noja, immer 4 Takte gegen 7. Wie schauts denn da mit der Geschwindigkeit aus? Eine FX sollte in dem Fall ja deutlich schneller sein, oder?

Demirug
2004-01-10, 14:01:19
Original geschrieben von Mr. Lolman
Noja, immer 4 Takte gegen 7. Wie schauts denn da mit der Geschwindigkeit aus? Eine FX sollte in dem Fall ja deutlich schneller sein, oder?

Ja, es hängt aber halt auch noch davon ab welche FX mit welcher Radeon du vergleichst. Zudem ist nicht sicher ob dieser "Trick" mit den 4 Takten auch noch auf einem NV35/NV38(NV36 funktioniert. Es gibt da wiedersprüchliche Meinungen und ich/wir habe mich noch nicht entgültig entschieden welche Karte aus dieser Reihe in einem Testrechner landen soll. Deswegen kann ich das noch nicht ausprobieren.

Ich würde das Testprogramm ja öffentlich machen befürchte dabei jedoch das sich die IHVs wie Geier darauf stürzen würden um die ganzen Shader zu cheaten. Deswegen bleibt es bei mir.

StefanV
2004-01-10, 14:08:43
Original geschrieben von Demirug
Ich würde das Testprogramm ja öffentlich machen befürchte dabei jedoch das sich die IHVs wie Geier darauf stürzen würden um die ganzen Shader zu cheaten. Deswegen bleibt es bei mir.

Hm, du kannst das 'Testprogramm' aber auch an einige, die (grundsätzlich) mehrere Karten besitzen, samt NDA mehlen :)

So kannst du halt einige Dinge ohne großen (eigenen) Zeitverlust testen (lassen)...

Mr. Lolman
2004-01-10, 15:07:47
Original geschrieben von Stefan Payne
Hm, du kannst das 'Testprogramm' aber auch an einige, die (grundsätzlich) mehrere Karten besitzen, samt NDA mehlen :)

So kannst du halt einige Dinge ohne großen (eigenen) Zeitverlust testen (lassen)...

LOL "grundsätzlich mehrere Karten" ;D. Ich hab auch viele Karten zu Hause, aber du zieltest wohl darauf ab, das bei deinem Bekannten grad deine FX herumhängt und du das super testen könntest :naughty:

@Demi: Würd mich auch sehr interesieren das Proggi. Falls interesse besteht könnt ich ja mal einen kleinen Vergleich zw. einer 64MB Radeon 9500 (auch als pro) und einer 128MB Radeon 9700pro machen... *liebschau*

Demirug
2004-01-10, 17:20:00
Ich habe schon ein "Test-Opfer" im Auge.

Piffan
2004-01-11, 09:27:53
Original geschrieben von Tigerchen
[QUOTE]Original geschrieben von Piffan
Mein fachlicher Beitrag: "Sternum" muss es heißen, nicht Sternus! Als alter Asterix- Fan und Vater einer Tochter, die sich mit Latein plagt, weiß ich das :D [/QUOTE

Ja.Ab mit dem pillum ins Sternum. Das haut voll rein. Welcher Asterix war das nochmal?


Auch falsch! :D Pilum = Speer. Das war "Asterix bei den Briten"...Einer der witzigsten Bände aus der Reihe.

Chris Lux
2004-01-12, 15:44:46
hi demi,
könntest du mal ne übersicht posten mit der man selbst nachvollziehen kann wieviele takte ein shader benötigt? das wäre sehr fein ;)

Tesseract
2004-01-12, 15:55:35
Original geschrieben von Piffan
Auch falsch! :D Pilum = Speer. Das war "Asterix bei den Briten"...Einer der witzigsten Bände aus der Reihe.

und iirc sagt er das sein pilum(speer) härter als des römers stardum(brustbein) ist

Demirug
2004-01-12, 16:11:33
Original geschrieben von Hans Ohlo
hi demi,
könntest du mal ne übersicht posten mit der man selbst nachvollziehen kann wieviele takte ein shader benötigt? das wäre sehr fein ;)

Das Regelwerk dafür ist leider sehr gross und auch unvollständig. Zudem verhält sich auch noch jeder Chip ein wenig anders. Zu einem nicht unwesentlichen Teil spielt dann auch noch Treiber eine Rolle. Deswegen gilt vereinfacht gesagt:

Um zu wissen wie schnell ein Shader läuft muss man in laufen lassen.

Will man es im Vorfeld ausrechnen braucht man sehr genaue Informationen über den internen Aufbau des Chips (die man meist sowieso nicht hat) und muss dann auch noch hoffen das der Treiber genau den gleichen Weg einschlägt den man selbst gegangen ist.