Der PowerPC 603e: Power for the Atari

Der Atari Falcon eröffnet der Classic-Atari-Hardware mit der Tempest-Beschleunigerkarte den Schritt in die Ära des PowerPC. Matthias Alles knöpft sich daher die verwendete PowerPC-CPU vor und stellt sie ihnen genauer vor.

Egal ob annähernd nativ auf dem Coldfire oder per Emulation auf PowerPC- oder AMD und Intel-Prozessoren: Durch das Ende der Weiterentwicklung der 68000er ist man für modernes Atari-Computing gezwungen nach Auswegen für diese Misere zu suchen. Entweder bemüht man sich, gleich einen ganz neuen Rechner mit diesen neuen, modernen und auch schnellen Prozessoren auf die Beine zu stellen, oder aber man versucht erstmal mit einem Beschleuniger die in die Jahre gekommene 68er-Generation zu ergänzen. Bei der neuen Falcon-Beschleunigerkarte Tempest kommt nun erstmals die PowerPC-Familie zum Zuge, wobei hier die Atari-Software anders als bei MagiCMac ohne ein MacOS darunter ihren Dienst verrichten soll.

Als letzter Vertreter der zweiten PowerPC-Generationen G2 hält der 603e die Fahne hoch. Durch seine Architektur als RISC-Prozessor ist er mit 2.6 Millionen Transistoren - also nur 100.000 mehr als im 68060 - dennoch in der Lage diesen in puncto Performance deutlich zu schlagen. Es scheint zwar, er sei nur aufgrund der hohen Taktraten schneller, es darf aber mit Recht daran gezweifelt werden, dass der 68060 bei solch hohen Taktraten die gleiche Geschwindigkeit erreichen kannte. Tatsächlich gibt es jedoch zwei verschiedene 603e-Prozessoren, die sich nur unwesentlich unterscheiden (s. Tabelle). Die neuere Variante (PID 7v) lässt beispielsweise durch einen kleineren Fertigungsprozess wesentlich höhere Taktfrequenzen zu. Zwar bewegt er sich mit seinen maximal 300 MHz mittlerweile auch einiges von den aktuellen Desktop-CPUs weg, die Architektur allerdings beinhaltet dennoch beinahe alles, was auch ganz neue Prozessoren bieten. Und wie es sich für einen RISC-Prozessor gehört, kann das Grand der Befehle in nur einem Taktzyklus ausgeführt werden. Sogar die FPU ist bei vielen Rechenoperationen mit einfacher Genauigkeit aufgrund ihrer Pipeline dazu in der Lage. Als PowerPC (Power Performance Chip) ist der Chip in der Lage einen 64-Bit Datenbus zu nutzen. Angesichts der immer steigenden Leistungsfähigkeit ist dieser auch bitter nötig. Was wäre ein moderner Prozessor schon im Stande zu leisten, wenn ihm schlichtweg die zu verarbeitenden Daten aufgrund mangelnden Nachschubs ausgehen?

Wie dem auch sei, der 64-Bit-Datenbus auch mit 32 Bit genutzt werden, wobei allerdings mit Geschwindigkeitseinbußen zu rechnen ist. Um allerdings dem berühmt-berüchtigten Flaschenhals entgegenzuwirken, werden auch im 603e schnelle Ist-Level-Caches eingesetzt. Jeweils 16 Kb für Daten und Instruktionen kommen hier zum Zuge und sollen die bremsenden Buszugriffe deutlich verringern. Um diese Technik noch zu verfeinern werden nicht stur nacheinander die Einträge überschrieben, sondern darauf geachtet, welche Daten im Cache am wenigsten genutzt werden. Als solche vermutlich unnützen Daten oder Befehle entlarvt, werden sie zuerst aus dem kostbaren Cache verbannt. Hierfür kommt ein bestimmter LRU-Algorithmus (Least Recently Used) zum Einsatz.

Wo bitte geht's zur Ausführungseinheit? Wie auch schon der 68060 so sind alle PowerPCs superskalare Prozessoren, es stehen also mehr als nur eine Ausführungseinheit zur Verfügung. Ganze fünf Befehle kann der 603e gleichzeitig ausführen - dass diese Notwendigkeit ein-tritt, ist allerdings eher die Ausnahme. Die fünf Ausführungseinheiten sind:

Entsprechend dieser Einheiten lassen sich auch die Befehle in diese fünf Gruppen unterteilen. Wenn also im besten Fall fünf Befehle gleichzeitig ausgeführt werden sollen, müssen demnach kurz aufeinander ein Sprung-, ein Systemregister-, ein Lade- oder Speicherbefehl und dazu noch eine Integer- und Fließkomma-Rechenoperation folgen. Als sehr beschleunigend dürfte sich die Out-of-order-Execution bemerkbar machen. Allerdings hat dies nichts damit zu tun, dass der Prozessor auch außer Betrieb Befehle abarbeiten könnte. Es bedeutet lediglich, dass der PowerPC in der Lage ist. Befehle schon abzuarbeiten, wenn sie eigentlich noch gar nicht dran sind. Es muss sich nicht zwingend an die Reihenfolge der Befehle gehalten werden, wie sie im Speicher aneinander gereiht sind. Man zieht einfach einen Befehl dem anderen vor, wenn die Ausführungseinheit für diesen Befehl noch beschäftigt ist. Dies ist allerdings auch nur begrenzt möglich, wie man leicht ersehen kann: Verarbeitet ein Befehl das Ergebnis des vorangegangenen Befehls, kann er wohl kaum schon vorher ausgeführt werden. Überprüft werden solche Abhängigkeiten von der Dispatch Unit (s.u.). Das Ausführen eines Befehls kann früher erfolgen, das Ergebnis wird dennoch chronologisch zurückgeschrieben. Bewerkstelligt wird dies durch die Completion Unit (CU). Sobald ein Befehl auf eine der Ausführungseinheiten verteilt wird, wird auch gleich ein Eintrag in der Completion Queue gemacht - dort allerdings in der richtigen Reihenfolge. Sind alle fünf Einträge belegt, kann auch kein Befehl mehr dispatched werden. Die Reihenfolge wäre dann nicht mehr genau zu rekonstruieren. Die letztlichen Veränderungen, die ein Befehl bewirkt, werden erst in den letzten beiden Einträgen der Completion Queue vollzogen. Zwei Befehl pro Takt sind in der Completion Unit abschließbar, hinzu kommt noch ein Sprungbefehl, was insgesamt drei Befehle pro Takt macht. Solange allerdings z.B. durch einen bedingten Sprung nicht eindeutig festgelegt ist, dass diese Befehle auszuführen sind, werden auch keine Manipulationen an den Registern vorgenommen. Um das zu ermöglichen, verfügt der 603e über sogenannte „Rename Buffer", sowohl für die CPRs (General Purpose Register - die Unterteilung in Daten- und Adressregister entfällt beim PowerPC), als auch für die FPRs (Floating Point Register). In diesen wird zwischengespeichert, was ein Befehl erarbeitet hat. Erst wenn die CU das endgültige OK für den Befehl gibt, werden seine im Rename Buffer gespeicherten Auswirkungen auch umgesetzt. Dies stellt sicher, dass nicht plötzlich Daten in einem Register stehen, die gar nicht erst dort hineingehören und so zu falschen Ergebnissen führen würden.

Der interne Aufbau des PowerPC 603e

Datenhunger

Gefüttert werden alle ausführenden Einheiten von der Instruction Unit. In ihr findet man den Sequential Fetcher, der für das Holen der Befehle aus dem 16 Kbyte großen Instruction-Cache verantwortlich ist, und die Instruction Queue, die bis zu sechs auszuführende Befehle zwischenspeichert. Sobald eine Speicherplatz in ihr frei wird, tritt der Fetcher wieder in Aktion und holt den nächsten oder die nächsten beiden Befehle. An das Ende dieses FIFO-Puffers gesellt sich letztendlich die Dis-patch Unit mit der Aufgabe die Befehle an die vier Ausführungseinheiten zu verteilen.

«Vier Ausführungseinheiten? Wieso denn plötzlich nur noch vier», werden Sie sich vielleicht fragen. Die Lösung lässt sich bei den Sprungbefehlen finden:

Sie werden nicht wie „gewöhnliche" Befehle von der Dispatch Unit verteilt, sondern bereits beim Fetcher abgegriffen, an die Branch Processing Unit weitergereicht und aus dem Strom der Befehle entfernt (Branch Folding) - von kleinen Ausnahmen einmal abgesehen. Wer jetzt aber glaubt, diese BPU verfüge wie der 68060 oder der Coldfire MCF5407 über Sprungvorhersagetabellen oder gar kleine Caches, ist leider auf dem Holzweg. Es wird keinerlei dynamische Vorhersage getroffen, was sich insbesondere auf häufig durchlaufende Schleifen wie ein Bremsklotz auswirken dürfte. Die Vorhersage besteht lediglich darin, auf das Condition Register (das Pendant zum Conditon Code Register im 68k) zu schielen, um in Erfahrung zu bringen, wie es dort gerade ausschaut. Angesichts der ganzen Menge Befehle, die noch in der Instruction Queue ihrer Ausführung verharren sicherlich gewagt und nicht sehr präzise. Die neuen Zieladressen der Verzweigungen werden gleich in der BPU mittels eines einfachen Volladdierers berechnet. Das Link-Register merkt sich die Rücksprungadresse, wenn das Programm eine Subroutine aufruft und kann dann schneller zum Ausgangspunkt zurückkehren.

*Der PowerPC 603e im Vergleich mit MC68000 und Coldfire

Bezeichnung MC68000 MCF5407 MPC603e(PID 6/7e)
Strategie CISC RISC RISC
Superskalar ja teilweise ja
Ausführungseinheiten 3 1-2 5
Prozess [?m] 0,5 0,22 (4LM) 0,5 (4LM) /0,29 (5LM)
Die[mm2] k.A. k.A. 98/42
Transistoren [Mio] 2.5 k.A. 2.6
SpannungfV] 3/5 1,8 3,3/2,5
Power Management
Programmierbar la ja ja
Dynamisch ia nein la
Leistungsaufnahme[W]
Typisch 4,9 k.A. 4,2/4,0
Max k.A. k.A. 5,3/6,0
MMU(I/D) ja/ja nein/nein ja/
Datenbus 32 Bit 8/16/32 Bit 32/64 Bit
Adressbus 32 Bit 32 Bit 32 Bit
TLB(I/D) 64/64 -/- 64/64
BAT(I/D) -/- -/- 4/4
I-Cache 8 K 16 K 16 K
D-Cache 8 K 8 K 16 K
Out-of-order Execution nein nein ja
Branch Prediction dynamisch dynamisch statisch
Brauch Cache 256 8 -
Prediction Table 128
Instruction Queue 96 Bytes 10 Befehle 6 Befehle
Fmax[MHz] 75 162 133/300
Busfrequenz max [MHz] 75 54 66
Divison [Takte] 34 35 37/20
Rechenleistung bei fmax 110 257 188/423

Was auch immer die Instruction Unit tut, kann sie mittels der 64-Bit Konzeption mit zwei Instruktionen gleichzeitig vollziehen, egal ob das Holen aus dem Cache, das Zwischenspeichern in der Queue oder das Dispatchen an die Ausführungseinheiten. Zwei Befehle, die pro Takt verteilt werden können, dürften beim 603e auch ausreichen. Vor jeder der vier Ausführungseinheiten findet sich nämlich noch eine Reservation Station. Diese können jeweils einen Eintrag umfassend Befehle Zwischenspeichern, die somit direkt an der Ausführungseinheit zur Verfügung stehen - auch dann, wenn die Operanden noch nicht zur Verfügung stehen. Der Dispatch Unit wird so die Möglichkeit eröffnet, bereits weitere Befehle an vielleicht andere Ausführungseinheiten zu verteilen (diese kann ja nur auf die letzten beiden Eintragungen der IQ zugreifen). Eventuelle Leerläufe können auf diese Weise minimiert werden.

Etwas Speicher gefällig?

Auch in der PowerPC-Familie sind MMUs (Memory Management Unit) nicht mehr wegzudenken. Je eine MMU für Daten und Befehle sind im 603e vorhanden, die in der Lage sind physikalisch 4 Cbyte (2A32 Bytes) und virtuell 4 Petabytes (2A52 Bytes) zu adressieren. Prädestiniert für solch nützlichen Dinge wie Speicherschutz in Multitaskingsystemen werden je ein 64 Einträge umfassende Translation Lookaside Buffers (TLBs) geboten (beim 68060 noch ATC - Adress Translation Cache - genannt), die sich die meist genutzten Umsetzungen von logischen in physische Adressen merken sollen. Wie auch schon die Caches werden die Einträge der TLBs mittels LRU-Algorithmen gefüllt um zeitaufwendige Zugriffe auf Tabellen im Speicher zu verringern. Diese MMUs unterstützen aber nicht wie in der 68er-Familie nur Pages (beim PPC 4 Kb groß), sondern auch Blocks zwischen 128 Kb und 256 MB Größe. Um diese wiederum zu verwalten gibt es die sogenannten BAT-Arrays (Block Adress Translation), die für die Umrechnung der logischen in die physischen Adressen bei den Blocks vorhanden sind. Sowohl in der Daten- als auch in der Befehls-MMU steht ein Array mit je vier Einträgen zur Verfügung. Auch die im Cache abzulegenden Adressen werden in den MMUs generiert.

Der Ausweg aus der Energiekrise

Der PowerPC 603e ist eigentlich als „Low Power PowerPC" zu verstehen, da er mittels Stromspartechniken für den Einsatz in Notebooks oder Laptops optimiert ist. Zum Einen unterstützt er dynamisches Power Management: Ausführungseinheiten ohne Beschäftigung werden abgeschaltet. Genauer gesagt hat jede Ausführungseinheit ein eigenes Taktsignal, das dann stillgelegt wird, womit auch der Stromverbrauch gesenkt werden kann. Hinzu kommen noch drei Stromspar-Modi - im Gegensatz zu dem einem vom 68060 - die per Soft- und/ oder Hardware aktiviert werden können: Doze, Nap und Sleep.

Beim Doze-Modus (dösen) werden alle internen Einheiten abgeschaltet, bis auf das Bus-Snooping. Arbeitet der Prozessor im Copy-Back Modus, ist nicht sichergestellt, dass eine anderer Prozessor am Bus auch die richtigen Daten erhält, wenn auf den Speicher zugegriffen wird, da der Prozessor sie einfach noch nicht zurückgeschrieben hat. Beim Bus-Snooping schnüffelt der PowerPC also am Bus und greift die Speicherzugriffe auf, von denen Einträge in seinem Cache vorhanden sind. Es werden so die Daten im Cache und nicht etwa die veralteten Daten im Hauptspeicher auf den Bus ausgegeben. Im Nap-Modus (Schläfchen machen) wird auch die Bus-Snoo-ping-Logik deaktiviert, während im Sleep-Modus auch noch die restlichen kleinen arbeitenden Einheiten abgeschaltet werden. Dann braucht der Prozessor auch kein Taktsignal mehr und kann durch Unterbinden eben dieses nochmals Strom sparen. Dann ist er allerdings beim absoluten Minimum angelangt. Die neuere Variante PID 7v (PID = Processor ID) versorgt den Kern um eine weitere Verringerung der Leistungsaufnahme zu erreichen mit einer 2.5 V Spannung gegenüber den 3.3 V beim älteren PID 6 (Leistungsaufnahme = Spannung * Stromstärke). Trotz der deutlich höheren Taktfreqünzen, die eigentlich den Stromverbrauch in die Höhe schnellen lassen müssten, bleibt so die typische Leistungsaufnahme noch unter der des Vorgängermodells.

Fazit

Obwohl es der älteste PowerPC ist, der noch gebaut wird, handelt es sich besonders mit Blick auf sein Inneres beim 603e um einen modernen Prozessor. Was bei den neueren Generationen der PowerPC-Familie anders gemacht wird, sind höhere Taktfrequenzen durch kleinere Fertigungsprozesse, mehr Ausführungseinheiten, breitere Datenbusse, größere Caches und dynamische Sprungvorhersagen.

Letztere ist vermutlich der einzige wirkliche Knackpunkt bei diesem Chip. Mit einer solchen könnten bessere Trefferquoten erreicht werden und die Performance würde bei manchen Anwendungen sicherlich merklich steigen. Bleibt nur noch abzuwarten, ob die Emulation die für Atari-Verhältnisse üppig angebotene Rechenleistung nicht zu sehr nach unten zieht und ob die Rechenleistung eines 68060 übertroffen werden kann.

Literatur:


Matthias Alles
Aus: ST-Computer 02 / 2001, Seite 22

Links

Copyright-Bestimmungen: siehe Über diese Seite