AMD Ryzen 7 1800X Review – Teil 1
AMD Ryzen – Die Architektur im Detail: Lade-/Speichereinheiten
Die Caches füttern natürlich die Ausführungseinheiten mit Daten. Bevor Letztere aber in die Register geladen oder geschrieben werden, müssen sie erst die Load-/Store-Einheiten passieren. Deren Aufbau sehen wir auf dem nächsten Bild, unten mittig ist der 32 KiB große L1-Datencache positioniert:
Wie im ganzen Kern üblich wird auch dieser Vorgang durch großzügige Warteschlangen abgepuffert, um Leerläufe zu vermeiden und einen guten Durchsatz erreichen zu können. In diesem Falle gibt es eine Lade- und eine Speicherwarteschlange. Erstere verfügt über 72 Warteplätzte, letztere über 44. Die Lade- und Speicherschlange sind über drei 128-Bit-Ports für zwei Lade- und eine Schreiboperation an den L1D-Cache angebunden. Sowohl die Anzahl der Warteplätze als auch die asymmetrische Aufteilung liegt darin begründet, dass in den allermeisten Fällen Rechnungen nach dem Schema A + B = C berechnet werden, wofür eben zwei Ladevorgänge plus ein Speichervorgang nötig sind. Ausnahmen können über Berechnungen außerhalb der Befehlsreihenfolge (OoO) und durch die vorhandenen Puffer abgefangen werden.
Flankiert wird die Speichereinheit von einem bereits von Bulldozer bekannten Schreibe-&-Kombiniere-Puffer (Write-Combine-Buffer (WCB)), der Schreiboperationen zuerst sammelt, zusammenfügt und erst dann schreibt, und dem MAB, einem Puffer für Speicheradressen.
Um die bereits gezeigten Ressourcen für Ausführung und Datenhaltung nicht verhungern zu lassen, hat AMD auch das sogenannte Execution Front End, also die Befehlsversorgung, gegenüber Excavator ausgebaut.
Das beginnt mit in drei Ebenen vorhandenen großen Adressübersetzungs-Spickzetteln (Translation Lookaside Buffers oder TLBs), die sowohl schnell als auch in dieser Kombination energiesparend sind. Dort werden einmal die Übersetzungen von virtuellen in physikalische Adressen von Speicherblöcken mit Programmcode für den Schnellzugriff vorgehalten. Treue Leser werden sich an die TLB-Probleme der ersten Bulldozerversion und deren Verbesserungen ab Vishera erinnern.
Ebenso erwähnenswert ist der Hash Perceptron Predictor, also eine Sprungvorhersage-Einheit, die mit Hilfe eines neuronalen Netzes das Sprungverhalten im ausgeführten Programmcode lernt und vorhersagt. Das hatten auch schon die Cat-Kerne und spätere Kerne der Bulldozer-Reihe. Bei Zen wird gibt es jedoch die Neuerung, dass das mit Hashes verknüpft wird, um die Leistung noch zu steigern. Dabei bestimmt nicht allein die aktuelle Position im Programmcode, welches Perceptron zuständig ist, sondern es wird aus der Adresse und deren bisherigen Sprunghistorie ein Hash berechnet. Das erhöht die Trefferquote nochmals.
Der 32 Einträge große Return Stack Puffer ist wichtig für die immer tiefer verschachtelten Aufrufe heutiger Software und Betriebssysteme. Das Indirect Target Array unterstützt dagegen z. B. bei virtuellen Funktionsaufrufen oder Sprungtabellen in Switch-Case-Anweisungen (für die Programmierer unter uns).
Der mit 64 KiB (4‑wegig) ausreichend dimensionierte Level-1-Befehlscache sollte auch mit zwei Threads im SMT-Betrieb nicht so schnell Engpässe aufkommen lassen. Bei der Bulldozer-Reihe, wo das Front End ebenfalls zwei Threads abarbeiten konnte, betrug die Größe dieses Cache anfangs auch 64 KiB (indes nur 2‑wegig), welche später auf 96 KiB (3 Wege) ab Steamroller aufgestockt wurden. Zudem gibt es bei Bulldozer im Zusammenspiel mit einem Linux-Sicherheitsfeature (ASLR) Probleme, wo der im Cache liegende Programmcode bei bestimmten Kombinationen von Speicheradressen zweier oder mehrerer Programme gegenseitig wieder aus dem Cache geworfen wurde.
Nachdem eine Adresse ermittelt und in die Physical Request Queue für das Laden des nächsten Programmcodes aus dem Level-1-Befehlscache eingereiht wurde, wird parallel über ein kleines Tag (µTag) geprüft, ob die gewünschten Befehle schon im MOp-Cache vorliegen. Liefert das µTag für den MOp-Cache keinen Treffer, werden die Befehle in einem 32 Byte-Block aus dem L1-Befehlscache geladen und an die Decoder-Einheit weitergereicht.