Werbung
Shader Model 3.0 wurde von ATI bereits in der Vorgänger-Generation der Radeon X1800 bei seinen Grafikkarten eingeführt. Mit Shader Model 3.0 wird es den Spiele-Entwicklern ermöglicht, Optimierungen vorzunehmen und auch eine breitere Möglichkeit an Grafikeffekten zu benutzen. Das Shader Model 3.0 beinhaltet das Feature namens "Dynamic Branching" oder "Dynamic Flow Control", was es ermöglicht, innerhalb eines Shader-Programms hin- und her zu springen, Codeabschnitte zu überspringen oder Shaderausführungen zu unterbrechen. Dadurch kann die Performance eines Shaders deutlich gesteigert werden. Der Unterschied zwischen Dynamic Branching bei NVIDIA und ATI ist der, dass bei NVIDIA die Pixel-Threads sehr groß sind, sodass es manchmal länger dauert, einen solchen Thread abzubrechen, als diesen bis zum Ende durch zu rechnen. Außerdem gibt es in NVIDIAs Grafikchips keine dedizierte Einheit, die Sprung-Instruktionen vorhersehen kann, sodass die Shader-Einheiten solche Berechnungen vornehmen müssen, was natürlich die Shader-Leistung negativ beeinflusst. ATI hat bei seiner X1000-Architektur kleine Pixel-Threads ausgewählt, sodass Dynamic Flow Control effizienter arbeiten kann. Zusätzlich verfügen die Grafikkarten der X1000-Familie über die "Branch Execution Unit", um den Fluss innerhalb eines Shader-Programmes zu steuern. In der vorigen Shader-Modellen mussten sämtliche Instruktionen und Texture-Abfragen eines Shaders für einen Pixel ausgeführt werden, egal, ob sie benötigt wurden oder nicht. Mittels Dynamic Flow Control ist es nun möglich, auch komplexere Effekte zu verwenden, da diese nur für spezifischen Pixel Anwendung finden, die diese benötigen. Alle anderen Pixel verwenden dann einfachere Effekte.
Dabei ist es nicht so einfach Dynamic Flow Control in die GPU zu implementieren, da diese ihre High-Speed-Verarbeitungsfähigkeiten durch ausgiebigen Gebrauch von Parallelität erzielen. Das bedeutet, dass die GPU entwickelt wurde, um eine Serie von Operationen auf vielfältige Datenteile auf einmal auszuführen. Dynamic Flow Control hat andere Datenteile zur Folge, die andere Operationen ausführen, was dann die Vorteile von Parallelität mindern kann. ATI versucht daher in der X1000-Reihe mit der "Ultra-Threading technology" eine optimale Balance zwischen Fast Dynamic Flow Control und umfangreicher Parallelität zu schaffen. Durch eine Kombination von großen Threadzahlen, geringen Theadgrößen, dedizierten Branch Execution Units und einer großen High-Performance-Register-Reihe soll Shader Model 3.0 bei ATIs Produkten eine deutlich höhere Performance des Pixel-Shadings erreichen als bei NVIDIA.
Pixel-Shader-Architektur der Radeon X1900
Heutige GPUs verfügen über unterschiedliche Berechnungseinheiten, die die verschiedenen Shader-Operationen ausführen. In der Radeon-GPU-Reihe werden arithmetische Operationen durch Pixel-Shader-Prozessoren bestehend aus einem Set von ALUs (Arithmetic Logic Units). Textur-Operationen werden mittels dedizierter Textur-Einheiten ausgeführt. Um eine optimale Ausnutzung der Verarbeitungseinheiten zu gewährleisten, wird die Anzahl der beiden Berechnungeinheiten innerhalb der GPU so ausgewählt, dass ihre Anzahl mit dem Verhältnis der erwarteten Instruktionen möglichst gut übereinstimmt.
Pixel Shader Engine (Quelle: ATI)
Aufbau der Pixel-Shader-Prozessoren (Quelle: ATI)
Insgesamt stehen 48 Pixel-Shader-Prozessoren zur Verfügung, wobei jeder Prozessor 1 bis 5 Shader-Instruktionen pro Taktzyklus in seinen unterschiedlichen ALUs verarbeiten kann. Dabei bedeuten 48 Pixel-Shader-Prozessoren nicht dasselbe wie Pixel-Pipelines - hier ist die Zahl bei 16 Pixel-Pipelines geblieben. Der Unterschied besteht bei der Radeon X1900 darin, dass pro Pixel-Pipeline drei ALUs bzw. Pixel-Shader zur Verfügung stehen, sodass ATI auf die beachtliche Zahl von 48 Pixel-Shadern kommt. Schaut man sich bei NVIDIA um, relativiert sich die hohe Zahl an Pixel-Shadern der Radeon X1900, da die GeForce 7800 GTX zwar nur über 24 Pixel-Pipelines verfügt, aber durch die sogenannte "Superscalar Architecture" pro Pipeline 2 Befehle ausführen kann, sodass man dann auf auch 48 Pixel-Shader bei der GeForce 7800 GTX kommt. ATI hat bereits bei der Radeon X1800 erklärt, dass man bei den neueren Grafikkarten-Generationen nicht mehr von der physikalischen Pixel-Pipelines auf die Anzahl an Pixel-Shader, TMUs, Render Back Ends usw. schließen kann, sodass nicht mehr die Anzahl an Pixel-Pipelines von großer Bedeutung ist.
Die Radeon X1900 verfügt über 16 Textur-Einheiten. Jede Textur-Einheit und Textur-Adresse kann bis zu vier Textur-Abfragen pro Taktzyklus tätigen. Diese Einheiten werden vom "Ultra-Threaded Dispatch Processor" angewiesen. Der Ultra-Threaded Dispatch Processor sucht ständig nach Gelegenheiten Instruktionen neu zu ordnen, um dadurch eine maximale Verwendung der ALUs zu ermöglichen. Außerdem verwendet der Processor eine große Anzahl an simultanen Threads, um Latenzen bei der Textur-Abfrage zu vermeiden, welche auftreten können, wenn man auf Daten zugreifen möchte, die noch nicht im Textur-Cache verfügbar sind. Dabei sind die Threads klein gehalten, um von den Branching-Operationen so gut wie möglich zu profitieren.
Der R580-Chip wurde so designt, dass er aktuelle als auch zukünftige Spiele möglichst effizient darstellen kann. Wie bereits oben beschrieben, ist es am wichtigsten die Verarbeitungsgeschwindigkeit der arithmetischen Pixel-Shader-Operationen zu erhöhen. Daher hat ATI die Radeon X1900 mit 48 Pixel-Shader Prozessoren ausgestattet, was dreimal so viele sind als beim R520-Chip. Mit 380 Mio. Transistoren verfügt der neue R580-Chip über 20 Prozent mehr Transistoren im Vergleich zum direkten Vorgänger R520, dabei ist der Shader Processing Power um 200 Prozent gestiegen. Das Verhältnis von 3:1 zwischen Arithmetik- und Textur-Einheiten soll eine optimale Balance für aktuelle und zukünftige 3D-Spiele bieten.
Shadow-Map-Beschleunigung und Fetch4
Das Auslesen von Texturdaten ist seit langem gängige Praxis beim 3D-Rendering. Eine weit verbreitete Methode, welches ein größeres Gewicht auf die Textur-Filterung legt, ist Shadow Mapping. Diese Rendering-Methode für Schatten rendert die Szene zuerst von der Position einer schattenwerfenden Lichtquelle. Die Ergebnisse davon werden nicht angezeigt, sondern in einer speziellen Shadow-Map-Texture gespeichert, wobei jeder Wert die Entfernung des Objektes, welches am dichtesten an der Lichtquelle, darstellt. Danach wird die Szene von der Standard-Position gerendert. Darauf wird jedes Pixel gegen die Shadow Map geprüft. Falls ein Objekt zwischen dem Pixel und der Lichtquelle vorhanden ist, befindet sich das Pixel im Schatten, andernfalls wird es normal beleuchtet.
Eine Einschränkung von Shadow Maps sind die Treppenbildungen an den Kanten der Schatten. In der realen Welt sind die Kanten hingegen weicher. Viele Methoden, die weiche Kanten erschaffen, funktionieren, indem sie die Shadow Map filtern. Dies kann dadurch geschehen, dass man mehrere Samples nimmt und diese im Pixel-Shader kombiniert. Benutzt man eine größere Anzahl an Samples können höhere Qualitäten des Schattens erreicht werden, was aber zugleich eine Menge an Textur-Abfragen benötigt, was sich negativ auf die Performance auswirken kann. Dynamisches Branching kann dazu verwendet, um die Geschwindigkeit dieser Rendering-Methode zu verbessern. Dabei werden Pixel gesucht, die sich nahe der Schattenkanten befinden. Diese Pixel können dann eine High-Quality-Filterung mit vielen Textur-Samples benutzen, während die übrigen Pixel nur ein einfaches Textur-Sample bekommen, um zu bestimmen, ob diese sich im Schatten befinden oder nicht.
ATI Parthenon Demo mit weichen Schatten durch gefilterte Shadow Maps
Um das Shadow-Mapping weiter zu beschleunigen, beinhaltet die Radeon X1900 ein neues Textur-Sampling-Feature mit der Bezeichnung "Fetch4". Fetch4 nutzt die Tatsache aus, dass die meisten Texturen sich aus vier Farbwerten zusammensetzen , welche wiederum aus 4 Komponenten bestehen (Rot, Grün, Blau, Alpha bzw. Transparenz). Die Textur-Einheiten sind so designt, dass sie alle vier Komponenten von einer Textur-Adresse gleichzeitig abfragen und filtern. Wenn man hingegen nach unterschiedlichen Texturen mit Einzelkomponenten-Werten sucht (so z.B. Shadow Maps), erlaubt Fetch4 vier Werte von benachbarten Textur-Adressen gleichzeitig abzufragen. Dadurch wird die Textur-Sampling-Rate um den Faktor 4 beschleunigt.
Links: gewöhnliches Shadow-Mapping, rechts: Fetch4 (Quelle: ATI)
Mittels Ultra-Threading-Technologie, die das Fast Flow Control bereitstellt, und Fetch4, das schnelle Textur-Abfragen ermöglicht, kann die Radeon X1900 ansehnliche Schatten rendern, wobei die Verarbeitungsgeschwindigkeit annähernd so hoch ist wie bei den traditionellen Shadow-Mapping-Methoden, die oftmals Treppen an den Kanten bilden.
Hochauflösendes Spielen
Wenn man ein Spiel in einer sehr hohen Auflösung spielen möchte, z.B. mit 1.920 x 1.200 (WUXGA), 2.048 x 1.536 (QXGA) oder 2.560 x 1.600 (WQXGA) Pixeln, werden starke Anforderungen ans Pixel-Shading, an die Füllrate und an die Speicherbandbreite gestellt. ATI hat in seinen Grafikchips das "Hierachical Z"-Feature implementiert, das die vorgenannten Anforderungen erheblichen reduzieren soll. Dabei werden Pixel gesucht und eliminiert, die im finalen Bild auf dem Monitor nicht zu sehen sein werden, noch bevor diese gerendert werden. Dafür wird High-Speed-Memory in der GPU benötigt, was nur begrenzt verfügbar ist. Werden Bilder für Auflösungen gerendet, die die Kapazität dieses Speichers übersteigen, kann Hierachical Z nicht mehr so effektiv arbeiten. Daher hat ATI diesen On-Chip-Memory bei der Radeon X1900 im Vergleich zum Radeon X1800 um 50 Prozent vergrößert. Dadurch soll sichergestellt werden, dass die Performance bei hohen Auflösungen nicht stark abfällt. Daneben sorgen die Unterstützung von 512 MB Grafikspeicher und Dual-Link-fähige DVI-Transmitter in der Avivo-Engine dafür, dass mit der Radeon X1900 hochauflösendes Spielen möglich sein soll.
Als Nächstes betrachten wir zunächst kurz die Radeon X1900 XT/Crossfire, danach werden wir uns detaillierter mit der Radeon X1900 XTX beschäftigen, da wir diese zum Testen erhalten haben.