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

Artikel-Index:

Die Fließkomma-Einheit im Detail

Hier hat sich eben­falls viel getan. Einem gemein­sa­men Sche­du­ler, wie er auch von der Bull­do­zer-Rei­he und den Cat-Ker­nen bekannt ist, wur­de ein spe­zi­el­ler Puf­fer vor­ge­schal­tet (“NSQ” für “Non Sche­du­ling Queue”), um vom Dis­patcher bereits Fließ­kom­ma-Befeh­le zu emp­fan­gen. Das ermög­licht selbst bei man­geln­den frei­en Plät­zen im Fließ­kom­ma-Sche­du­ler die Wei­ter­ar­beit des Dis­patchers. So kann die­ser z.B. die Inte­ger-Ein­heit belie­fern. Zusätz­lich kön­nen für Befeh­le in der NSQ bereits Daten aus dem Spei­cher­sys­tem beschafft und bereit­ge­stellt wer­den. So müs­sen die­se Befeh­le im Sche­du­ler nicht auf die Daten war­ten.

Pro Zyklus wer­den durch den Dis­patcher bis zu 4 µOps bereit­ge­stellt. Es ist anzu­neh­men, dass im Fall von Fließ­kom­ma-Befeh­len mit Spei­cher­ope­ran­den gleich­zei­tig die ent­spre­chen­den bis zu 2 µOps an die AGUs in der Inte­ger-Ein­heit gesen­det wer­den. Wenn Daten aus dem Spei­cher gela­den wer­den, erfolgt dies min­des­tens mit einer Latenz von 7 Tak­ten aus dem L1-Cache. Das sind immer­hin zwei Tak­te weni­ger als in der Bull­do­zer-Linie. Die­se Daten (bis 2x128 Bit) durch­lau­fen noch die Lade-Kon­ver­tie­rungs-Ein­heit (LDCVT).

Die Fließ­kom­ma-Ein­heit bie­tet 96 Ein­trä­ge im Sche­du­ler, was durch­schnitt­lich 24 Ein­trä­gen pro Pipe­line ent­spricht. Aller­dings gibt es durch des­sen Aus­füh­rung als ver­ein­ter Sche­du­ler für alle Fließ­kom­ma-Pipe­lines eine deut­lich höhe­re Fle­xi­bi­li­tät als bei Inte­ger-Code. Das ist hier auch wich­tig, da die­se Pipe­lines deut­lich spe­zia­li­sier­ter sind. Wei­ter­hin ste­hen der Ein­heit 160 phy­si­sche Regis­ter zur Ver­fü­gung. Neben aktu­el­len x86-SIMD-Erwei­te­run­gen bis AVX2 ist die FPU natür­lich wei­ter­hin mit x87-Befeh­len kom­pa­ti­bel.

Im Gro­ben gibt es zwei Mul­ti­pli­ka­ti­ons- (FMUL) und zwei Addi­ti­ons-Ein­hei­ten/-Pipe­lines (FADD). Die Fused-Mul­ti­ply-Add-Befeh­le (FMA) wer­den in den FMUL-Pipe­lines aus­ge­führt. Da jede Pipe­line zwei Lese­ports in das Fließ­kom­ma-Regis­ter­file (FPRF) besitzt, muss für FMA-Befeh­le ggf. auf einen Port der FADD-Pipe­line zurück­ge­grif­fen wer­den, sofern der Wert nicht als Ergeb­nis eines vor­he­ri­gen Befehls auf kur­zem Wege (Bypass) bereit­ge­stellt wird. Die vie­len ande­ren unter­schied­li­chen Fließ­kom­ma-Befeh­le und auch die Inte­ger-SIMD-Befeh­le sind auf die vier Pipe­lines ver­teilt. Hier sei auch wie­der auf die Gra­fik im Okto­ber-Arti­kel ver­wie­sen. Mit die­sen vier Pipe­lines besitzt ein Zen-Kern auch gleich vier x87-fähi­ge Rechen­ein­hei­ten, was gera­de für Anwen­dun­gen mit einem hohem Bedarf an x87-Rechen­leis­tung inter­es­sant sein dürf­te. Neben eini­gen wis­sen­schaft­li­chen Anwen­dun­gen gehört der Büro-Klas­si­ker Excel dazu, wel­cher auch noch für kom­ple­xe­re Berech­nun­gen in brei­tem Ein­satz ist.

Wie Mike Clark aus­führ­te, hat jede MUL-Ein­heit eine eigen­stän­di­ge FMA-Pipe­line. Die­ser Hin­weis – zusam­men mit den GCC-Patch-Infor­ma­tio­nen – könn­te bedeu­ten, dass für nor­ma­le Mul­ti­pli­ka­tio­nen noch ein­mal eige­ne Mul­ti­pli­zie­rer bereit­ste­hen, und zwar in einer Form, wie sie bei den Cat-Ker­nen ver­wen­det wird. Dort ist eine sehr ener­gie­spa­ren­de Vari­an­te einer Mul­ti­pli­zier-Ein­heit im Ein­satz, die gerin­ge Laten­zen auf­weist, hin­ge­gen bei höhe­ren Genau­ig­kei­ten (64-bit Dou­ble Pre­ci­si­on und 80-bit Exten­ded Pre­ci­si­on) ein oder zwei Takt­zy­klen extra benö­tigt. Dank zwei­er FMUL-Ein­hei­ten fällt der Latenz­nach­teil jedoch kaum ins Gewicht. Auch wur­de in den Kat­zen-Ker­nen mit Hil­fe die­ser kom­pak­ten Mul­ti­pli­zie­rer-Ein­heit eine effi­zi­en­te FDIV- und FSQRT-Ein­heit imple­men­tiert. Mit den klei­nen Struk­tu­ren des 14LPP-Pro­zes­ses könn­te man sich so eine Red­un­danz für mehr Ener­gie­ef­fi­zi­enz sogar leis­ten, da selbst die gesam­te Jagu­ar-FPU im 28nm-Pro­zess nur 0,39 mm² belegt. Ob dies bei Zen aber so umge­setzt wur­de, muss sich in wei­te­ren Bekannt­ma­chun­gen zur Zen-Mikro­ar­chi­tek­tur zei­gen.

Bei FMA-Berech­nun­gen arbei­ten je eine ADD- und MUL-Ein­heit zusam­men, wobei nur der Lese­port der ADD-Ein­heit zum FP-Regis­ter benutzt wird. Soll­ten die Daten in Form eines gera­de fer­tig­ge­stell­ten Berech­nungs­er­geb­nis­ses den Weg über den Bypass zur FMA-Ein­heit fin­den, könn­ten im güns­tigs­ten Fall im glei­chen Takt neben zwei FMA-Berech­nun­gen auch noch zwei FP-Addi­tio­nen durch­ge­führt wer­den. Das ist ein Vor­teil, da in vie­len Pro­gramm­codes mit Fließ­kom­ma-Berech­nun­gen der Anteil von Addi­tio­nen (was Sub­trak­tio­nen ein­schließt) deut­lich höher ist als der der Mul­ti­pli­ka­tio­nen.

Die FMA4-Befeh­le wer­den von Zen nicht mehr unter­stützt, wie wir bereits berich­te­ten. Damit wird der damit ver­bun­de­ne hohe Auf­wand bezüg­lich des FP-Regis­ter­files (vie­le Lese­ports) ver­mie­den. Und dazu gibt es sogar noch ein Argu­ment von sei­ten Intels: Dank Move Eli­mi­na­ti­on wer­den zusätz­li­che Befeh­le zur Siche­rung von Regis­tern vor dem Über­schrei­ben neben­bei und ohne gro­ße Hard­ware-Belas­tung aus­ge­führt.

Der Sta­tus der ver­ar­bei­te­ten µOps wird an die Reti­re-Queue zurück­ge­mel­det, was auch hier bis zu 8 µOps pro Takt bedeu­tet. Hier­zu zäh­len auch Befeh­le, die z.B. dank Move Eli­mi­na­ti­on und Zero­ing Idi­oms (effek­ti­ves Null­set­zen von Regis­tern) nicht expli­zit aus­ge­führt wer­den müs­sen. Für den Fall eines nicht kor­rekt vor­her­ge­sag­ten Sprun­ges wur­de die Lee­rung der Fließ­kom­ma-Pipe­line beschleu­nigt. Gegen­über der Bull­do­zer-Rei­he mit geteil­ter FPU besitzt Zen nun pro Kern effek­tiv die vier­fa­che Anzahl an AES-Ein­hei­ten, was zusam­men mit der SHA1-Unter­stüt­zung einen deut­li­chen Schritt zur Unter­stüt­zung von Ver­schlüs­se­lungs­auf­ga­ben dar­stellt. Das ist ein wich­ti­ger Punkt für den Dat­a­cen­ter-Ein­satz.

« Die Inte­ger-Ein­heit im Detail» Die SMT-Umset­zung im Detail