Details und Analyse der Zen-Architektur nach der Hot-Chips-Konferenz

Artikel-Index:

Die Integer-Einheit im Detail

Wie auf den vorhergehenden Folien zu sehen, finden maximal sechs µOps pro Takt aus dem Dispatcher ihren Weg in die Integer-Einheit. Dort werden sie im Scheduler anschließend auf sechs Pipelines verteilt. Vier davon sind ALUs zur Berechnung von Programmcode, die zwei AGUs berechnen Speicheradressen zum Laden oder Abspeichern der Rechenergebnisse. Damit ist die Architektur vierfach superskalar, doppelt so breit wie ein INT-Cluster der Bulldozer-Architektur und sogar noch etwas breiter als der K8/K10, der 3 Paare bestehend aus je einer ALU und AGU aufwies. Rein rechnerisch hatten die K-Generationen gegenüber Zen also eine AGU mehr zur Verfügung. Dagegen sagte ein K8-Entwickler damals, dass diese nur aus Copy-/Paste-Designgründen mitgenommen wurde und so gut wie keinen Effekt hat. Man hatte sich damals für ALU+AGU-Paare mit einer vorgeschalteten gemeinsamen Warteschlange mit 8 Einträgen entschieden und somit war die 3. AGU zwangsläufig mit von der Partie. 4+2 Integer Pipes dürften trotzdem – solange auf das Cachesystem und die Stack-Engine Verlass ist – für eine sehr gute Leistung sorgen, sei es mit oder ohne SMT.

Zen hat also keine ALU/AGU-Pärchen, folgerichtig gibt es auch keine gemeinsame Warteschlagen mehr. Jede ALU oder AGU hat eine eigene, die jeweils 14 Einträge aufweist, zusammen sind dies also 6 x 14 = 84 Einträge. Dies ist – wie bereits in der Einleitung geschrieben – etwas optimistisch gerechnet. Schließlich kann man nicht frei über fünf Autos verfügen, wenn man selbst nur zwei besitzt und die restlichen drei den Nachbarn gehören. Dieser Sachverhalt ist deshalb gegenüber Bulldozer als ein kleiner Rückschritt zu werten, da die 40 Einträge Bulldozers im Idealfall auch nur einer einzelnen Pipeline zur Verfügung gestellt werden konnten. Damit wird das Design simpler, lässt sich energiesparender betreiben und ermöglicht auch einen etwas höheren Takt, der weiter gesteigert werden kann, sofern man die eingesparte Energie reinvestiert. Gegenüber den alten K8- und K10.5-Designs, die 8 bzw. 12 Einträge pro ALU-/AGU-Paar hatten, ist es in jedem Fall ein Fortschritt.

Die vier ALUs können alle die allgemein üblichen x86-INT-Berechnungen ausführen. Seltenere Befehle wie Integer-Multiplikation oder Division sind nur an je einer möglich, was ausreichend ist, da diese Instruktionen eher die Ausnahmen als die Regel in Standard-Programmcodes darstellen. Branch-Befehle sind dagegen an zwei ALUs möglich. Diese treten häufiger als Integer-Multiplikation oder -Division auf. Insbesondere wenn wie bei SMT zwei Threads das Rechenwerk bevölkern, ist eine 2. Branch-Einheit deshalb nützlich. Intel rüstete diese z.B. ebenfalls ab der Haswell-Generation nach. Bekannt war dies bereits seit den Compiler-Leaks im Oktober (siehe letzte Zeile in den blau eingefärbten INT-Blöcken).

Abschließend muss man noch den Umfang der INT-Register erwähnen. Zen verfügt über insgesamt 168 Register und liegt damit genau auf Haswell-Niveau. Bulldozer hatte 160, Sandy Bridge 144 und Skylake 180. Wichtig für die Rechenleistung ist die Größe der sogenannten Retire-Warteschlange, diese umfasst 192 Einträge, die im SMT-Betrieb fest aufgeteilt werden. Es stehen im SMT-Betrieb also jedem Thread 96 Einträge zur Verfügung.

Weiter geht es mit der Beschreibung der FPU.

« Die Decoder-Einheit im Detail» Die Fließkomma-Einheit im Detail