Seite 2: Die Ampere-Architektur für GeForce-GPUs

Die auf der GeForce RTX 3080 verwendete GA102-GPU basiert auf der Ampere-Architektur, die sich aber wiederum von der Datacenter-Variante unterschiedet, wie sie in der GA100-GPU zum Einsatz kommt.

Der Ampere Streaming Multiprocessor (SM) verzichtet nahezu komplett auf die FP64-Recheneinheiten, die in der GA100-GPU für den HPC-Einsatz noch wichtig sind, im Endkundenbereich aber keine Rolle spielen. Wir sehen 1/60 der FP32-Leistung für in den Berechnungen für doppelte Genauigkeit. Ein Whitepaper würde genauere Details dazu nennen, zum aktuellen Zeitpunkt liegt uns dies aber noch nicht vor.

Stattdessen hat man die Anzahl der FP32-Recheneinheiten verdoppelt. Statt 64 der FP32-Einheiten pro SM gibt es nun 128. Hinzu kommen 64 INT32-Einheiten. Es gibt nun zwei Datenpfade pro Quadrant eines SMs, die teilweise parallel angesprochen werden können. Einer der Datenpfade besteht aus 16 FP32-Einheiten. Hier können also 16 FP32-Berechnungen pro Takt bearbeitet werden. Ein zweiter Datenpfad besteht aus jeweils 16 FP32- und INT32-Einheiten. Jeder der SM-Quadranten kann entweder 32 FP32-Operationen ausführen oder jeweils 16 FP32- und INT32-Operationen pro Takt. Für den gesamten SM bedeutet dies die mögliche Ausführung von 128 FP32-Operationen oder jeweils 64 FP32- und INT32-Operationen pro Takt.

Die GA102-GPU verfügt über sieben GPCs (Graphics Processing Clusters) mit jeweils 12 SMs. Bei der GeForce RTX 3090 und GeForce RTX 3080 sind aber nicht alle SMs aktiviert. Die GA102-GPU käme theoretisch auf insgesamt 10.752 FP32-Einheiten (7 GPCs x 12 SMs x 128 FP32-Einheiten). Für die GeForce RTX 3090 aber sind zwei SMs deaktiviert worden und somit kommt die Karte auf "nur" 10.496 FP32-Einheiten. NVIDIA tut dies, um die Ausbeute der Chips so hoch wie möglich zu halten.

Für die GeForce RTX 3080 ist bei der GA102-GPU ein GPC komplett abgeschaltet und von den verbleibenden sechs nutzen nur vier die vollen 12 SMs – zwei sind auf zehn SMs beschränkt. Damit kommen wir bei 68 SMs auf die 8.704 FP32-Einheiten.

Für NVIDIA ist eine FP32-Einheit ein CUDA-Kern und insofern spricht der Hersteller für die GeForce RTX 3080 von 8.704 CUDA-Kernen. Es handelt sich dabei um die aufsummierten FP32-Einheiten in den SMs. Hinzu kommen 4.352 INT32-Einheiten.

Weiterhin pro SM vorhanden sind vier Tensor Cores der dritten Generation, deren Anzahl pro SM nun also halbiert wurde, die aber mindestens doppelt so leistungsfähig sein sollen. Es bleibt bei einem RT Core pro SM, aber auch hier gibt es für die nun zweite Generation einige Verbesserungen.

Neben den Änderungen in den SMs gibt es auch solche im Aufbau der ROPs bzw. der Kopplung zwischen den ROPs und den Speichercontrollern. Bis zur Turing-Generation sind die ROPs immer am Speicherinterface angeschlossen. Pro 32-Bit-Speichercontroller waren acht ROPs vorhanden. Änderte sich die Anzahl der Speichercontroller und damit die Größe des Speicherinterface, galt dies auch für die ROPs. Für die Ampere-Architektur sind die ROPs im GPC untergebracht. Pro GPC gibt es zwei ROP-Partitionen, die jeweils acht ROPs enthalten. 

Damit ergibt sich auch eine andere Berechnung für die Anzahl der ROPs bei der GeForce RTX 3080. Wir sprechen hier von sechs GPCs mit jeweils 2x 8 ROPs also 96 ROPs ingesamt. Für die GeForce RTX 3090 sind es sieben GPCs mit 2x 8 ROPs und dementsprechend 112 ROPs.

NVIDIA hat die Integration der ROPs in dieser Form ausgeführt, um das Render-Backend nicht mehr derart abhängig vom Speicherinterface zu machen. So hat man nun zwar ein 320 Bit breites Speicherinterface für die GeForce RTX 3080 umgesetzt, kann aber 96 anstatt nur 80 ROPs verwenden.

L1- und L2-Caches

Entsprechend der Ausbaustufe gibt es unterschiedliche Größen des L2-Caches. Für die GeForce RTX 3080 beläuft sich dieser auf 5.120 kB, bei der GeForce RTX 3070 sind es 4.096 kB und die GeForce RTX 3090 wird auf 6.144 kB zurückgreifen können. Zum Vergleich: Die TU102-GPU brachte es auf 6.144 kB.

NVIDIA hat für Ampere den L1-Data-Cache von 96 kB auf 128 kB vergrößert. Die Datenrate zum L1-Cache wurde abermals verdoppelt. Diese Maßnahme hatte NVIDIA schon einmal von Pascal zur Turing vollzogen. Der Register bleibt mit 16.384 Einträgen zu jeweils 32 Bit identisch. Dies gilt auch für die Anzahl der Load- und Store-Einheiten.

Schlussendlich können wir noch einen Blick auf die GA102-GPU werfen, so wie sie auf der GeForce RTX 3090 zum Einsatz kommen wird. Den Aufbau haben wir eben schon beschrieben.

Zweite Generation der RT Cores

Die zweite Generation der RT Cores soll doppelt so viele Intersection-Berechnungen durchführen können wie ihre Vorgänger. Da NVIDIA die Anzahl der RT Cores pro SM belässt, ergibt sich eine theoretische Skalierung der RT-Leistung um den Faktor zwei. Bei mehr SMs für die einzelnen Modelle ist die Leistung natürlich entsprechend höher.

Eine Herausforderung in der Berechnung der Intersections ist ein Raytracing auf Objekte, die sich bewegen und auf die auch ein Motion Blur angewendet wird. Für Turing-GPUs bzw. deren RT Cores konnte dies zu einem Flaschenhals in der Raytracing-Leistung werden. Die zweite Generation der RT Cores bietet nun parallel arbeitende Einheiten, die eine bessere Annäherung durch Interpolation in Motion Blur Effekten ermöglicht. Über eine zeitabhängige Funktion werden die Intersections vorausberechnet und das Raytracing nur noch auf Bereiche angewendet, die auch wirklich notwendig sind.

Dritte Generation der Tensor Cores

Erwartungsgemäß baut NVIDIA die Tensor Cores in der dritten Generation weiter aus und lässt diese neben INT16 und FP16 als Datensätze mit der bisher höchsten Genauigkeit nun auch FP32- und FP64-Berechnungen durchführen. Dies ist vor allem für die höheren Genauigkeiten im HPC-Segment wichtig. Für die GeForce-GPUs aber spielen geringere Genauigkeiten eine wesentlich wichtigere Rolle.

So können die Tensor Cores der Turing-Architektur 64 FP16 Fused Multiply–Add (FMA) pro Tensor Core durchführen. Für Ampere sind es in vollgepackten Matrizzen 128 für die GA102-GPU und sogar 256 für die GA100-GPU. Kommt die Sparsity/Sparse Matrix oder die dünnbesetzte/schwachbesetzte Matrix hinzu, sind es sogar 256 FP16 FMA für die GA102-GPU und 512 für die GA100-GPU. Die Tensor Cores der Turing-Architektur unterstützen keine Sparsity.

Damit erhöht sich die Tensor-Rechenleistung also mindestens um den Faktor zwei. Vor allem die DLSS-Leistung soll davon profitieren, aber theoretisch trifft dies auf alle Anwendungen zu, die AI-Berechnungen verwenden.

GDDR6X

Eine immer höhere Speicherbandbreite ist bei der Vielzahl an Shadern von entscheidender Bedeutung. Die Cache-Hierarchie wird schneller und so muss auch der Speicher immer schneller werden. GDDR6 hätte nur noch über einen höheren Takt eine höhere Speicherbandbreite ermöglicht. Eine Alternative wäre die Verbreiterung des Speicherinterface gewesen. HBM besitzt ein extrem breites Speicherinterface, ist in der Integration und Fertigung aber einfach zu teuer – und kommt daher entsprechend noch nicht zum Einsatz.

NVIDIA hat sich also mit Micron zusammengetan und GDDR6X entwickelt. GDDR6X arbeitet in etwa mit dem gleichen Takt wie GDDR6 und auch die Spannung ist vergleichbar.

Für den bisherigen GDDR6-Speicher wird eine Non-Return-to-Zero (NRZ) Pulsamplitudenmodulation verwendet. Zwischen "0" und "1" wird durch einen Unterschied in der High- und Low-Spannung unterschieden. GDDR6X wechselt auf ein PAM4, für die das Trägersignal in vier Spannungslevel pro Taktzyklus unterteilt wird. Die einzelnen Schritte betragen gerade einmal 250 mV. Das PAM4 kommt bei immer mehr Übertragungsstandards zum Einsatz. Auch PCI-Express 5.0 und DDR6 werden auf PAM4 setzen.

NVIDIA und Micron wenden zudem ein paar Tricks an, um eine derartige Übertragung bei den gewünschten Taktraten noch gewährleisten zu können. Das sogenannte Max Transition Avoidance Coding (MTA) sorgt dafür, dass das Signal nur in bis zu zwei Spannungslevel wechselt. Würde der Wert vom niedrigsten auf das höchste Spannungslevel springen können, während die "Augen" im Signal nicht mehr deutlich zu unterscheiden und eine Signalübertragung nicht möglich. Mit MTA setzt sich NVIDIA in die Codierung des Signals und sorgt dafür, dass eine entsprechend kompatible Kodierung vorgenommen wird.

Zuletzt ermöglicht NVIDIA dem System auch eine gewisse Dynamik, denn selbst kleine Unterschiede in der Fertigung von PCB und Speicher sorgen für Unterschiede in der Signallaufzeit. Algorithmen können die Signalübertragung entsprechend anpassen.