Grafik- Programmierung Seminar SS08 Thema: Stand der Technik/ Ausblick Moritz Dekorsy 10.07.2008 1
Inhaltsverzeichnis 1. Einführung...3 1.1 Stand der Technik...3 1.2 Unified Shader...3 1.3 Vorteile...6 1.4 Vergleich der Pipelines...8 2. Anwendung...11 2.1. Die fliegenden Kisten...11 2.2 Komplexer: Navier-Stokes...13 3. Ausblick und Fazit...14 3.1 AMD s Fusion...14 3.2 Aufbau AMD Fusion...15 4. Anhang...16 4.1 Literaturverzeichnis...16 2
1. Einführung 1.1 Stand der Technik Der Grafikchip, um den es hier gehen soll, ist der G80 auf der Geforce 8800 Karte. Auf diesem Chip des Grafikprozessorenentwicklers NVIDIA wurde mit der Unified-Shader-Bauweise erstmals eine Technologie eingeführt, die sich stark von der klassischen Shader-Bauweise wie sie auf herkömmlichen Grafikchips Verwendung findet, unterschied. Dieses zur neuesten Technologiegeneration von Grafikchips gehörende damalige (2006) Flaggschiff des Grafikkartenherstellers NVIDIA verfügt über 681 mio. Transistoren in 90nm Fertigungstechnik, d.hh diese befinden sich auf 484 mm 2 Chipfläche. Als verwendete Programmierschnittstelle für die 3D-Grafik kommt Direct3D10 zum Einsatz, das verwendete Modell für die Shader-Architektur ist bereits in der vierten Version. Durch die parallel arbeitenden 128 Streamprozessoren, die jeweils mit einer Frequenz on 1.35 Ghz arbeiten, addiert sich die Rechenleistung zu beeindruckenden 346 GFlop/s. 1.2 Unified Shader Die Unified-Shader, die auf dem G80 erstmals zum Einsatz kommen, stellen eine neue Art von Grafikprozessoren dar, sogenannte Alleskönner im Gegensatz zu den jeweils dedizierten herkömmlichen Shader. Hier folgt eine kurze Wiederholung zu den Shader, um den Übergang von der klassischen diskreten Shader-Architektur zu der Unified Architektur darzulegen: Es gibt drei Arten von Shadern, die Pixel-Shader für allgemeine Berechnungen der Bildpunkte wie die Pixelfarbänderungen und das Hinzufügen von 3D- und Lichteffekten, die Vertex-Shader zur Berechnung und dynamischen Veränderung von Objekten durch Verschiebung der Vertices (der Eckpunkten von dreidimensionalen Objekten), und die Geometry-Shader zur Erzeugung neuer geometrischer Objekte. Diese drei verschiedenen Typen von Shadern wurden wegen ihres jeweils stetig wachsenden Funktionsumfanges und den sich daraus ergebenden Überschneidungen zu einer Unified-Shader-Archtiektur zusammengefasst, bei der Hardwareseitig auf eine Unterscheidung der drei herkömmlichen Shadertypen verzichtet wird. 3
Dies hat den Vorteil, das man die Shadereinheiten nicht von vorneherein den jeweiligen Aufgabengebieten Pixel-, Vertex- und Geometrieshading widmet, und sie so möglicherweise bei ungleich verteilten Rechenaufgaben im Leerlauf verbleiben. Dieser Unterschied ist bei den Blockdiagrammen des G70 (Abb.1) und G80 (Abb. 2) zu sehen. Die erste Graphik zeigt den G70/71, bei dem noch diskrete Pixel- und Vertex-Shader existieren, und zwar 8 Vertex-Shader (*) und 24 Pixel- Shader (**). (*) (**) Abb. 1: Blockdiagramm G71 4
Die Unified-Shader-Architektur, nach der der G80-Grafikchip aufgebaut ist, fasst also nun die drei herkömmlichen Shadereinheiten zu einer Hardwareeinheit (*) zusammen. [1] (*) Abb. 2: Blockdiagramm G80 Man beachte den Datenfluss. Nachdem der Assembler seine Rechenoperationen durchgeführt hat, erreicht der Datenfluss den Vertex- Prozessor, welcher diesen sooft wie nötig durch die Unified-Shader schickt, bis alle nötigen Berechnungen ausgeführt wurden. Bei den Stream- Prozessoren, von welchen die Unified-Shader des G80 ja 128 Stück enthalten, handelt es es sich im Gegensatz zu älteren Generationen nicht um Vektor-, sondern um Skalarprozessoren, was zunächst sonderbar erscheint angesichts der Tatsache, dass einschlägige Literatur zu 3D-Grafik voll von Matrixberechnungen ist. Der Einsatz von skalaren Stream- Prozessoren jedoch erschafft eine viel effizientere und flexiblere Berechnungsmaschinerie, die gegenüber herkömmlichen Architekturen, bestehend aus vier Blöcken zu jeweils 32 dedizierten Prozessoren um den Geschwindigkeitsfaktor 2 übertrifft. 5
1.3 Vorteile Der Vorteil dieser Bauweise zeigt sich insbesondere, bei folgendem Anwendungsbeispiel, einmal auf der klassischen und einmal auf der neuen Architektur veranschaulicht: Hat man beispielsweise eine Szene (Abb. 3) bestehend aus vielen einzelnen zu berechnenden Vertices und wenigen Pixeln, Abb. 3: Szene mit vielen Vertices so verteilt sich die Rechenlast auf einem Chipsatz klassischer Bauweiser, wie bei diesem fiktiven mit einer festen Anzahl von 4 Vertex Shader- Einheiten und 8 Pixel-Shader-Einheiten, nicht ihren Anteilen entsprechend auf die Shadereinheiten, sondern die fest vorgegebene Anzahl an Pixel-, Vertex- und Geometrieshadern ist dafür verantwortlich, dass im Normalfall immer einige bis viele Shadereinheiten ungenutzt bleiben, während deren Rechenleistung an anderer Stelle fehlt. [2] Abb. 4: Szene mit vielen Pixeln Analoges gilt für Szenen bestehend aus vielen zu berechnenden Pixeln (Abb. 4), hier kommt es ebenso zu einer unsymmetrischen Auslastung der Shader, also zu einer ineffizienten Auslastung des Chipsatzes. 6
Die Unified Architektur ermöglicht nun, im entgegengesetzten Fall zu alten Chipsatzarchitekturen die Rechenlast zu Gunsten der Performance dynamisch auf die Streamprozessoren verteilt werden (Abb. 5 & 6): Abb. 5 Hierbei kommt es nun zu einer optimalen Auslastung von 12 der fiktiven 12 Shadereinheiten, da sowohl Pixel- als auch Vertexoperationen ausgeführt werden können. Abb. 6 7
1.4 Vergleich der Pipelines Veranschaulichen wir uns noch einmal das klassische Modell einer 3D- Pipeline (Abb. 7), wie sie in den letzten 20 Jahren eingesetzt worden ist: Der Datenfluss beginnt ganz oben, wo Vertices mit den verschiedenen Indizes, Kommandos und Texturen der GPU von der CPU übergeben werden. Dann müssen die Vertices die einzelnen Shader und anderen Verarbeitungsstufen eins nach dem anderen durchlaufen, bis sie in den Speicher geschrieben werden können. [3] Transform and Lightning --> vertex shading Dreiecks,-Punkt- und Linienoperationen Shading, Texturierung, Pixelshading Blending, Z-buffering, antialiasing breitbandiger und schneller mit der Zeit Abb. 7: 3D-Pipeline 8
Bei der Unified Pipeline und Shader Architektur des GeForce 8800 Designs konnte die Anzahl der zu durchlaufenden Verarbeitungsstufen drastisch gesenkt werden. Berechnungen, die mehrere Verarbeitungsstufen benötigen, können immer wieder, aber jeweils nur bei Bedarf, die Shader-Einheiten durchlaufen. 1.5 Unified Design Schematisch lässt sich das Unified Design (Abb. 8) folgendermassen darstellen: Die zu verarbeitenden Daten werden an den Eingangspuffer des Chips geschickt (im Bild links), werden von dem unified-shader-kern verarbeitet und von dieser aus über den Ausgangspuffer zurück an den Eingangspuffer geschickt, wo sie ihrer jeweiligen Verarbeitungsstufe entsprechend weiter berechnet werden. Dieser Vorgang wird genauso oft wiederholt, bis alle Operationen abgeschlossen sind und das Objekt (Vertex, Polygon) an das ROP-Subsystem (Raster-Operations) weitergegeben wird. Abb. 8: Unified Design 9
Als Konsequenz dieser neuartigen Architektur (Abb 9), die zu einer enormen Leistungssteigerung und Entlastung damit auch für den Hauptprozessor geführt hat, erschliessen sich einige neue Aufgabengebiete für die sogenannten Unified Stream Prozessoren, wie das sogenannte Geometry-Shading oder physikalische Berechnungen, auf die ich hier noch näher eingehen will. Abb. 9: Unified Pipeline 10
2. Anwendung 2.1. Die fliegenden Kisten Ein einfaches Beispiel für solche parallelen Rechenoperationen ist die Berechnung von fliegenden Kisten (vielen gleichartigen Objekten). Ziel ist es, die Positionen dieser fliegenden Objekte zu bestimmen. Dafür benötigen wir die jeweilige alte Position, die Geschwindigkeit der Box und die Zeit. Die Strecke, die ein Objekt zurücklegt, hängt von der Geschwindigkeit und der Zeit wie folgt ab: s = v t Deshalb werden die neuen Positionen der Kisten berechnet nach: P P 1 n = P2 = = P 1old P P 2 old nold + + + v 1 v v 2 n t t t Die serielle CPU würde nun immer nur eine Gleichung auf einmal berechnen können (viell. zwei oder vier mit einem Mehrkern Prozessor). 11
Abb. 10: CPU-Rechenschema 1 Ausserdem operiert sie aus dem Cache heraus und benötigt deshalb eine grosse, komplexe Kontrolllogik. Dieses Design wäre zur Berechnung reichlich ineffizient, wollte man viele dieser identischen Gleichungen möglichst gleichzeitig berechnen, da eine herkömmliche CPU eben nicht dafür ausgelegt ist, viele ähnliche Berechnungen bzw. Gleichungen simultan auszuführen bzw. zu lösen. Die GPGPU würde dieses Aufgabe hingegen deutlich schneller bewältigen können, aufgrund ihrer parallel aufgebauten Art. Die einzelnen Shader würden die Gleichungen simultan lösen und können darüber hinaus Informationen über den Grafikspeicher austauschen. Dabei werden diese simultan mittels Streaming befüllt. Abb. 11: GPU-Rechenschema 1 : ALU: Arithmetisch logische Kontrolleinheit 12
2.2 Komplexer: Navier-Stokes Was dieses stark vereinfachte Beispiel nicht berücksichtigt ist die Notwendigkeit, dass die einzelnen Threads (Ausführungsstränge) untereinander kommunizieren müssen, was jedoch nur auf Hardware möglich ist, die dem DirectX 10 Standard genügt. Man überlege sich beispielsweise die Simulation von untereinander wechselwirkenden Teilchen, wie zum Beispiel den Teilchen einer Strömung, einer Flüssigkeit oder eines Gases. [6] Ein solche Simulation wird realisiert durch die Berechnung eines Gleichungssystemes (viele ähnliche Gleichungen) welches aus der Navier- Stokes-Gleichung folgt: u t ρ ρ 1 = ( u ) u p + v ρ 2 u + F Hierbei ist u ρ das Geschwindigkeitsfeld (Abb. 12), p das Druckfeld, v die Viskosität (Zähheit) des Fluids, ρ die Dichte und F = (fx, fy) eine beliebige externe Kraft, welche auf das Fluid wirkt. Abb. 12: Geschwindigkeitsvektorfeld eines Fluids 13
Dieses Gleichungssystem bezieht den Einfluss aller benachbarten Teilchen bei der Berechnung eines jeden einzelnen mit ein. Nur dadurch, dass (wie es bei DirectX 10 der Fall ist) der Output als kontinuierlicher Datenstrom erfolgt, ist es möglich, dass alle diese Berechnungen parallel ausgeführt werden. Dabei wird der von den Streamprozessoren gemeinsam benutzte Speicher zur Interprozesskommunikation genutzt, was sich ebenfalls als gewaltiger Vorteil eben dieser Architektur erweist. 3. Ausblick und Fazit 3.1 AMD s Fusion Aufgrund der immer weiter wachsenden Fähigkeiten und Eignungen der GPU s, deren stetig steigender Rechenleistung und Fähigkeit, auch immer allgemeinere Aufgaben zu übernehmen, drängt sich den Chiparchitekten nun natürlich der Gedanke auf, die sich immer ähnlicher werdenden GPU und CPU in einem Chip, auf einer Matrix zu vereinigen. Denn Aufgrund der sehr ähnlichen Anforderungen dieser an ein System wie der Tatsache, dass es sich bei beiden um Processing Units (PUs) handelt, müssen beide mit großer Bandbreite und hoher Geschwindigkeit auf den Speicher zugreifen, wobei geringe Latenzen eine wichtige Rolle spielen und für beide es von Vorteil ist, auf viele Transistoren zurückgreifen zu können, bot sich dei Entwicklung eines Projektes zur Vereinigung von CPU und GPU an. AMD, der Chipfabrikant hat sich 2006 mit ATI, dem Grafikkartenhersteller zusammengeschlossen. Aus dieser Fusion auf Unternehmensebene soll nun eine auf der der Chipsätze entstehen, mit ebenjenem Namen, AMD-Fusion. (ist der Codename). 14
3.2 Aufbau AMD Fusion An einem weiteren Blockdiagramm (Abb.13) lässt sich die Architektur dieses neuartigen Prozessorkombinates veranschaulichen: Abb. 13: Blockdiagramm AMD Fusion Man erhofft sich von dieser Vereinigung Vorteile wie den schnelleren Speicherzugriff des GPU-Kerns auf den Arbeitsspeicher über den Prozessorsockel ( da dieser mit höherer Bandbreite an diesen angeschlossen ist als die PCI-e - oder AGP Schnittstelle, einen schnelleren Informationsaustausch zwischen CPU & GPU-Kernen, da Cache der CPU mit dem Buffer der GPU direkt über den hier zu sehenden Crossbar-Switch verbunden ist (geringere Latenzen sind die Folge), sowie ein besseres Rechenleistungs zu Watt Verhältnis (sprich: Stromeinsparungen) im Vergleich zu diskreten Systemen; Zielanwendungen sind natürlich in der Mobilsparte zu suchen. 15
3.3 Fazit Es ist zu abzusehen, dass der Geschwindigkeitsvorteil von GPU Implementierungen solcher Verfahren gegenüber seriellen Prozessoren immer größer wird. Für Simulationen bei denen die Genauigkeitsanforderungen nicht so hoch sind wie beispielsweise die die Darstellungen von Strömungen oder Partikelschwärmen in Filmen werden sie bereits heute eingesetzt. Falls sich jedoch der Trend der sich stetig verbessernden Fleißkommagenauigkeit und Speichererweiterung fortsetzt, so ist die Verwendung von GPGPUs für physikalisch korrekte Simulationen abzusehen, so z.b. im Fahrzeugbau. 4. Anhang 4.1 Literaturverzeichnis [1] NVIDIA: GeForce 8800 GPU Architecture Technical Brief 2007 [2] Jim Van Verth: Physical Simulation on GPUs 2007 [3] Phil Hester: Unleashing the Processing Powerhouse 2007 [4] Sarah Tariq and Ignacio Llamas (NVIDIA Developer Technology): Real-Time Volumetric Smoke, Fire and Water with Fluid Dynamics 2007 [5] Sarah Tariq and Ignacio Llamas (NVIDIA Developer Technology): Real-Time Volumetric Smoke using D3D10 2007 [6] Alexander Podlich und Jens Wollenhaupt: GPGPU Strömungssimulation 2006 [7] Irma Sejdic, Dominik Erdmann, Daniel Wilhelm & Christoph Kurz: Partikelsysteme & Schwärme 2006 16