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

Artikel-Index:

Die Integer-Einheit im Detail

Wie auf den vor­her­ge­hen­den Foli­en zu sehen, fin­den maxi­mal sechs µOps pro Takt aus dem Dispatcher ihren Weg in die Inte­ger-Ein­heit. Dort wer­den sie im Sche­du­ler anschlie­ßend auf sechs Pipe­lines ver­teilt. Vier davon sind ALUs zur Berech­nung von Pro­gramm­code, die zwei AGUs berech­nen Spei­cher­adres­sen zum Laden oder Abspei­chern der Rechen­er­geb­nis­se. Damit ist die Archi­tek­tur vier­fach super­ska­lar, dop­pelt so breit wie ein INT-Clus­ter der Bull­do­zer-Archi­tek­tur und sogar noch etwas brei­ter als der K8/K10, der 3 Paa­re bestehend aus je einer ALU und AGU auf­wies. Rein rech­ne­risch hat­ten die K-Genera­tio­nen gegen­über Zen also eine AGU mehr zur Ver­fü­gung. Dage­gen sag­te ein K8-Ent­wick­ler damals, dass die­se nur aus Copy-/Pas­te-Design­grün­den mit­ge­nom­men wur­de und so gut wie kei­nen Effekt hat. Man hat­te sich damals für ALU+AGU-Paare mit einer vor­ge­schal­te­ten gemein­sa­men War­te­schlan­ge mit 8 Ein­trä­gen ent­schie­den und somit war die 3. AGU zwangs­läu­fig mit von der Par­tie. 4+2 Inte­ger Pipes dürf­ten trotz­dem – solan­ge auf das Cache­sys­tem und die Stack-Engi­ne Ver­lass ist – für eine sehr gute Leis­tung sor­gen, sei es mit oder ohne SMT.

Zen hat also kei­ne ALU/A­GU-Pär­chen, fol­ge­rich­tig gibt es auch kei­ne gemein­sa­me War­te­schla­gen mehr. Jede ALU oder AGU hat eine eige­ne, die jeweils 14 Ein­trä­ge auf­weist, zusam­men sind dies also 6 x 14 = 84 Ein­trä­ge. Dies ist – wie bereits in der Ein­lei­tung geschrie­ben – etwas opti­mis­tisch gerech­net. Schließ­lich kann man nicht frei über fünf Autos ver­fü­gen, wenn man selbst nur zwei besitzt und die rest­li­chen drei den Nach­barn gehö­ren. Die­ser Sach­ver­halt ist des­halb gegen­über Bull­do­zer als ein klei­ner Rück­schritt zu wer­ten, da die 40 Ein­trä­ge Bull­do­zers im Ide­al­fall auch nur einer ein­zel­nen Pipe­line zur Ver­fü­gung gestellt wer­den konn­ten. Damit wird das Design simp­ler, lässt sich ener­gie­spa­ren­der betrei­ben und ermög­licht auch einen etwas höhe­ren Takt, der wei­ter gestei­gert wer­den kann, sofern man die ein­ge­spar­te Ener­gie reinves­tiert. Gegen­über den alten K8- und K10.5-Designs, die 8 bzw. 12 Ein­trä­ge pro ALU-/AGU-Paar hat­ten, ist es in jedem Fall ein Fort­schritt.

Die vier ALUs kön­nen alle die all­ge­mein übli­chen x86-INT-Berech­nun­gen aus­füh­ren. Sel­te­ne­re Befeh­le wie Inte­ger-Mul­ti­pli­ka­ti­on oder Divi­si­on sind nur an je einer mög­lich, was aus­rei­chend ist, da die­se Instruk­tio­nen eher die Aus­nah­men als die Regel in Stan­dard-Pro­gramm­codes dar­stel­len. Branch-Befeh­le sind dage­gen an zwei ALUs mög­lich. Die­se tre­ten häu­fi­ger als Inte­ger-Mul­ti­pli­ka­ti­on oder -Divi­si­on auf. Ins­be­son­de­re wenn wie bei SMT zwei Threads das Rechen­werk bevöl­kern, ist eine 2. Branch-Ein­heit des­halb nütz­lich. Intel rüs­te­te die­se z.B. eben­falls ab der Has­well-Genera­ti­on nach. Bekannt war dies bereits seit den Com­pi­ler-Leaks im Okto­ber (sie­he letz­te Zei­le in den blau ein­ge­färb­ten INT-Blö­cken).

Abschlie­ßend muss man noch den Umfang der INT-Regis­ter erwäh­nen. Zen ver­fügt über ins­ge­samt 168 Regis­ter und liegt damit genau auf Has­well-Niveau. Bull­do­zer hat­te 160, San­dy Bridge 144 und Sky­lake 180. Wich­tig für die Rechen­leis­tung ist die Grö­ße der soge­nann­ten Reti­re-War­te­schlan­ge, die­se umfasst 192 Ein­trä­ge, die im SMT-Betrieb fest auf­ge­teilt wer­den. Es ste­hen im SMT-Betrieb also jedem Thread 96 Ein­trä­ge zur Ver­fü­gung.

Wei­ter geht es mit der Beschrei­bung der FPU.

« Die Deco­der-Ein­heit im Detail» Die Fließ­kom­ma-Ein­heit im Detail