Demirug
2003-05-22, 11:15:53
Warnung: Dies ist mal wieder einer von meinen hochkomplizierten und Threads auf die es nicht viele Beiträge geben wird. Aber mir war eben mal wieder danach.
In modernen Grafikchips herrscht nach wie vor eine starke Spezialisierung vor. Für jeden zu erledigenden Job gibt es eigenen Einheiten. Hier möchte ich nun die Aufmerksamkeit auf die Shader (Vertex und Pixel) sowie die dazugehörigen TMUs (Texture Management Unit) lenken.
Wie viele wahrscheinlich schon wissen werden besteht eine Shadereinheit funktional aus mehrern teilen:
- Registerfeld für veränderbare Werte
- Registerfeld für konstante Werte
- Registerfeld für eingangs Werte
- Registerfeld für ausgangs Werte
- Programmspeicher
- ALU(s) welche die eigentliche Rechenarbeit erledigen
Bei den Pixelshadern kommen dann noch die TMUs für den Zugriff auf bestimmte Speicherbereiche hinzu.
Die ersten Shadereinheiten waren in ihren Möglichkeiten noch sehr beschränkt. Programme konnten nur jeweils einmal komplett vom Anfang bis zum Ende durchlaufen werden. Bei den Pixelshadern gab es die zusätzliche Beschränkung das alle Texturezugriffe vor dem Rechnen mit den ALUs bereits durchgeführt sein mussten. Im Gegenzug dafür hatte die TMUs ebenefalls begrenzte Rechenmöglichkeiten erhalten.
Die erste Erweiterung (Änderung) dieses Konzepts kam dann von ATI mit dem R200. Der R200 hat zwar nach wie vor eine PS-Einheit die es erfordert das zuerst die Texturen ausgelesen werden und dann die Berechnungen durchgeführt werden können. Allerdings kann dieser Vorgang zweimal pro Pass durchgeführt werden und man einen Grossteil der im ersten Durchlauf berechneten werte im zweiten durchlauf weiter benutzten. Als kleiner Wermutstropfen haben die TMUs aber die Rechenfähigkeit eingebüsst und Berechnungen die bisher dort durchgeführt wurden müssen jetzt im ersten Durchlauf von den ALUs übernommen werden.
Der nächste Schritt waren dann die 2.0 und 2.0+ Shader die wir heuten in den R(V)3xx und NV3x Chips finden können. Die technische Implementierung hängt aber gerade bei den 2.0+ Shadern sehr stark von den Optionen ab die nun genau unterstützt werden das ich mir eine genauere Betrachtung jetzt hier erst einmal sparen möchte.
Allgemein kann man sagen das sich die Shader in ihren Möglichkeiten immer mehr einer CPU annähern und sich Pixel und Vertexshader immer ähnlicher werden. Mit den 3.0 Shadern verlieren die Pixelshader auch noch das Privileg als einzige auf den Texturespeicher zugreifen zu dürfen. Denn nun ist es auch den Vertexshadern erlaubt Daten aus den Texturen auszulesen um Effekte wie Displacmentmapping zu realisieren.
Aber kommen wir nun nach dieser Zugegebenehrmassen recht langen Einführung endlich auf das eigentlich Thema. Alle derzeit verfügbaren Grafikchips (die man als normaler Kunden kaufen kann) sind wie gesagt mit stark spezialisierten Einheiten aufgebaut. Wird eine Einheit gerade nicht gebraucht kann sie nur untätig auf neue arbeit warten. Da aber jede Einheit für einen maximalen extrem Fall ausgelegt sein muss nimmt die Effektive Auslastung der einzelnen Einheiten immer weiter ab. Das beste Beispiel sind hierfür die MSAA-Einheiten. Benutzt man nicht die maximale AA-Stufe welche ein Chip beherrscht bleibt ein Teil dieser Einheiten einfach ungenutzt. Aber auch wenn man die maximale AA-Stufe einsetzt sind die Pixelshader meistens kaum in der Lage bei jedem Takt einen neuen Pixel fertig zustellen wodurch die AA-Einheiten auch unter ihren Möglichkeiten bleiben.
Lassen wir aber die AA-Einheiten mal aussen vor und betrachten nur die Vertext und Pixelshader. Moderne Chips bieten eine sehr hohe Vertexleistung die aber meist gar nicht genutzt wird weil die Pixelshader nicht mit der Arbeit hinterherkommen. Nun wissen wir aber das es bei den 3.0 Shadern zwischen dem Pixel und Vertex Bereich kaum unterschiede gibt.
Diesen Umstand sollte man nun meiner Meinung nach ausnutzten und statt getrennter Pixel und Vertexshader nur noch allgemeine Shader verbauen. In Abhängigkeit des Workloads könnte diese dann dynamisch dem Pixel oder dem Vertexprocessing zugeordent werden.
Der Vorteil wäre eine bessere Ausnutzung der Ressourcen allerdings würde man dafür aber auch zusätzliche Transistoren zur Steuerung des ganzen benötigen.
In modernen Grafikchips herrscht nach wie vor eine starke Spezialisierung vor. Für jeden zu erledigenden Job gibt es eigenen Einheiten. Hier möchte ich nun die Aufmerksamkeit auf die Shader (Vertex und Pixel) sowie die dazugehörigen TMUs (Texture Management Unit) lenken.
Wie viele wahrscheinlich schon wissen werden besteht eine Shadereinheit funktional aus mehrern teilen:
- Registerfeld für veränderbare Werte
- Registerfeld für konstante Werte
- Registerfeld für eingangs Werte
- Registerfeld für ausgangs Werte
- Programmspeicher
- ALU(s) welche die eigentliche Rechenarbeit erledigen
Bei den Pixelshadern kommen dann noch die TMUs für den Zugriff auf bestimmte Speicherbereiche hinzu.
Die ersten Shadereinheiten waren in ihren Möglichkeiten noch sehr beschränkt. Programme konnten nur jeweils einmal komplett vom Anfang bis zum Ende durchlaufen werden. Bei den Pixelshadern gab es die zusätzliche Beschränkung das alle Texturezugriffe vor dem Rechnen mit den ALUs bereits durchgeführt sein mussten. Im Gegenzug dafür hatte die TMUs ebenefalls begrenzte Rechenmöglichkeiten erhalten.
Die erste Erweiterung (Änderung) dieses Konzepts kam dann von ATI mit dem R200. Der R200 hat zwar nach wie vor eine PS-Einheit die es erfordert das zuerst die Texturen ausgelesen werden und dann die Berechnungen durchgeführt werden können. Allerdings kann dieser Vorgang zweimal pro Pass durchgeführt werden und man einen Grossteil der im ersten Durchlauf berechneten werte im zweiten durchlauf weiter benutzten. Als kleiner Wermutstropfen haben die TMUs aber die Rechenfähigkeit eingebüsst und Berechnungen die bisher dort durchgeführt wurden müssen jetzt im ersten Durchlauf von den ALUs übernommen werden.
Der nächste Schritt waren dann die 2.0 und 2.0+ Shader die wir heuten in den R(V)3xx und NV3x Chips finden können. Die technische Implementierung hängt aber gerade bei den 2.0+ Shadern sehr stark von den Optionen ab die nun genau unterstützt werden das ich mir eine genauere Betrachtung jetzt hier erst einmal sparen möchte.
Allgemein kann man sagen das sich die Shader in ihren Möglichkeiten immer mehr einer CPU annähern und sich Pixel und Vertexshader immer ähnlicher werden. Mit den 3.0 Shadern verlieren die Pixelshader auch noch das Privileg als einzige auf den Texturespeicher zugreifen zu dürfen. Denn nun ist es auch den Vertexshadern erlaubt Daten aus den Texturen auszulesen um Effekte wie Displacmentmapping zu realisieren.
Aber kommen wir nun nach dieser Zugegebenehrmassen recht langen Einführung endlich auf das eigentlich Thema. Alle derzeit verfügbaren Grafikchips (die man als normaler Kunden kaufen kann) sind wie gesagt mit stark spezialisierten Einheiten aufgebaut. Wird eine Einheit gerade nicht gebraucht kann sie nur untätig auf neue arbeit warten. Da aber jede Einheit für einen maximalen extrem Fall ausgelegt sein muss nimmt die Effektive Auslastung der einzelnen Einheiten immer weiter ab. Das beste Beispiel sind hierfür die MSAA-Einheiten. Benutzt man nicht die maximale AA-Stufe welche ein Chip beherrscht bleibt ein Teil dieser Einheiten einfach ungenutzt. Aber auch wenn man die maximale AA-Stufe einsetzt sind die Pixelshader meistens kaum in der Lage bei jedem Takt einen neuen Pixel fertig zustellen wodurch die AA-Einheiten auch unter ihren Möglichkeiten bleiben.
Lassen wir aber die AA-Einheiten mal aussen vor und betrachten nur die Vertext und Pixelshader. Moderne Chips bieten eine sehr hohe Vertexleistung die aber meist gar nicht genutzt wird weil die Pixelshader nicht mit der Arbeit hinterherkommen. Nun wissen wir aber das es bei den 3.0 Shadern zwischen dem Pixel und Vertex Bereich kaum unterschiede gibt.
Diesen Umstand sollte man nun meiner Meinung nach ausnutzten und statt getrennter Pixel und Vertexshader nur noch allgemeine Shader verbauen. In Abhängigkeit des Workloads könnte diese dann dynamisch dem Pixel oder dem Vertexprocessing zugeordent werden.
Der Vorteil wäre eine bessere Ausnutzung der Ressourcen allerdings würde man dafür aber auch zusätzliche Transistoren zur Steuerung des ganzen benötigen.