Pentium und PowerPC

Pentium und PowerPC sind unter völlig unterschiedlichem Vorzeichen 'aufgewachsen'. Während Pentium und -Pro einem mittlerweile 17 Jahre alten Geschlecht entstammen und direkte, kompatible Nachfahren des klassischen CISC-Bausteins (CISC = Complex In- struction Set Computing) 8086 von Anno 1979 sind, ist die PowerPC-Familie als Spin-Off von IBMs POWER-Architektur mit fünf Jahren noch relativ jung. Grundprinzip ihrer RISC-Bauweise (RISC = Reduced Instruction Set Computing) ist die Fokussierung auf die 10 % der CISC-Befehle, die in der Regel 90 % eines typischen Programms ausmachen - und die auch ein Compiler gern benutzt.

Reduced oder Complex

Doch trotz RISC-Idee steht die PowerPC-Architektur an Befehlsreichtum den Intel-Prozessoren kaum nach. Manch aufwendige und exotische Befehle der x86-ISA (ISA = Instruction Set Architecture) fehlen zwar (etwa ASCII-Adjust-, Tabellen- und Stringbefehle), ebenso die recht komplexen Indizierungen (Scaled-Index-Based-Befehle), dafür bietet sie viele andere, zum Teil ebenso komplexe Möglichkeiten, etwa indizierte Ladebefehle, die zusätzlich zu ihrer eigentlichen Tätigkeit das Indexregister verändern.

Ein entscheidener Unterschied zur Intel-CISC-Architektur ist die konstante Befehlslänge von 32 Bit, was den Befehls-Dekoder erheblich vereinfacht. Andererseits kennt der PowerPC keine 32-Bit-'Immediates', man kann also keinem Register direkt einen 32-Bit-Wert oder eine 32bittige Adresse zuweisen, wie es bei Intel-CPUs in 32-Bit-Umgebungen gang und gäbe ist. Um einen 32-Bit-Wert zu laden, sind beim PowerPC zwei Befehle nötig.

Adreßbildung des PowerPC

Länger noch als bei Intel-Prozessoren dauert die Odyssee, welche die Adressen vom logischen Zustand zu den physikalischen Pins mitmachen. PowerPC beherrscht nämlich vier Mechanismen der Adreßbildung:

-direkt 32bittig (entspricht x86 ohne Paging)

-über die Block Address Translation (BAT), wozu jeweils acht Spezialregister für Daten und Instruktionen Übersetzungsblöcke von 128 KByte bis 256 MByte definieren

- über Segmentregister und Paging Unit: Auch der PowerPC kennt Segmentregister, und zwar gleich 16 Stück. Diese legen Segmente von jeweils 256 MByte Größe fest. Über die Segmentregister werden 52bittige virtuelle Adressen erzeugt, die über eine aufwendige Page Address Translation mit 4-KByte-Pages und zwei TLBs (Translation Lookaside Buffer) von je 64 Einträgen (PPC604) letztendlich die physikalische Adresse festlegen. Dieser Translationsweg entspricht ganz grob der x86-Architektur mit Segment-Deskriptoren und Paging

- über Segmentregister mit Direct Store Segment Translation. Das ist eine Art I/O-Zugriff am Cache vorbei, ein Relikt aus alten POWER-Zeiten, seine Nutzung wird nicht empfohlen

Vorteile der RISC-Architektur

Eine herausragende Eigenschaft von RISC-Prozessoren ist die Orthogonalität ihrer Register. Jedes der 32 Integer-Register ist 'general purpose', also bezüglich aller Operationen gleichwertig. Einen Akkumulator als Engpaß, über den viele Operationen abgewickelt werden müssen, kennt die Architektur nicht. Das ist ein erheblicher Unterschied zur x86-Architektur, wo zwar inzwischen alle 32-Bit-Register als Index benutzt werden können, aber so wichtige Funktionen wie etwa die Multiplikation immer das EAX-Register beziehungsweise das Registerpaar EDX/EAX verwenden müssen. Insbesondere ist jedoch der Intel-Befehlssatz auf nur acht Register beschränkt.

Ein weiterer wichtiger Vorteil, den viele RISC-Prozessoren der Intel-Architektur voraus haben, ist ihre 'Harmonie mit C'. Die dortigen Pointerstrukturen, insbesondere die häufigen Pre- und Post-Dekrements und
-Inkrements (- -I oder J+ +) sind hier oft in einem Prozessorbefehl abgebildet, während der x86 zwei Befehle benötigt. Der PowerPC unterstützt auch eine Variante des Post-Dekrements, nämlich die Update-Befehle. Dort, wo über Offset und ein oder zwei Indizes effektive Adressen berechnet werden, kann man noch ein Update-Register anfügen, das im Anschluß diese effektive Adresse aufnimmt.

Die gleiche Registerübermacht von 4 : 1 wie bei Integer trifft man auch bei den Fließkommaeinheiten (FPUs) an. Bei PowerPC ist die FPU als normale Drei-Adreß-Maschine organisiert: zwei beliebige FP-Register lassen sich verknüpfen und das Ergebnis einem dritten zuordnen. Ganz anders in der Intel-Architektur: die acht FPU- Register sind hier als Stack angeordnet, Operationen lassen sich nur auf das oberste Register im Stack anwenden. Compiler haben mit dem komplizierten Stackmanagement ihre liebe Not, Optimierungen über Registervariablen etwa sind hier kaum machbar - beim PowerPC gehört das hingegen zu den Pflichtaufgaben.

Außerdem sind viele Grundrechenarten des PPC604 deutlich schneller als beim Pentium oder PPro. Das gilt insbesondere für den wichtigen Multiply-Add-Befehl, den die Intel-Prozessoren mit zwei Befehlen erschlagen müssen. Weiterhin gibt es auch konditionierte Fließkommabefehle (FSEL). Andererseits fehlen alle transzendenten Befehle wie sin, cos, tan, ln oder exp, mit denen die Intel-Welt aufwarten kann. Hier muß der Compiler geeignete Approximationsroutinen in seiner Mathe-Bibliothek bereithalten, was den erzeugten Code natürlich aufbläht.

Die verschiedenen Cache-Strategien.

Sowohl Pentium und PentiumPro als auch die PPC60x-Prozessoren sind superskalar, das heißt, sie haben mehrere parallel arbeitende Funktionseinheiten. Zu den Integer-Rechenwerken (ALU = Arithmetic Logic Unit) gesellen sich die Fließkomma-, Load/Store- und die Sprungvorhersage-Einheit (Branch Unit). Letztere sorgt dafür, daß möglichst selten Wartezeiten durch Programmverzweigungen entstehen. Der Prozessor merkt sich in einem Branch History Buffer, welche Sprungmuster an welchen Adressen aufgetreten sind, um beim nächsten Mal mit möglichst hoher Trefferquote den weiteren Programmweg vorherzusagen.

Der Pentium hat zwei einfach gestrickte Pipelines. Es ist Aufgabe des Compilers, Abhängigkeiten zwischen den Befehlen möglichst zu entkoppeln, damit sie parallel ausgeführt werden können. Im Pentium ist der Parallelisierungsgrad daher recht klein. Hinzu kommt, daß eine Pipe warten muß, bis die andere fertig ist. So dreht sie zum Beispiel bei einer Division gut 40 Takte lang Däumchen.

PentiumPro und die PowerPCs (insbesondere der PPC 604) sind hier erheblich leistungsfähiger. Eine Vielzahl von Mechanismen sorgt für eine effiziente Befehlsentkopplung. Ein wichtiger 'Trick' dabei ist das Register-Renaming. Physikalische Register sind hierbei nicht mehr statisch einem logischen Register zugeordnet, sondern der Prozessor kann sie nach Bedarf ummappen. Außerdem müssen Befehle oft nicht unbedingt in der Reihenfolge ausgeführt werden, in der sie im Programm aufeinanderfolgen. Die modernen Prozessoren ordnen sie um und sorgen am Ende über einen Reorder-Buffer dafür, daß die Zugriffsreihenfolge wieder stimmt. Ein weiteres Bonbon sind Zwischenspeicher von ausdekodierten Befehlen, die auf eine freiwerdende Unit warten, die sogenannten Reservation States.

Der PPC603 hat recht wenig an parallelen Units zu bieten: er weist nur eine Integer-Unit auf. Demgegenüber kommt der PentiumPro mit zwei und der PPC604 gleich mit drei Integereinheiten daher, wobei die dritte Einheit nur für langandauernde Befehle (MUL, DIV) vorgesehen ist. Reservation States haben nur PPro und PPC604 zu bieten, der PPro speichert bis zu 20 'µOP' genannte Befehle zentral zwischen, der PPC604 hat dezentral an jeder Funktionseinheit kleinere Speicher.

Alle hier betrachteten Prozessoren besitzen getrennte Code- und Daten-Caches.
Pentium-P54C und PPRo haben je 8 KByte, Pentium-55C (demnächst) und PPC603e je 16 KByte, während der PPC604e mit zweimal 32 KByte Cache der L1-Cache-König ist. Ungeschlagen bei der L2-Performance ist hingegen der PentiumPro, da hier der im Gehäuse integrierte L2-Cache mit der vollen Prozessorgeschwindigkeit betrieben wird, während alle anderen nur mit dem erheblich niedigeren exteren Systemtakt auf den externen L2-Cache zugreifen können.

Der Pentium weist eine besonders gute L1-Cache-Anbindung auf. Mit 256 Bit Breite gelangen die Instruktionen in den Decoder. Misalignments (Zugriffe auf ungerade Adressen und Daten) kann der Pentium nahezu problemlos wegstecken - die anderen Prozessoren haben hiermit mehr Probleme.

Alle vier Prozessoren transferieren ihre Daten zumeist in einem Burst von vier aufeinanderfolgenden Zugriffen vom und zum L2-Cache oder Hauptspeicher. Beim PPC603 kann ein externer Zugriff 32bittig oder 64bittig sein, bei den andern ist er immer 64bittig. Wie schnell die Bursts im Endeffekt sind, hängt von der Umgebung, also dem Chipsatz und der Art des Cache-Speicherinterface (synchron/asynchon) ab.