PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Effektiverer Einsatz der Vertexshader bei einem Deferred Renderer möglich?


Demirug
2003-06-07, 18:06:13
DR ist ja als ein Mittel zur Reduktion das Arbeitswolumen im Pixelbereich bekannt. Alle derzeit bekannten DR Verfahren bauen auf dem entfernen von nicht sichtbaren Pixeln bevor sie die Pixelpipelines erreichen auf.

Seit der letzten erfolgreichen implementierung (Kyro) eines DR Verfahrens hat sich bekanntermassen einiges getan. Inzwischen werden ja zusätzliche Teile der 3d-Pipelines auch von den Chips mit übernommen. Als grössten Teil kann man hier das Vertexprocessing im Vertexshader zu nennen.

Daraus entstehen für einen DR neue Probleme. Die Möglichkeiten der VS führen nun zu mehr und komplexeren Verticen welche dann natürlich mehr speicher brauchen. Hinzu kommt noch das Vertexprocessing vor dem HSR durchgeführt werden muss weil es ja erst die entgültige Positions der Verticen bestimmt. Dadurch muss die VS Einheit eines DR mindestens die gleiche Leistung wie die eines IMR bringen.

Aber muss das wirklich so sein? Ich denke nicht.

Überlegen wir uns einmal was ein Vertexshader alles tun muss. Zum einen berechnen sie natürlich die bereits erwähnte Position. Aber Zusätzlich müssen ja auch noch einige Operationen für die Lichtberechnung und Texturekoordinaten durchgeführt werden. Diese Werte sind für das HSR aber vollkommen überflüssig weil sie keinerlei Einfluss darauf haben. Die einzige logische schlussfolgerung daraus ist das man die Ausführung der Programmteile die für diese Werte zuständig sind einfach verzögert bis man die Werte wirklich braucht. Der Treiber müsste dafür das VS Programm analysieren und in zwei Teile trennen. Den Positionsteil und dem ganzen Rest.

Exemplarisch würde das bei einem TBDR wie folgt aussehen.


1. Phase

für Jedes Polygon

speichere die REndersettings für diese Polygon

für jedes Dreieck im Polygon

Berechne für jede der 3 Verticen des Dreiecks die Position oder
hole sie aus einem Cache

Speichere die für das HSR benötigenten Dreiecksdaten sowie die
fortlaufende Nummer des Dreiecks in die dazugehörige Tile.


2. Phase

für jede Tile

für jedes Dreieck

HSR Test durchführen.


3. Phase (auf Tilebasis)

Ausführen des zweiten Teil des Vertexprogramms für jede Vertice
die zu einem noch sichtbaren Dreieck gehört.

4. Phase (auf Tilebasis)
Ausführen der Pixelprogramme für jeden sichtbaren Pixel in der Tile



Kommen wir nun zu den Vor und Nachteilen

Vorteile:
- Für Verticen die nicht zum entgültigen Bild beitragen wird nur die Position berechnet was Vertexshader leistung spart
- Nur für die benötigten Verticen müssen die Grunddaten die zum berechnen von Licht oder Texturekoordinaten eingeladen werden. Damit läst sich unter umständen Bandbreite sparen.
- Beim speichern der Displayliste muss nur das nötigste gespeichert werden. Das spart auf jeden Fall Bandbreite.

Nachteile:
- Die Vertexshader einbindung in den Chip wird komplexer.
- Wenn Dreiecke in mehr als einer Tile liegen kann es passieren das Verticen doppelt berechnet werden müssen. Kostet Vertexshaderleistung und Bandbreite. Ein Tile übergreifender Cache könnte hier aber etwas abhielfe schaffen.
- Die gegenseitige Kopplung von Vertex und Pixelshader wird bei diesem Verfahren wieder grösser da nur auf Tileebene der Workload verteilt werden kann.

IMO sollte aber das Verzögern des Vertexprocessings einen Vorteil bringen. Um das ganze genau durchzurechnen fehlt mir leider wieder mal die notwendige Hardware.

Modulor
2003-06-08, 19:01:27
***

Modulor
2003-06-08, 19:07:49
Genau darüber habe ich mir in den letzten Tagen auch Gedanken gemacht.Immerhin gab es bis zum P9 keinen DR der Hardware T&L besaß.Doch wie hat 3Dlabs diese komplexe Strukturen im Chip implementiert? Wenn sie die VPU schon komplett von Grund auf neu designt haben denke ich haben sie auch die Arbeit nicht gescheut das zu überdenken (in den Patenten steht auch "...eliminate some of the historical baggage.")...
Die Skizzen des P10 zeigen eine Anordnung der Einheiten wie man es "herkömmlich" zu realisieren gedenkt.Doch imho kann das für den P9 bis zur Pixelpipeline nicht 1:1 gelten, dafür zeigt Slipstream gelgentlich eine zu hohe Leistung im Vergleich zum P10 und die Sichtbarmachung des Overdraw der noch bei den Pixelpipelines ankommt (so vermute ich jedenfalls) ist um einiges geringer als der des P10(siehe http://www.tilebase.de/reviews/VP560/VP560_18.html ff.).

In der VPU wird ja viel mit parallel zur Arbeit im Chip ablaufenden "streams" (command/data/paramter) und buffern (zumeist im lokalen Grakaspeicher) gemacht die ständig aktualisiert werden.Anders läßt sich wohl die immense Datenmenge bei der parallelen Bearbeitung von Fragmenten nicht koordinieren.

Mein Geadanke daher:

- einmalig am Eingang des Chips die Geometrie der Szene berechnen
- dann Aufspaltung von Parametern und Daten sowie Zuordnung zu den einzelnen streams und Füllung der Puffer
- während nur die Daten in den parallel laufenden streams bis einschließlich zum Rasterizer bearbeitet werden kann die command unit die Daten der nächsten Szene an die Vertexprozessoren weitergeben, welche sich dann an die Arbeit der 2. Szene machen
- während die Daten der 2. Szene berechnet werden wird im Hintergrund Szene 1 in tiles zerlegt und es erfolgt die Sichtbarkeitsprüfung.
- Nachdem diese abgeschlossen ist werden die so ermittelten Daten über den command stream (oder einen sonstigen) an die Vertexprozessoren zurückgeleitet welche sich dann an die eigentliche Arbeit machen.Die erforderlichen Daten werden aus den Puffern geladen welche ja aktuelle Informationen über die Szene 1 enthalten...

Klingt zwar irre aufwendig und bandbreitenfressend,da - soweit ich das von meinen Karten her beurteilen kann - nahezu alle Puffer im lokalen Texturspeicher und im sog. "virtual memory" angelegt werden: so bekommt die VP560 durch div. registry Parameter mit der Bezeichnung DriverNonLclxxSizeKB (die Betonung liegt auf NONLOCAL) etwa 100 MB zur Verfügung gestellt, die VP970 hat davon etwa 128.
3Dlabs gibt diesen immensen Bandbreitenbedarf selber zu,sagt aber u.a. dazu:"It prepares the architecture for the day when embedded DRAM can be used, but doesn't necessarily have to add to the gate cost.").

Sie sind nicht wie NVIDIA oder ATI darauf angewiesen halbjährlich neue Chips auf den Markt zu werfen und konnten sich so problemlos einer völlig neuen,unkonventionellen und zukunftsorientierten Architektur widmen. Welche nahezu katastrophalen Auswirkungen eine "Innovation" bei den Platzhirschen haben kann hat die Umstellung auf 13 micron bei NVIDIA gezeigt...jetzt bedenke man was eine komplett neue Architektur ohne "Altlasten" bei den beiden großen für Folgen haben kann, wenn irgendwo ein Furz quer sitzt...(deswegen denke ich z.B. auch,daß PowerVRs nächster Chip ein wirklich wunderbares Stück Silizium sein wird :D).

btw:
Ich habe ja beide Chips hier, den P10 auf der VP970 sowie den P9 auf der VP560. Wenn ich also etwas behilflich sein kann bei der Durchführung von Tests werde ich das gerne machen !

Modulor
2003-06-08, 19:32:33
Ich habe mal den Vertex Shader Test vom 3DMurx2001Se laufen lassen:

VP970:
640 x 480: 81,1
800 x 600: 76,1
1024x 768: 67,0
1280x1024: 52,6

VP560:
640 x 480: 44,0
800 x 600: 44,3
1024x 768: 44,1
1280x1024: 35,3

Sieht doch interessant aus...

Demirug
2003-06-08, 19:51:12
Danke für das Angebot aber mit "notwendiger Hardware" meinte ich den Inhalt des Serverraums von nVidia. :D Es geht ja darum ein theoretische Model für einen noch nicht vorhanden Chip durchzusimulieren.

Was den P9 angeht so kann es sich dabei nicht um einen vollständen Frameverzöger handeln denn sonst mdürfte es keinen Overdraw geben und auf den Bildern die ich gesehen habe war noch Overdraw zu sehen. Deswegen ja meine im anderen Thread erwähnte Theorie das man in dem Bereich welcher die Tiles verwaltet einen Logik eingebaut hat die eine Anzahl von X Tiles und Y Dreicken im Grafikspeicher ablegen kann. Der Rest der Pipeline ist ja scheinbar schon beim P10 so ausgelegt das man nur noch auf Tile-ebene arbeitet.

Was der P9 aber nun scheinbar nicht tut ist auch das Vertexprocessing zu verzögern. Genau das ist aber der Gegenstand meiner Idee.

Eine einfache Rechung dazu:

Gehen wir davon aus das wir eine Position Transformieren und 4 Texturekoordinaten übernehmen müssen. Das sind also 8 Anweisungen (4 transformation + 1 pro Koordinate) pro Vertex. Gehen wir nun davon aus das 50% der Verticen gecullt werden und wir einen Overdraw von 2 haben dann würde im durchschnitt nur noch jede 4 Vertice überhaupt gebraucht werden (also 25%).

In unserem Fall würde das bedeuten das wir nur für 25% der Verticen das VS Programm komplett durchrechen müssten für alle anderen nur das verkürzte welches nur die Position bestimmt (4 Operationen):

75% * 4 Ops + 25% * 8 Ops = 5 Ops.

Man würde also im Durchschnitt 3 Ops bzw 37,5% einsparen. Wird der Texture und Lichtanteil im Vertexshader aufwendiger und/oder steigt der Cull und Overdraw Faktor wird der Gewinn noch grösser. Ich lehne mich jetzt mal etwas weit aus dem Fenster und behaupte ein DR mit dieser Technik kommt mit der hälfte der Vertexshader wie ein IMR oder ein DR mit "normaler" Technik aus.

Ein weitere Vorteil liegt auf der Bandbreiten Seite.

Bei der normalen Technik müssen 3 Floats für die Position und 4*2 Floats für die Koordinaten gelesen werden. Von den 8 Floats für die Koordinaten haben aber nur 25% am Ende wirklich einen Einfluss auf das Bild.

Also normal = 11 Floats und mit Verzögertem Vertex processing = 5 Floats. Damit hätte man eine Einsparung von 6 Floats oder 54,5%. Wir reden hier von teurer Bandbreite. Beim DR kommt ja noch hinzu das jede Vertex Information welche vor dem zerlegen in Tiles erzeugt wird ja auch mit in den Szenebuffer geschrieben werden muss und das kostet speicher und Bandbreite. Auch hier gilt wieder je mehr Culling und/oder Overdraw desto höher die Einsparung. Ein DR mit verzögertem Vertexprocessing bräuchte also auch weniger Speicher und Bandbreite für die gleiche Arbeit.