close

Anmelden

Neues Passwort anfordern?

Anmeldung mit OpenID

1 6. RISC-Prozessoren 6.1 Einführung Entgegen dem, was der Laie

EinbettenHerunterladen
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
6.
RISC-Prozessoren
6.1
Einführung
Entgegen dem, was der Laie eigentlich erwarten würde, sind im Laufe der Zeit wirkliche
Neuerungen auf den Gebiet der Rechner-Architektur nur sehr zögerlich eingeflossen:
1. Die Einführung Architektur-kompatibler Rechner-Familien statt einzelner unterschiedlicher
Rechner. Dazu gehört die Familie System/360 von IBM, eingeführt 1964, und die PDP-8 von
Digital Equipment. Die einzelnen Mitglieder einer Familie sind (weitgehend) Softwarekompatibel.
2. Die Einführung von Mikroprogramm-gesteuerten Steuerwerken. Auch diese Neuerung wurde
mit der IBM-360-Familie 1964 eingeführt. Damit wurden große komplexe Befehlssätze erst
realisierbar, und man konnte sogar Entwurfsfehler des Steuerwerks nachträglich reparieren !
3. Cache-Speicher. Den ersten Cache bekam der IBM S/360-85 Rechner schon 1968. Damit
konnte die Leistung des Speicher-Systems dramatisch gesteigert werden.
4. Pipelining: Die überlappende Befehlsverarbeitung in unterschiedlichen Variationen erschien
zunächst bei Super-Computern (Cray, CDC) und Mainframes (IBM), viel später auch bei
Mikroprozessoren
5. Multi-Prozessor-Rechner: Auch hier spielten die Super-Computer die Vorreiter-Rolle (z. B.
Cray).
Parallel dazu hat man über Jahrzehnte durch immer komplexere Befehlssätze versucht, die
sogenannte „semantische Lücke“ (semantic gap) zwischen Hochsprachen (FORTRAN, COBOL,
PASCAL) und der Maschinensprache zu schließen.
Erst die Mitte der 80er Jahre von John Hennessy (Stanford) und David Patterson (Berkeley)
durchgeführten Arbeiten zeigten deutlich, dass reale Programme sich völlig anders verhielten als
von den Rechner-Architekten bis dahin angenommen wurde. Man hatte also durchaus mit der
Entwicklung immer komplexerer Befehlssätze zur Überbrückung des „Semantic Gap“ in eine
falsche Richtung optimiert. Die RISC-Architekturen zeigten dann einige neue Eigenschaften:
-
-
Eine große Anzahl von variabel verwendbaren Registern (general purpose registers) in
sogenannten Universalregister-Maschinen und die Optimierung der Register-Zuweisung durch
Compiler-Technologie
Einen kleinen und einfachen Befehlssatz
Eine Optimierung der Vorgänge beim Einlesen und bei der Bearbeitung von Befehlen, um mit
möglichst wenigen Takt-Zyklen pro Befehl auszukommen.
Tabelle 6.1: CISCs, RISCs und superskalare Prozessoren
CISC-Computer
Charakt.
IBM
VAX
Intel
370/186 11/780 80486
Jahr
1973
1978
1989
Instr.-Zahl 208
303
235
Instr. Größe 2-6 B
2-57 B 1-11 B
Addr. Mode 4
22
11
Reg. Zahl
16
16
8
Contr. Mem. 420 kB 480kB 246 kB
Cache(kB) 64
64
8
RISC-Computer
Superskalare Computer
SPARC
MIPS
PowerPC
Ultra MIPS
R4000
SPARC R10000
1987
1991
1993
1996
1996
69
94
225
4B
4B
4B
4B
4B
1
1
2
1
1
40-520
32
32
40-520 32
(alle ohne Control-Memory, fest verdrahtet )
32
128
16-32
32
64
Die vorstehende Tabelle zeigt im Vergleich einige Eigenschaften von RISC- bzw. CISC-Rechnern.
1
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Die Pioniere in Berkeley und Stanford haben sich systematisch angeschaut:
-
welche Operationen bei CISC-Computern mit welcher relativen Häufigkeit auftraten
wie hoch der relative Aufwand für die Operationen war (bezüglich Prozessor / Speicher)
welche Typen von Operanden wie häufig auftraten
welche Sequenzen von Operationen häufig und / oder typisch waren.
Tabelle 6.2: Gewichtete dynamische Häufigkeit von Hochsprachen-Konstrukten
Dynamische Häufigkeit
ASSIGN
LOOP
CALL
IF
GOTO
OTHER
Pascal
45
5
15
29
6
C
38
3
12
43
3
1
Maschinen-Befehle
gewichtet
Pascal
C
13
13
42
32
31
33
11
21
3
1
Memory-Zugriffe
gewichtet
Pascal
C
14
15
33
26
44
45
7
13
2
1
Diese Übersicht deutet schon an, dass insbesondere Aufrufe von Unterprogrammen und
Rücksprünge häufig vorkommen und relativ aufwendige Operationen darstellen. Ihre Unterstützung
sollte speziell sinnvoll sein.
Viel weniger häufig als der Typ der im Mittel auftretenden Operationen ist die Art der dort
verwendeten Operanden untersucht worden.
Tabelle 6.3: Dynamischer Anteil von Operanden
Integer Konstanten
Skalare Variablen
Array/structure
Pascal
16
58
26
C
23
53
24
Mittelwert
20
55
25
Der größte Teil der Referenzen bezieht sich auf einfache skalare Variablen, wovon wiederum 80%
lokale Variablen sind. Auch der Aufruf von Arrays und anderen Strukturen ist zunächst wieder mit
dem Aufruf von Indices oder Pointern verbunden, die jeweils wieder lokale skalare Variablen sind.
Man kann also annehmen, das eine effiziente Behandlung lokaler skalarer Variablen ein Schlüssel
zu höherer Maschinenleistung ist.
Auch bezüglich der Aufrufe von Unterprogrammen ergaben sich interessante Ergebnisse:
Es ist sehr selten, dass eine Kette von Unterprogramm- oder Prozedur-Aufrufen, gefolgt von einer
ebenso langen Kette von Rücksprüngen erfolgt. Vielmehr ist die Tiefe der Hierarchien eher gering,
d. h. nach dem Aufruf einer Prozedur erfolgt mit hoher Wahrscheinlichkeit der Rücksprung vor dem
nächsten Prozedur-Aufruf. Man hat außerdem feststellen können, dass bei den Prozedur-Aufrufen
meistens nur wenige Variablen übergeben werden und dass auch die Anzahl der Statements in den
Prozeduren selbst oft nur recht klein ist.
Damit ergab sich folgende Evaluierung: Die Unterstützung komplexer Hochsprachen-Operationen
durch entsprechend komplexe Maschinenbefehle trug kaum zur Leistungssteigerung einer Maschine
bei. Es ist viel sinnvoller, die häufig gebrauchten einfachen Befehle entsprechend effizient zu
unterstützen. Und potentiell sehr effizient ist es, alle „lokal“ benötigte Information in einem
ausreichend großen Register-Satz vorrätig zu haben, um die Anzahl der Speicher-Zugriffe zu
verringern.
2
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Eines der danach entwickelten Konzepte (in Berkeley) war die zirkular organisierte RegisterStruktur. Dieses Konzept wird bis heute in den SPARC-Prozessoren von SUN eingesetzt.
restore
save
B.in
Abgesp.
WindowPointer
A.loc
C.in
w0
A.in
B.loc
w2
w3 C.loc
(F)
call
w4
(E)
D.in
D.loc
return
Aktueller
Windowpointer
Abb. 6.1: Zirkulare Puffer-Organisation
Für jedes aktive Programm wird zunächst ein Register-Satz benötigt (z. B. A). Dieser besteht stets
aus einem Teil, der nur lokal im Programm verwendet wird (Aloc) und einem Teil, mit dem
Variablen andere Programme weitergeleitet werden im Sinne einer Parameterübergabe, z. B. beim
Unterprogramm-Sprung oder – Rücksprung. In jedem Zustand des Programmablaufs ist ein Fenster
von Registern geöffnet ( z. B. Ain, Aloc, Bin) das aus drei Teilsätzen besteht:
-
Register-Satz zur Datenübergabe aus einer oder an eine übergeordneten Routine (z. B. Ain)
Register-Satz zur Datenübergabe an eine oder aus einer untergeordneten Routine (z. B. Bin)
Satz lokaler Register (z. B. Aloc)
Bei jedem Unterprogramm-Sprung wird dieses Fenster nun einen Schritt im Uhrzeigersinn gedreht,
bei jedem Rücksprung einen Schritt gegen den Uhrzeigersinn. Damit bleiben die benötigten Daten
im Übergabefenster jeweils verfügbar.
Die große Zahl der Prozessor-Register in der SPARC-Architektur von Sun unterstützt eine solche
Strategie. Die Zahl der notwendigen Register ist nicht einmal sehr hoch: Experimentell wurde
ermittelt, dass man bei einem 8-stufigen „Rad“ nur in etwa 1% der Fälle die Rücksprung-Adresse
nicht im Register-Satz findet. Die in Berkeley entwickelten RISC-Maschinen benutzen dann auch
insgesamt 8 Sätze von jeweils 16 Registern.
Typisch für alle RISC-Prozessoren ist eine relativ große Zahl frei verfügbarer Register, über deren
Verwendung der Compiler frei entscheiden kann.
Interessant ist die Frage, ob sich ein solcher Register-Satz wie oben beschrieben lohnt, wenn der
Rechner einen ausreichend schnellen Cache-Speicher besitzt.
Typischerweise kann man annehmen, dass die Verwaltungsstrategie des Cache die Verwendung
häufig benutzter Variablen besser optimiert, während im Register z. B. auch lange Zeit nicht
benötigte Daten für Rücksprünge aufgehoben werden. Auf der anderen Seite besteht aber bei
einfachen (1- bis 2-fach assoziativen) Cache-Speichern durchaus die Gefahr, dass gerade häufig
benötigte Rücksprungadressen zwangsweise ersetzt werden müssen. Sie finden also keine spezielle
Berücksichtigung. Auf jeden Fall ist es für den Prozessor viel einfacher und schneller, ein Register
zu adressieren als einen Speicherplatz. Letzteres geht noch ganz schnell, wenn die Adresse im
Translation Lookaside Buffer (TLB) zu finden ist, sonst kann es lange dauern.
3
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Tabelle 6.4: Eigenschaften eines großer Register-Satz im Vergleich zum Cache
Großer Register-Satz
Cache
Alle lokalen skalaren Daten
Kürzlich benutzte lokale skalare Daten
Einzelvariablen
Compiler-zugewiesene globale. Variablen
Memory-Blöcke
Kürzlich benutzte globale Variable
Save / restore abhängig von der Tiefe d.
Schachtelung von Prozedur-Aufrufen
Save / restore basierend auf der ErsetzungsStrategie des Cache
Register-Adressierung
Speicher-Adressierung
Instruction
Register
R
W-Nr.
Adresse
Daten
Decoder
Tags
Compare
Daten
Select Daten
Abb. 6.2: Referenzierung skalarer Daten im Register und im Cache
Ein paar wichtige Eigenschaften von RISC-Maschinen gegenüber CISC-Prozessoren haben wir
schon bei der DLX-Maschine kennengelernt:
1. Alle Befehle haben eine einheitliche Größe
2. Typischerweise sind die Befehle 32 Bit lang
3. Keine Kombination von Load / Store-Operationen von und zum Speicher mit arithmetischen
Befehlen.
4. Größere Zahl von frei wählbaren Registern, typisch mindestens 32.
Man kann aber noch ein paar mehr angeben:
5.
6.
7.
8.
Wenige Adressierungsarten, typischerweise weniger als 5.
Keine indirekte Adressierung einer Speicherzelle über den Inhalt einer anderen Speicherzelle.
Nicht mehr als ein Speicher-bezogener Operand pro Befehl.
Keine beliebigen Ausrichtungen von Operanden im Speicher. Ein Zugriff in der Mitte eines 32Bit-Befehlswortes ist unzulässig. (Viele RISC-Prozessoren können, ganz im Gegensatz zu den
Intel-Prozessoren, einen nicht-ausgerichteten Speicher-Zugriff nicht reparieren !)
4
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
9. Möglichst hohe Ausnutzung der Memory Management Unit (MMU), wenn eine Daten-Adresse
in einem Befehl vorkommt.
10. Vier oder mehr Bits zur Spezifizierung von Gleitkomma-Registern. Damit kann man
üblicherweise 16 oder mehr Gleitkomma-Register gleichzeitig verwalten.
Eine in Lehrbüchern immer wieder auftauchende Weisheit ist die größere Code-Länge von RISCgegenüber CISC-Maschinen. Experimentell Ergebnisse zeigen diese Erscheinung kaum.
Es gibt dafür mehrere Gründe:
a) Compiler sind oft nicht in der Lage, komplexe Befehlssätze wirklich auszunutzen.
b) CISC-Programme enthalten zwar weniger Befehle, aber jeder einzelne Befehl ist länger, was zu
nahezu gleichem Speicherbedarf führt.
c) Die relativ großen Register-Files erübrigen manche Operation zum Zwischenspeichern.
Dass man für Maschinen mit einfachem und regulären Befehlsablauf viel einfacher eine PhasenPipeline bauen kann, haben wir schon früher diskutiert. Ein CISC-Prozessor würde für einen
langlaufenden Befehl viele Ausführungsstufen entsprechend vielen Pipeline-Stufen benötigen. Das
verkompliziert die Administration der Pipeline erheblich und kostet z. B. proportional mehr an
Aufwand für das Forwarding zwischen Pipeline-Stufen.
Eine Eigenschaft haben wir auch bei der DLX–Maschine schon kennengelernt: Der Befehl, der auf
einen unbedingten Sprung-Befehl folgt, wird immer noch geholt und kann auch meistens noch
ausgeführt werden, bevor eine Sprungadresse bekannt ist. Man kann damit die „zwangsläufige“
Pause nach einem Sprung-Befehl noch ausnutzen, indem man einen „ohnehin benötigten“ Befehl
durch Umordnung der Befehlsfolge dort ablegt. SUN macht von diesem „Delayed Branch“-Prinzip
heftig Gebrauch. Beim bedingten Sprung-Befehlen funktioniert das Prinzip nicht immer und wird
dann problematisch, wenn der Befehl vor dem Sprung-Befehl die Sprung-Bedingung beeinflussen
kann. Dann darf man diesen Befehl nicht hinter den Sprung umordnen.
Vielleicht ist der letzte Grund der wichtigste: Wegen der einfacheren Architektur haben es
Hochschulen geschafft, selbst RISC-Prozessoren als hochintegierte CMOS-ICs zu entwerfen und
zum Laufen zu bringen. Mit CISC-Architekturen wäre das erheblich aufwendiger gewesen.
6.2
Die MIPS-Prozessor-Familie
Ein experimenteller RISC-Prozessor wurde bereits von John Hennessy in Stanford entwickelt und
als „MIPS“ bezeichnet, während die experimentellen Prozessoren in Berkeley „RISC“ hießen.
Die daraus entstandene MIPS Technology Inc. Hat nacheinander mehrere RISC-Prozessoren
entwickelt (R2000, R3000, R 6000). Der MIPS R4000-Prozessor wurde bereits 1991 entwickelt und
besitzt bezüglich der internen und externen Datenpfade, der Register, der ALU und natürlich auch
der Adressen eine Breite von 64 Bit.
Damit kann man insbesondere Gleitkomma-Zahlen in einem Schritt abarbeiten und muss sie nicht,
wie die 32-Bit-Prozessoren es tun, zerlegen und wieder zusammenfügen.
Außerdem wird der adressierbare Adressbereich mehr als 4 Gbyte groß und kann deshalb auch
Platten-Größen, die über 4 Gbyte liegen, voll ausnutzen. Die Befehle sind allerdings, wie in RISCMaschinen üblich, stets 32 Bit lang.
Der R400-Chip besteht aus 2 Teilen:
a) der CPU
b) der Memory-Management-Unit
5
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Der Prozessor besitzt 32 Register mit jeweils 64 Bit Breite. Der interne 128 Kbyte große Cache ist
je zur Hälfte für Befehle und Daten reserviert.
Die MIPS R4000 benutzt als Abkömmling der Stanford-Entwicklung fast genau die drei
standardisierten 32-Bit-Befehlsformate, die wir schon von der DLX-Maschine kennen:
6
I-Typ-Befehl
(immediate)
5
Operation
rs
6
J-Typ-Befehl
(jump)
Operation:
rs:
rt:
Immediate:
Target:
rd:
shift:
Function:
16
rt
Immediate
26
Operation
6
R-Typ-Befehl
(register)
5
Ziel
5
Operation
rs
5
5
rt
rd
5
Shift
6
Function
Befehlscode
source register specifier
source/destination register specifier
Immediate, Verzweigung, oder Adress-Angabe (displacement)
jump target address
destination register specifier
shift amount
ALU / shift function specifier
Abb. 6.3: Befehlsformate der MIPS-Architektur
Von den Adressierungsmodi für den Speicher ist nur der einfachste und am häufigsten verwendete
in hardware implementiert. Alle Memory-Referenzen bestehen aus einem 16-Bit-Offset zum Inhalt
eines 32-Bit-Registers.
Zum Beispiel:
lw r2, 128(r3) bedeutet: Lade das Datenwort aus dem Speicher, das sich 128 Adressen oberhalb des
Inhalts von Register 3 befindet, ins Register 2.
Jedes der 32 allgemein verwendbaren Register kann als Basis-Register verwendet werden, nur
Register 0 enthält stets nur Nullen.
Sollen komplizierte Formen der Adressbildung verwendet werden, wie sie Hochsprachen natürlich
anbieten, so muss der Compiler diese Adressierungen unter Verwendung einfacher befehle
nachbilden.
(Damit kann der 64-Bit-MIPS 4000 weniger „eingebaut“ als ein 8051-Mikrocontroller!)
Wegen der relativ einfachen Organisation der Befehlsabläufe ist die MIPS-Architektur (wie schon
die DLX) geradezu dafür prädestiniert, mit einer Pipeline zu arbeiten.
Wir haben an anderer Stelle schon kennengelernt, dass man zur Leistungssteigerung zwei
verschiedene Architektur-Prinzipien verwenden kann:
a) einen superskalaren Aufbau mit mehreren parallel arbeitenden Verarbeitungseinheiten
b) das Super-Pipelining mit tiefen Pipelines.
6
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Im letzteren Fall führt man viele Pipeline-Stufen ein, die aber jede eine nur sehr kurze
Ausführungszeit haben. Entsprechend kann man den Takt „hochdrehen“. Weil dann immer noch
pro Takt jeweils ein Befehl geholt wird, steigt der Durchsatz. Es ist also im Idealfall gleich, ob ich
a) eine superskalare Maschine mit 2 5-stufigen Pipelines und 300 MHz Takt und 2 eingelesenen
Befehlen pro Takt verwende, oder
b) eine super-gepipelinte Maschine mit einer 10-stufigen Pipeline, 600 MHz Takt und einem
eingelesenen Befehl pro Takt baue.
Beim superskalaren Rechner sind die Abhängigkeiten zwischen Befehlen, die in verschiedenen
parallel laufenden Pipelines abgearbeitet werden, ein Problem, das den Prozessor ganz erheblich
ausbremsen kann. Beim Rechner mit einer Super-Pipeline muss man dagegen die Abhängigkeiten
zwischen Befehlen in den einzelnen Stufen verwalten (siehe z. B. Forwarding).
Ganz im Gegensatz zu den Intel-Prozessoren ist die MIPS-R4000 eine Super-Pipeline-Maschine.
Die MIPS R3000-Mschine besitzt einen normale Pipeline. Exemplarisch kann man nun betrachten,
was notwendig ist, um daraus eine Super-Pipeline in der R4000 zu machen.
Die R300 hat folgende Stufen der Phasen-Pipeline:
-
Instruction fetch
Holen der Quell-Operanden aus dem Register-File
ALU-Operation oder Adress-Generierung
Memory-Zugriff
Write back zum Register-File
Das sind genau die Phasen IF, ID, EX, MEM und WB aus der DLX-Maschine. Der Taktzyklus von
60 ns wird nun aufgeteilt in Teilzyklen, die jeweils 30 ns lang sind.
Clock Cycle
φ1
φ2 φ1
IF
φ2 φ1
φ2 φ1
RD
I-Cache
RF
IDEC
ITLB
φ2 φ1
ALU
MEM
ALU OP
D-Cache
DA
φ2
WB
WB
DTLB
IA
(a) Detailed R3000 Pipeline
Cycle
Cycle
ITLB
I-Cache
Cycle
RF
Cycle
ALU
Cycle
DTLB
Cycle
D-Cache
WB
(b) Modified R3000 Pipeline with Reduced Latencies
Cycle
Cycle
ITLB
RF
Cycle
ALU
Cycle
D-Cache
Cycle
TC
WB
(c) Optimized R3000 Pipeline with Parallel TLB and Cache Accesses
Abb. 6.4: Erweiterung der R3000-Pipeline
7
IF
RD
MEM
WB
I-Cache
RF
D-Cache
ITLB
IDEC
IA
DA
DTLB
TC
=
=
=
=
=
=
=
=
=
=
=
=
=
Instruction fetch
Read
Memory access
Write back
Instruction cache access
Fetch operand from register
Data cache access
Instruction address translation
Instruction decode
Compute instruction address
Calculate data virtual address
Data address translation
Data cache tag check
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Die externen Operationen und der Zugriff auf den Cache werden weiter 60ns benötigen wie auch
viele interne Abläufe (Anmerkung: Zeiten auf der Basis einer 1 um CMOS-Technologie von 1991!)
Auch viele interne Operationen benötigen so lange (OP, DA, IA). Allerdings ist die Dekodierung
einer Instruktion schneller und wäre in 30 ns ausführbar. Die Berechnung von Verzweigungsadressen kann aber z. B. überlappend mit einem Register-Zugriff oder einer Befehlsdekodierung
ausgeführt werden. Eine Verzweigung beim Takt i kann also z. B. beim Takt i+2 einen CacheZugriff ausführen. Ein LOAD“ Befehl, der beim Takt i Daten aus dem Speicher holt, kann beim
Takt i+1 damit arithmetische Operationen ausführen. Auch das Ergebnis einer ALU/Shift-Operation
kann man (per forwarding) direkt in der nächsten Operation verwenden. Diese unmittelbare
Kopplung zwischen miteinander logisch verbundenen Operationen ist der Schlüssel für eine schnell
laufende Pipeline.
Der MIPS R4000-Prozessor hatte gegenüber dem R3000:
1. eine reduzierte Zugriffszeit zum Register-File von 30 statt 60 ns
2. wegen on-chip-Caches einen Cache-Zugriff in einem Taktzyklus (60 ns).
Abb. 6.4 a zeigt die Pipeline des R3000 mit weiterer Aufteilung auf 2 Takte.
Systematisch wird die Aufteilung der R3000-Phasen auf die beiden Taktphasen wie folgt betrieben:
Stufe
Phase
Funktion
IF
φ1
Mittels TLB Umsetzung einer virtuellen in eine physische Adresse
(nach Verzweigungsentscheidung)
IF
φ2
Senden der physikalischen Adresse als Befehlsadresse
RD
φ1
Rückgabe Befehl vom Befehls- Cache, Vergleich Tags zur
Validierung des geholten Befehls
RD
φ2
Befehlsdekodierung. Lese Register-File. Wenn Verzweigung,
berechne Zieladresse
ALU
φ1 + φ2
Wenn Register-zu-Register-Operation, arithm. oder log. Operation
wird ausgeführt.
ALU
φ1
Wenn bedingte Verzweigung, Entscheidung ja / nein. Wenn
Memory-Referenz (load / store) Berechnung der virt. Adresse.
ALU
φ2
Wenn Memory-Referenz, Berechnung phys. Adresse via TLB.
MEM
φ1
Wenn Memory-Referenz, sende phys. Adresse zum TLB
MEM
φ2
Wenn Memory-Referenz, hole Daten aus Daten-Cache und prüfe Tags
WB
φ1
Rückschreiben zum Register-File.
Das modifizierte Phasen-Schema ist in Abb. 6.4 dargestellt. Dabei ist zu beachten, dass jetzt die
Phasen nur die halbe Zeit dauern.
Wenn wie beim R4000 die Caches auf dem Chip sind, dann kann die Übersetzung von der
virtuellen zur physischen Adresse den Cache-Zugriff wesentlich behindern. Deshalb versucht man
hier, den Cache bereits über die virtuelle Adresse anzusprechen (virtually indexed caches). Dann
kann man sogar den Cache-Zugrff und die Adress-Übersetzung parallelisieren. Der Check des
Adress-Tags auf Gültigkeit wird separat beim nächsten Zyklus nach dem Cache-Zugriff organisiert.
8
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Die Pipeline-Stufen werden durch Register zur Ablage der Zwischenergebnisse voneinander
getrennt. Jede Pipeline-Stufe arbeitet virtuell bei einem Vielfachen der Basisfrequenz, wobei der
Multiplikator durch die Tiefe der Pipeline bestimmt ist.
Clock Cycle
φ2
IC1
IC2
RF
IC1
IC2
ALU
ALU
DC1
DC2
TC1
TC2
WB
RF
ALU
ALU
DC1
DC2
TC1
TC2
WB
(a) Superpipelined Implementation of the Optimized R3000 Pipeline
IF
IS
RF
EX
IC
DC
DF
DS
TC
Clock Cycle
φ1
IF
φ2
φ1
IS
IF
φ2
φ1
φ2
RF
EX
DF
DS
IS
RF
EX
DF
φ2
φ1
TC
=
=
=
=
=
=
=
=
=
Instruction fetch first half
Instruction fetch second half
Fetch operands from register
Instruction execute
Instruction cache
Data cache
Data cache first half
Data cache second half
Tag check
WB
DS
TC
WB
(b) R4000 Pipeline
Abb. 6.5: Theoretische R3000- und tatsächliche R4000-Pipeline
Abb. 6.4 c zeigt die überarbeitete R3000-Pipeline. Daraus wird (Abb. 6.5) die tatsächliche R4000Pipeline abgeleitet. Für den R4000- Prozessor wurde noch ein neuer, größerer und schnellerer
Addierer entworfen. Damit verdoppelt sich die Geschwindigkeit von ALU-Operationen. Auch die
Geschwindigkeit vom load/store-Operationen wurde nochmals verdoppelt. Damit erhält die R4000Maschine insgesamt eine 8-stufige Pipeline, die also 8 Befehle gleichzeitig enthält. Die Pipeline
wird mit einer Rate von zwei Stufen pro Takt-Zyklus weitergeschoben.
Damit hat die Pipeline jetzt folgende Phasen:
- IF, erste Hälfte: Die virtuelle Adresse wird zum Cache und zum TLB (translation lookasideBuffer) geschickt.
- IF, zweite Hälfte: Der Instruction Cache gibt den Befehlscode aus, und der TLB erzeugt die
physikalische Adresse.
- Register File: Dort können drei Aktivitäten parallel ablaufen:
-- Befehlsdekodierung und Prüfung von Abhängigkeiten vom vorherigen Befehl (interlockconditions),
-- Instruction Cache Tag - Prüfung
-- Operanden aus dem Register-File holen
- Instruction Execute: Dort kann eine der folgenden Aktionen ablaufen:
-- Bei Register-Register-Operationen führt die ALU die arithmetische oder logische Funktion
aus
-- Bei Load/Store-Operationen wird die virtuelle Adresse berechnet
-- Bei Verzweigungs-Operationen wird die Verzweigungs-Zieladresse berechnet, gleichzeitig
wird die Einhaltung der Verzweigungs-Bedingung überprüft.
9
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
-
Data cache first: Die virtuelle Adresse wird an den Daten-Cache (beim Speicher-Zugriff) und
den TLB (für eine Verzweigung) gegeben.
Data cache second: Der Daten-Cache gibt ein Datum aus, ggf. der TLB die physische Adresse
Tag Check: Cache Tag-Checks werden für Load und Store durchgeführt.
Write Back: Rückschreiben ins Register-File.
Als Weiterentwicklung hat MIPs aus der R4000 auch eine super-skalare Maschine entwickelt, die
R10000.
Secondary
Cache
6-Bit Data Paths
6-Bit physische
Reg.-Nummern
Register
Map
Tables
Instr.
PreDecode
5-Bit logische
Reg. Nummern
Instr.
Cache
(32 KB)
Instr.
Decode
Active
and free
Lists
Branch
Instruction
Decode
FP
Register
File
(64*64
5 read
3 write
FP
Queue
(16)
Address
Queue
(16)
Integer
Queue
(16)
Integer
Register
File
64 * 64
7 read
3 write
Instruction Issue
FPAdder
FP
Mult/
Divide
Data
Cache
Addr.
Calc.
Int.
ALU 1
Int.
ALU 2
Pipelined Exec- Units
Abb. 6.6: Architektur des MIPS R-10000 Prozessors
Am Beispiel dieses Prozessors kann man die Eigenschaften der superskalaren Architektur recht
hübsch sehen. Der Prozessor holt zunächst pro Takt vier neue Befehle.
Für die meisten superskalaren Architekturen hat sich die initiale Befehlsdekodierung als ein echter
Engpass herausgestellt. Deshalb wird schon auf dem Weg vom Secondary Chache zum first-levelCache eine Art Vor-Dekodierung durchgeführt. Diese Vor-Dekodierung erkennt bereits den Typ
des jeweiligen Befehls und gibt ihm eine Art "Kennung" mit, betreffend die Ausführungseinheit,
welche der Befehl nachfolgend benötigen wird.
Zunächst werden also vier Befehle parallel geholt und vor-dekodiert. Wenn ein bedingungsfreier
Verzweigung- oder Sprungbefehl erkannt wird, so wird das Ziel als Adresse in den Befehls-Cache
zurückgeführt, um den Befehlszähler (PC) entsprechend zu setzen. Bei bedingten
Verzweigungsbefehlen führt die Dekodiereinheit eine Verzweigungs-Voraussage durch. Dabei wird
ein 2-Bit-Schema zur Abspeicherung der "History" von Verzweigungen benutzt. (Wir erinnern uns:
die Verzweigungsvorhersage wurde für eine bestimmte Anweisung dann geändert, wenn man
zweimal nacheinander falsch geraten hatte). Die dann folgende Stufe verwaltet die Register-Namen:
Durch die vierfach parallele Ausführung von Befehlen kann es dazu kommen, dass Register, die der
Compiler für zwei nacheinander ablaufende Befehle allokert hatte, nun plötzlich doppelt belegt
sind. Diese Konfliktfälle muss die Funktionseinheit für die Register-Zuweisung erkennen und durch
das Umbenennen von Registern lösen. Und der jeweilige Status der Register (belegt, frei,
umbenannt ) ist in speziellen Listen mitzuführen und dauernd zu aktualisieren. Für den Compiler
existiert eine 5.-stellige Kennzeichnung der verfügbaren Register, mit zusätzlichen SchattenRegistern wird daraus eine 6-stellige Kennung für die physikalische Register-Zuweisung. In dieser
Stufe werden auch falsch erkannte Daten-Abhängigkeiten erkannt und beseitigt.
10
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Nach der Dekodierung plaziert der Prozessor einen Befehl je nach Art n einer von drei
Warteschlangen, wobei jede Warteschlange bis zu 16 Befehle aufnehmen kann. Wenn ein Befehl in
die Schlange eingerückt ist, so wird sein Ziel-Register für "besetzt" erklärt und kann nicht wieder
freigegeben werden, bis der Befehl abgearbeitet und das Ergebnis sicher verstaut ist. Für die
Warteschlangen der Integer- und Float-Befehle arbeiten diese "reservation stations" nicht einfach
als Warteschlangen nach dem FIFO-Prinzip, sondern die Befehle können auch "out of order"
entnommen werden. Die Steuerung erfolgt über die "reservation bits". Die Warteschlangen für die
Adressbildung werden allerdings nach dem FIFO-Verfahren administriert.
Für die Integer- und die Float-Berechnung existieren getrennte Register-Bänke mit jeweils 64
physikalischen Registern. Die Ausführungseinheiten lesen direkt aus diesen Registern und
schreiben auch direkt dorthin zurück. Die Maschine hat insgesamt 5 Ausführungseinheiten: Eine
zur Adressberechnung, zwei Integer-ALUs, einen Fließkomma-Addierer (und Subtrahierer), und
eine Einheit zur Fließkomma-Multiplikation und - Division. Beide Integer-ALUs können addieren ,
subtrahieren und logische Operationen ausführen. ALU 1 kann auch Bitshift-Operationen. Dagegen
kann ALU2 auch Multiplikationen und Divisionen für Integer-Zahlen.
6.3
Die SPARC Prozessor-Familie
SPARC ist die Abkürzung für "scalable processor architecture". Diese Architektur beruht stark auf
den RISC-Maschinen der UC Berkeley und verwendet auch deren Register-Fenster-Technologie.
Jedes Fenster besteht aus 24 Registern, die Anzahl der verfügbaren Fenster variiert zwischen den
einzelnen Implementierungen von 2 bis 32. Typisch sind 8 Fenster mit insgesamt 136 Registern.
Noch höhere Fenster-Zahlen bringen erfahrungsgemäß keinen wesentlichen Fortschritt mehr. Die
physikalischen Register mit den Nummern 0 bis 7 sind für globale Variablen vorgesehen und
werden von allen Prozeduren und Unterprogrammen gemeinsam genutzt.
Physische
Register
135
..
Ins
128
127
.. Locals
120
119 Outs/
..
112 Ins
Logische Register
Procedure A
R31C
..
Ins
R23C
.. Locals
R16C
R15C
.. Outs
R8C
R31C
..
Ins
R24C
R23C
.. Locals
R16C
R15C
R31C
..
Outs
R8C
96
95
.. Locals
88
87
..
Outs
80
Globals
Procedure C
R24C
111
.. Locals
104
103
.. Outs/Ins
7
..
0
Procedure B
Ins
R24C
R23C
.. Locals
R16C
R15C
Outs
R8C
R7
..
R0
Globals
R7
..
R0
R7
..
R0
Globals
Globals
Abb. 6.7: SPARC Register Window Layout mit Three-Prozeduren
11
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Jeder Prozess sieht lokale Register mit den Nummern 0 bis 31. Die logischen Register mit den
Nummern 24 bis 31, als „inns“ bezeichnet, sind jeweils gemeinsam mit einer aufrufenden Prozedur
(Eltern-Prozess) benutzt, die Register 0 bis 8, auch als „outs“ bezeichnet, werden jeweils mit einer
aufgerufenen (Kind-) Prozedur gemeinsam benutzt. Diese beiden Abschnitte sind überlappend mit
anderen Fenstern angelegt. Die Register 16 bis 23 werden als „locals“ bezeichnet und werden nicht
gemeinsam von mehreren Prozeduren benutzt, sondern dienen der Speicherung der für ein
Unterprogramm jeweils lokalen Variablen.
Der Prozessor unterhält einen „current window pointer (CWP) im Prozessor-Statusregister (PSR),
der auf die aktuell ausgeführte Prozedur zeigt. Darüber hinaus gibt es eine „Window invalid mask“
(Maske für ungültige Fenster), ebenfalls im PSR abgespeichert, welche ungültige Fenster
verzeichnet.
Mit derartig vielen Registern ist es normalerweise nicht notwendig, bei Prozedur-Aufrufen und
-Rücksprüngen Register-Inhalte im Speicher zwischenzulagern bzw. zurückzuholen. Da ein
Compiler die Arbeit der Register-Übergaben bei Aufrufen und Rücksprüngen weitestgehend von
der Prozessor-Architektur abgenommen bekommt, werden auch die Compiler selbst einfacher.
Der Befehlssatz des SPARC-Prozessors enthält fast ausschließlich Befehle, die sich auf RegisterInhalte beziehen. Register-zu Register-Befehle haben eine typische Form der Art:
Rd <- Rs1 op S2.
Dabei sind Rd (destination-register) und Rs1 (first source register) stets Register-Namen, dagegen
kann S2 ein Register oder ein 13-Bit-Immediate-Operand aus dem Befehlscode sein.
Die verfügbaren ALU-Operationen kann man wie folgt kennzeichnen:
-
Integer-Addition (mit oder ohne carry)
Integer-Subtraktion (mit oder ohne carry)
Bit-weise Boolesche Operationen AND, OR, XOR und deren Negationen
Schiebebetrieb logisch links / rechts oder arithmetisch rechts.
Alle diese Befehle, bis auf die Shift-Operationen, können optional die vier Bedingungs-Codes
setzen: ZERO (gleich null), NEGATIVE, OVERFLOW, CARRY. Integer-Zahlen werden als 2erKomplement in 32 Bit Größe dargestellt.
Das Memory wird nur über einfache LOAD- und STORE-Befehle angesprochen. Es gibt dabei
separate LOAD/STORE-Befehle für Worte (32 Bits), Doppelworte (64 Bit), Halbworte (16 Bit) und
Bytes (8 Bit). Halbworte oder Bytes kann man mit speziellen befehlen entweder mit oder ohne
Vorzeichen laden. Bei Laden mit Vorzeichen wird da höchstwertige (Vorzeichen-) Bit vervielfacht,
um die 32-Bit-Registergröße auszufüllen (Vorzeichen-Erweiterung).
Adressierungen sind nur über Register-Inhalte als Adressen oder über sogenannte „Displacements“
möglich. Das heisst, dass die effektive Adresse eines Operanden auch relativ zu einer Adresse
gebildet werden kann, die in einem Register steht. Das geht wieder mit 2 Registern oder mit
Register plus Immediate:
EA = (RS1) + S2
(Register-Inhalt plus Immediate)
EA = (RS1) + (RS2) (Register-Inhalt plus Register-Inhalt).
Für einen LOAD/STORE-Vorgang wird jeweils an den normalen Befehlszyklus eine Extra-Phase
angehängt. Zunächst wird mittels der ALU die Adress-Berechnung durchgeführt, eine Takt-Phase
später erfolgt die eigentliche LOAD/STORE-Operation. Tatsächlich kann man mit den einfachen
Adressierungsmodi der SPARC-Architektur komplexere Operationen gut nachbilden.
12
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Tabelle 6.1: Befehlssatz des SPARC-Prozessors
OP
Description
OP
Load /Store Instructions
Description
Arithmetic Instructions
LDSB
Load signed byte
ADD
Add
LDSH
Load signed halfword
ADDCC
Add , set icc
LDUB
Load unsigned byte
ADDX
Add with carry
LDUH
Load unsigned halfword
ADDXCC
Add with carry , set icc
LD
Load word
SUB
Subtract
LDD
Load doubleword
SUBCC
Subtract , set icc
STB
Store byte
SUBX
Subtract with carry
STH
Store halfword
SUBXCC
Subtract with carry
STD
Store word
MULSCC
Multiply step , set icc
STDD
, set icc
Jump /Branch Instrucitons
Store doubleword
Shift Instrucitons
BCC
Branch on condition
SLL
Shift left logical
FBCC
SRL
Shift right logical
CBCC
Branch on floating -point
condition
Branch on coprocessor
condition
SRA
Shift right arithmetic
CALL
Call procedure
Boolean Instructions
JMPL
Jump and link
AND
AND
TCC
Trap an condition
ANDCC
AND, set icc
SAVE
Advance register window
ANDN
NAND
RESTORE
Move windows backward
ANDNCC
NAND, set icc
RETT
OR
OR
Return from trap
Miscellaneous Instructions
ORCC
OR, set icc
SETHI
Set high 22 bits
ORN
NOR
UNIMP
Unimplemented
(trap )
ORNCC
NOR, set icc
RD
Read a special register
XOR
XOR
WR
Write a special register
XORCC
XOR, set icc
IFLUSH
Instruction cache flush
XNOR
Exclusive NOR
XNORCC
Exclusive NOR, set icc
instruction
Interessant ist die Adressbildung beim SPARC-Prozessor im Vergleich mit der MIPS-Architektur:
MIPS verwendet ein 16-Bit-Offset (13 Bit beim SPARC). MIPS erlaubt es aber nicht, eine Adresse
aus dem Inhalt von 2 Registern zu berechnen.
2
Call Format
Branch
Format
SETHI
Format
FloatingPoint
Format
General
Formats
30
Op
PC-Relative Displacement
2 1
4
3
Op a Cond Op2
2
5
Op Dest
3
Op2
2
Op
5
Dest
6
Op3
2
Op
5
Dest
6
Op3
Op
Dest
22
PC- relative Displacement
22
Immediate Constant
5
Src-1
Op3
5
Src-1
Src-1
9
FP-op
1
0
1
8
ignored
5
Src-2
5
Src-2
Immediate Constant
Abb. 6.8: SPARC-Befehlsformate
13
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Wie der MIPS R4000 verwendet auch die SPARC-Architektur einen einfachen Satz von 32-BitBefehlsformaten. Jeder Befehl beginnt mit einem 2-Bit-Opcode. Da dieser zur Klassifizierung der
Operation allein nicht ausreicht, gibt es in vielen Fällen eine weitere OP-Code-Sektion irgendwo im
Befehlswort. Für den CALL-Befehl wird das 30-Bit-Immediate mit 2 0-Bits rechts aufgefüllt und
bildet dann eine relative 32-Bit-Adresse im Zweier-Komplement. Da Adressen alle auf eine 32-BitGröße ausgerichtet werden, wird damit die Adresse passend gemacht.
Der Verzweigungsbefehl enthält ein 4-Bit-Feld für die Verzweigungsbedingung, dass dem Standard
für Bedingungs-Codes entspricht. Damit kann jede Kombination von Verzweigungsbedingungen
geprüft werden. Die 22 Bit breite PC-relative Adresse wird wiederum rechts um 2 0-Bits erweitert,
um eine richtige Adresse im 24-Bit-Format (2er-Komplement) zu bilden.
Ein ungewöhnliches Feature des Verzweigungsbefehls ist das annul-Bit a. Wenn dieses Bit nicht
gesetzt ist, wird der Befehl nach der Verzweigung immer ausgeführt, unabhängig davon, ob die
Verzweigung stattfindet oder nicht. Dies ist die typische „Delayed Branch Operation“, die bei
verschiedenen RISC-Maschinen üblich ist. Wenn dagegen das annual Bit gesetzt ist, dann wird nur
im fall der tatsächlichen Verzweigung dieser Befehl noch ausgeführt. Der Prozessor unterdrückt
den Effekt dieses Befehls, auch wenn er sich schon in der Pipeline befindet.
Technisch macht diese Verfahren Sinn, weil in mehr als 50% der Fälle die Verzweigungsbedingung
erfüllt ist. Die SETHI-Instruktion ist ein spezieller Befehl zum Laden oder Speichern eines 32-BitWertes. Damit werden vor allem Adressen und lange Konstanten abgespeichert. Die SETHIOperation setzt die 22 höherwertigen Bits eines Registers mit dem 22-Bit-Immediate-Operanden
und füllt die 10 niederwertigen Bist mit Nullen auf. Es ist auch möglich, eine Immediate-Konstante
von bis zu 13 Bit Länge zu definieren und damit die übrigen 10 Bits des Registers zu füllen.
Um den Inhalt einer Speicherzelle K im Memory in ein Register r8 zu laden, würde man folgende
Befehle verwenden:
sethi %hi(K), %r8
ld
; lädt die höherwertigen 22 Bits einer Adresse K ins Register r8
[%r8 + %lo(K) ]
; lädt den Inhalt der Adresse K ins Register r8
Die Makros %hi bzw. %lo werden verwendet, um Immediate-Operatoren zu definieren, die sich aif
spezielle Bit-Adressen beziehen. Der SETHI-Befehl entspricht in etwa dem LUI-Befehl der MIPSArchitektur.
Für Floating-Point-Operationen stehen Befehle mit 2 Quelloperanden und einem Zieloperanden zur
Verfügung. Alle anderen Operationen einschließlich LOAD, STORE, arithmetischen und logischen
benutzen wenigstens eines der letzten 2 Formate in Abb. 6.8. Eines der Formate benutzt zwei
Quellregister und ein Zielregister, das andere benutzt nur ein Quellregister, einen 13-BitImmediate-Operanden und ein Zielregister.
6.3.1 Die Ultra SPARC II
Diese Maschine ist eine superskalare Weiterentwicklung des SPARC-Prozessors. Sie hat denselben
Befehlssatz und dieselbe RISC-Architektur, auch dieselbe große Zahl von Registern und RegisterFenstern. Wie auch sonst üblich speist ein externer L2-Cache separate L1-Befehls- und DatenCaches. Die Prefetch- und Dispatch-Unit (PDU) füttert die geholten befehle in einen
Zwischenspeicher, der bis zu 12 Befehle beinhaltet. Die PDU ist auch zuständig für die
Verzweigungsvorhersage, wobei eine Verzweigungstabelle (Branch Hostory Table) mit einem 2Bit-Schema zur Kennzeichnung der „History“ verwendet wird. Die PDU enthält auch ein Modul,
das einlaufende Befehle in Gruppen von bis zu vier Befehlen sortiert, welche potentiell parallel
ausführbar sind.
14
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
External (L2)
Cache Controller
Instruction
Cache
Instruction
Buffer
Grouping
Logic
Data Cache
Prefetch
und
Dispatch
Unit
Integer
Execution
Unit
Float . Point
Execution
Unit
Integer Register
File
Float . Point
Register File
ALU
FP
ALU
ALU
FP
ALU
Load -Store
Unit
Load
Store
Queue Queue
Graph.
Unit
Abb. 6.9: Block-Diagramm der Ultra SPARC II - Architektur
Die Integer-Einheit enthält zwei komplette ALUs und acht Register-Fenster. So vorhanden werden
stets zwei Integer-Befehle parallel ausgeführt. Die Fließkomma-Einheit enthält entsprechend 2
Gleitkomma-ALUs und eine Graphik-Einheit. Dies ermöglicht die Ausführung von zwei
Gleitkomma-Befehlen parallel, alternativ dazu können parallel ein Fließkomma- und ein GraphikBefehl ausgeführt werden. Wie auch beim Intel Pentium gibt es bei SPARC eine Erweiterung des
Befehlssatzes für Graphik-relevante Operationen, den sogenannten „visual instruction set“ (VIS).
Die Load/Store-Unit (LSU) erzeugt die virtuellen Adressen für alle Load- und Store-Operationen
und unterstützt eine solche Operation pro Befehlszyklus. Im Zusammenwirken mit der Load-Queue
können aber bis zu 8 Store-Befehle, die sich auf denselben 8-Bit-Adressraum beziehen, in einer
einzigen L2-Cache-Adresse komprimieren.
Execute Cache
N1
N2
Integer-Pipeline
N3
Write
Fetch Decode Group
R
X1
X3
X2
Floating Point- and Graphics Pipeline
Abb. 6.10: Befehlspipeline der Ultra SPARC II-Architektur
Die Ultra SPARC II verwendet eine neunstufige Phasen-Pipeline, die sich in einen Integer- und
einen Float/Graphic-Zweig aufspaltet. Für einen Integer-Befehl werden die folgenden PipelineStufen verwendet:
15
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
-
-
Fetch: es werden bis zu vier Befehle gleichzeitig aus dem Instruction-Cache geholt. Auch die
Verzweigungsvorhersage wird hier ausgeführt
Decode: Diese Stufe dekodiert befehle und plaziert sie im Befehls-Puffer (instruction buffer)
Group: Diese Stufe wählt simultan bis zu vier Befehle aus dem Befehlspuffer zur simultanen
Ausführung aus. Davon können 2 Fixkomma- und zwei Gleitkomma-Befehle sein.
Execute: Die zwei Integer-ALUs greifen auf den Register-File zu und führen Integer-Befehle
aus. Diese Stufe berechnet auch virtuelle Adressen für Load/Store-Operationen.
Cache: Hier wird festgestellt, ob eine berechnete Adresse im Cache zu einem „hit“ oder einem
„miss“ führt. ALU-Operationen aus der Execute-Stufe können hier Bedingungs-Code
generieren. Damit erfolgt ein Zugriff auf die Prefetch- und Dispatch-Einheit, um vorherige
Verzweigungsvorhersagen zu prüfen. Wenn es falsche Vorhersagen gibt, dann werden frühere
(schon geholte) Befehle in der Pipeline gelöscht.
N1: Wenn sich ein Cache-Miss ereignet hat, dann muss der Befehl in die Load/StoreWarteschlange eingeordnet werden, um auf den L2-Cache oder den Hauptspeicher zuzugreifen.
N2: Diese Stufe ist einfach eine Wartephase auf die Fließkomma-Pipeline.
N3: Hier werden Traps (Ausnahme-Bedingungen) aufgelöst.
Write: Alle Ergebnisse werden in die Register zurückgeschrieben.
Die Fließkomma-Pipeline teilt die ersten drei und die letzten 2 Stufen der Integer-Pipeline.
Die vier Stufen, die nur zur Fließkomma-Pipelinie gehören, sind:
-
R: Hier werden Fließkomma- und Gpaphik-Befehle erst endgültig dekodiert und der Zugriff auf
die Register ausgeführt.
X1: Die Gleitkomma- und Graphik-Befehle beginnen mit der Ausführung
X2:Weiterführung
X3: Weiterführung.
Die neuesten Versionen des SPARC-Prozessors, die Ultra-SPARC III, verwendet eine 64-BitArchitektur und besitzt damit nochmals eine höhere Fließkomma-Leistung.
6.4
Die Power-PC-Familie
6.4.1 Die Power-PC-Grundarchitektur
Die Power-PC-Architektur stammt aus einer Allianz der Firmen IBM, Motorola und Apple aus dem
Jahr 1992. Sie wurde auf der Grundlage von IBMs eigener POWER (Performance Optimization
With Enhanced RISC) Architektur, zu der z. B. der RS /6000 Prozessor gehört, entwickelt. Die
Power PC-Architektur ist mit IBMs Power-Architektur für Workstations binärkompatibel.
Erweiterungen betreffen die Erweiterung auf 64 Bit, die superskalare Implementierung, die
Befehlsausführung außer der Reihenfolge und den Einsatz in Multi-Prozessor-Systemen.
Die POWER-Architektur von IBM verfügt über einen Satz von 184 Basisbefehlen.
Obwohl als RISC bezeichnet, kann man eigentlich nicht von einem auf die Magerstufe reduzierten
Befehlssatz reden, so dass hier insgesamt eine sehr komplexe Kontrollogik zu implementieren war.
Die Power-PC-Architektur definiert zunächst drei Verarbeitungseinheiten, die parallel zueinander
operieren können:
-
eine Verzweigungseinheit (Branch Processing Unit, BPU)
eine Festpunkteinheit (Fixed Point Unit, FXU)
eine Gleitkommaeinheit (Floating Point Unit, FPU).
Im Konzept für diese Architektur sind jeweils mehrere parallel arbeitende Einheiten zulässig. Die
bisherigen Power-PC-Implementierungen verwenden aber alle nur eine BPU, eine FPU, und eine
bis zu drei FXUs.
16
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Eine Verzweigungseinheit ermöglicht es, manche Verzweigungsbefehle parallel zu den Befehlen
der anderen Einheiten auszuführen. Die Verzweigungseinheit enthält drei auch extern steuerbare
Verzweigungsregister:
Ein sogenanntes Link-Register für die Zusammenarbeit von Verzweigungen mit Unterprogrammen, ein Zählregister (count register) für die Implementierung von Schleifen, und ein Bedingungsregister (condition register) für die Koordinierung von Verzweigungen.
256
Instruction Queue und Dispatch Logik
32
Branch
Processor
Unit (BPU)
Instruction
Fetch
Unit
Cache Tags
32
Sequncer
Unit
32
Reservation
Station(2)
Fixed
Point
Unit
Floating
Point
Unit (FPU)
Memory
Managment
Unit
(MMU)
64
32
32 kByte Cache
32
256
Memory Queue und Bus Interface
32 Bit
Adressen
64 Bit
Daten
Abb. 6.11: Power PC 601-Architektur
Die Festkommaeinheit hat 32 Register von jeweils 32 Bit Breite, die Gleitkommaeinheit besitzt 32
Register von jeweils 64 Bit Breite für die Verarbeitung mit doppelter Genauigkeit. Wie diese
Einheiten im Detail implementiert werden (z. B. GK-Operationen in HW oder SW) legt die
Basisarchitektur nicht fest.
Für die Bitbreiten gibt es ein paar verbindliche Festlegungen:
Die 32-Bit-Version definiert 32 Bit logische Adressen und eine Breite von 52 Bit für virtuelle
Adressen. Physikalische Adressen und allgemeine Register sind 32 Bit breit. Es gibt aber auch eine
vordefinierte Version mit 64 Bit logischen Adressen, 80 Bit virtuellen Adressen, 64 Bit breiten
physikalischen Adressen und insgesamt 64 Bit breiten allgemeinen Registern.
Wie schon bei den Intel-Prozessoren wird die Adressbildung auch hier über eine Segmentierung
und eine nachgeschaltete Seiteneinheit durchgeführt. Es existiert eine speicherresidente Seitentabelle und außerdem ein "Translation-Lookaside-Buffer " (TLB). Die Seitengröße liegt bei 4
KBytes. Für die Administration des Speichers kann man Blöcke in einer Größe zwischen 128
KBytes und 256 MBytes vorsehen. Die Konsistenz zwischen Hauptspeicher und Cache wird nicht
permanent (Write-Through), sondern nur punktuell (Write-Back) vorgesehen. Die Konsistenzsicherung erfolgt also punktuell und wahlweise durch den Systemprogrammierer.
Der Cache kann mit speziellen Befehlen direkt manipuliert werden.
17
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Bekannt geworden sind im wesentlichen vier Versionen der Power-PC-Familie:
Der Power PC 601 als 32-Bit-Basis-Modell und der davon abgeleitete PC 603 für Notebooks
machten ab 1993 den Anfang. Der PC 604 stellt das 32-Bit- Spitzenmodell dar und findet sich in
PCs und IBM-Server-Maschinen, teilweise als Teil von Mehrprozessorsystemen. Der im Oktober
1994 angekündigte 64-Bit-breite Power PC 620 ist die "high-end"-Version für Server und
Workstations. Zunächst waren intern mit 80 oder 100 MHz getaktete Versionen verfügbar,
inzwischen gibt es Versionen, die intern mit 200 MHz oder mehr getaktet sind.
6.4.2 Der Power-PC-601
Der Power PC 601 als "kleinstes" Mitglied der Familie besitzt bereits eine superskalare Struktur
und kann bis zu drei Befehle parallel ausführen.
Der Speicherzugriff erfolgt nach außen 64 Bit breit. Zwischen Bus-Puffer (Memory Queue) und
internem (1st Level-) Cache sowie zwischen Cache und Befehlspuffer (Instruction Queue) gibt es
einen 256 Bit breiten Bus.
Für die Steuerung des Einschreibens von Befehlen vom Cache in den Befehlspuffer ist die
Instruction Fetch Unit (Befehlsbereitstellungseinheit) zuständig. Die Adressen von zu holenden
Befehlen werden von mehreren Einheiten erzeugt. Die Verzweigungseinheit erzeugt Adressen, die
aus Verzweigungsbefehlen resultieren. Die Sequenzereinheit erzeugt dagegen Befehle, die aus
Interrupts und ähnlichen Ereignissen resultieren. Die Instruction Fetch Unit erzeugt dann, wenn
keine anderen Einheiten mit Befehlsadressen einspringen, die nächste Befehlsadresse durch
Fortzählen des Befehlszählers. Die Adresse wird zur Arbitrierungslogik des Cache weitergereicht,
die erkennt, dass ein Zugriff auf Befehle (oder, in anderen Phasen der Ausführung, Daten) erfolgt.
Die IF-Unit erhält dann den jeweils nötigen Befehl. Die IF-Unit benötigt, bis die physikalische
Adresse des nächsten Befehls bekannt ist, in der Regel eine vierstufige Adressübersetzung.
Um hier unnützen Aufwand zu sparen, enthält ein sogenanntes "Translation Shadow Array" (TSA)
die letzten vier Befehlsübersetzungen. Im Fall eines Fehlzugriffs dagegen gibt es eine Verzweigung
zur Memory-Management-Unit (MMU) und eine Aktualisierung des TSA.
Die Befehlszuordnungseinheit (Instruction Queue) hat einen Puffer für 8 Befehls, die parallel und
gleichzeitig aus dem Cache geladen werden können. Jeweils in einem Takt werden die untersten
vier Befehle auf Abhängigkeiten untersucht und davon maximal drei den Ausführungseinheiten
weitergereicht. Das funktioniert jedoch nur, wenn drei passende Befehle auch gerade vorhanden
sind: Ein Festkommabefehl, ein Gleitkommabefehl und ein Verzweigungsbefehl. Gleitkommabefehle und die meisten Verzweigungsbefehle können von jeder der vier Plätze in der Schlange
zugeordnet werden, Festkommabefehle dagegen nur vom untersten Speicherplatz aus. Gleitkommabefehle mit Speicherzugriff belegen sowohl die Gleitkommaeinheit als auch die Festkommaeinheit
für die Adressberechnung.
IQ
IQ
IQ
IQ
IQ
IQ
IQ
IQ
vom
Cache
256
7
6
5
4
3
2
1
0
32
Festkom m a
(FXU) Befehl
D ispatchLogik
32
G leitkom m a(FPU) Befehl
32
Verzweigungsbefehl (Branch)
Abb. 6.12: Befehlszuordnungseinheit beim Power PC 601
18
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Wenn ein Festkommabefehl am unteren Ende der Warteschlange noch warten muss, weil z. B. ein
Pipeline-Konflikt aufgetreten ist, dann kann trotzdem mit der Ausführung von darüberstehenden
FPU- oder Branch-Befehlen begonnen werden. Der Prozessor führt also durchaus Befehle
außerhalb der normalen Reihenfolge durch ("out of order"). Nach der Ausführung der Befehle
müssen die Ergebnisse aber durch einen speziellen Mechanismus (Tagging- und Zählmechanismus)
in der richtigen Reihenfolge zurückgeschrieben werden.
Die Verzweigungseinheit (Branch Processing Unit - BPU) benötigt für die Ausführung von
Verzweigungsbefehlen zwei Pipelinestufen. Zunächst wird der Verzweigungsbefehl bereitgestellt.
Dann, in der zweiten Stufe, wird er der Verzweigungseinheit zugeschoben, dekodiert und, so
möglich, bereits ausgewertet oder eine Sprungvorhersage ermittelt. Im nächsten Takt können dann
die folgenden Befehle aus dem Cache in den Puffer geladen werden. Unbedingte und auf den
Befehlszähler bezogene Sprünge können in dem Takt, in dem sie eingelesen werden, auch
ausgewertet werden. Es ergibt sich keine Verzögerung folgender FK- oder GK-Befehle.
Andere bedingte Sprünge sind bezogen auf den Inhalt des Bedingungsregisters definiert. Ein
bedingter Sprungbefehl wird als "resolved" bezeichnet, wenn feststeht, ob die Sprungbedingung
erfüllt ist, d. h. ob an der Sprungadresse fortgefahren wird oder an der sequentiellen Befehlsadresse.
Der Power PC 601 besitzt ein sogenanntes Bedingungsfeld, also einen Satz von 8 Registern, das
bezüglich Verzweigungen und Sprünge auszuwertende Bedingungen enthält. Die einzelnen Zellen
in diesem "Bedingungsfeld" besitzen jeweils zugeordnete sogenannte "Interlock-Bits". Falls das
Bedingungsfeld in Zustand "non-interlocked" ist, kann die Bedingung ausgewertet und danach der
Sprung ausgeführt oder nicht ausgeführt werden.
Im Zustand "interlocked" wird eine statische Sprungvorhersage durchgeführt.
Dabei wird angenommen, dass der Sprung durchgeführt wird, wenn der Displacement-Anteil der
Zieladresse negativ ist, andernfalls wird der Sprung nicht ausgeführt. Diese Entscheidung wiederum
wird durch ein spezielles Bit im Opcode des Verzweigungsbefehls gesteuert. Wird es umgesetzt
(durch den Compiler), so wird auch die obige Sprung-Vorhersage-Bedingung umgekehrt.
Befehle, die aufgrund einer spekulativen Sprungvorhersage aus dem Cache geholt wurden, werden
entsprechend annotiert. Sie werden nicht ausgeführt, bevor die Korrektheit der Voraussage ermittelt
ist.
Die Ermittlung der Korrektheit der Voraussage ist erst nach Freigabe des BedingungsregisterInterlocks möglich. Falls die Vorhersage falsch war, werden alle falsch geholten Befehle gelöscht
und neue Befehle geladen.
Für diesen Fall, dass eine falsche Voraussage zu reparieren ist, besitzt der Power PC ein paar
spezielle Features.
-
Die Anfangsadresse des zunächst nicht gewählten Befehlsstroms wird in der CPU zwischengespeichert und kann damit schnell aufgesucht werden
-
Die Festkommaeinheit übergibt die Ergebnisse von Bedingungsberechnungen für Verzweigungen und Sprünge gleichzeitig an die Verzweigungseinheit und das Bedingungsregister.
Dadurch ist die schnelle Auflösung von Bedingungen, welche den Zustand "unresolved" haben,
möglich.
-
Der Befehlspuffer wird zunächst mit dem "kontinuierlichen" Befehlsstrom geladen.
Ist nun eine Verzweigung vorausgesagt, aber noch nicht beweisen, so müssen zunächst die
spekulativ richtigen "neuen" Befehle geholt werden. Durch Optimierung der wichtigsten
Vergleichsbefehle kann deren Ergebnis aber durchaus vorliegen, bevor die spekulativ geholten
Befehle geladen sind. Hat sich die Voraussage als falsch herausgestellt, dann sind in solchen
Fällen die "unerwartet richtigen" Befehle noch verfügbar.
19
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Die Festpunkteinheit erhält ihre Befehle von der Zuordnungseinheit. Sie enthält auch die
Hauptpipeline, von welcher wiederum die Synchronisationssteuerung für präzise InterruptArbeitung abhängt. Die Befehle werden in vier Stufen abgearbeitet:
-
Befehl holen
Befehl zuordnen und dekodieren
Befehl ausführen
Rückschreiben in Register.
Pipelinekonflikte werden allen durch Hardware erkannt und, notfalls durch Einfügung von
Leeroperationen (Pipelinestalls). Alle Festkommabefehle werden durch Hardwareeinheiten
ausgeführt. Dabei benötigen Befehle komplexerer Art (Multiplikation, Division) durchaus mehrere
Takte in der Ausführungsstufe.
Zur Auflösung von Pipelinekonflikten kann ein in der Rückschreibestufe vorhandenes Ergebnis
wahlweise auch an alle Funktionseinheiten gegeben werden (forwarding). Ergebnisse von
Vergleichsoperationen werden direkt an die Verzweigungseinheit weitergegeben. Die Festkommastufe führt die Adressberechnung für alle Lade- und Speicherbefehle durch, d. h. auch für Gleitkommabefehle. Ein direkt auf einen Loadbefehl folgender und von diesem abhängiger Befehl
bewirkt eine Verzögerung von einem Takt. Es existiert keine separate Einheit für die Durchführung
von Load/Store-Operationen.
Die Gleitkommaeinheit ist nach dem IEEE-Standard für einfache und doppelte Genauigkeit
konstruiert. Sie unterstützt auch spezielle Doppelbefehle der IBM-Power-Architektur und den
Kombinationsbefehl "Multiplikation mit anschließender Addition". Die Pipelinestufen beinhalten:
-
Befehl dekodieren
erste Ausführungsstufe
zweite Ausführungsstufe
Rückschreiben in ein Register.
Die Dekodierstufe enthält Gleitpunktregister für 32 Doppelworte (64 Bit breit), die Dekodierlogik
und die Steuerung für die Gleitkommapipeline.
Die erste Ausführungsstufe enthält ist für die Multiplikation zuständig, die zweite für Additionen.
Diese speichert und bearbeitet auch Zwischenergebnisse aus der Multiplikation. Die letzte Stufe
rundet, so notwendig, das Ergebnis vor dem Rückschreiben. Hier werden also quasi 2
Pipelinestufen zusammengefasst.
Die Gleitkommapipeline ist so organisiert, dass alle Operationen mit einfacher Genauigkeit bis auf
die Division mit einem Pipelinedurchlauf abzuarbeiten sind, also in insgesamt nur vier Takten.
Von den Operationen mit doppelter Genauigkeit benötigen Addition und Subtraktion einen
Pipelinedurchlauf, bei der Multiplikation mit doppelter Genauigkeit und bei der Division stets
werden zwei Pipelinedurchläufe benötigt.
Bei der Division werden sogar 17 Takte für Zahlen mit einfacher Genauigkeit und 31 Takte für
Zahlen mit doppelter Genauigkeit benötigt.
Die Gleitkommaeinheit arbeitet parallel zur Festkommaeinheit, ein nebenläufiger Betrieb ist die
Regel. Bei Gleitkommaspeicherbefehlen arbeiten beide Piplelines kooperativ, d. h. die FK-Pipeline
berechnet die Adressen, die GK-Pipeline führt die arithmetischen Operationen aus.
Die Sequenzer-Einheit ist eine Art Hilfsprozessor für Startphasen, also für die Organisation von
Befehlsabläufen beim Start-Up und nach RESETs. Dazu gehören Selbsttestfunktionen, z. B. für den
Cache, und das Initialisieren von Speicherzellen und der Systemuhr. Die Sequenzer-Einheit
initialisiert auch die Tabellen für Adressübersetzungen und die Speicherzugriffsbits.
20
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Die Speicherverwaltungseinheit (Memory Management Unit-MMU) besorgt die Übersetzung von
logischen in physikalische Adressen, und zwar sowohl für das Einlesen von Befehlen als auch für
den lesenden / schreibenden Speicherzugriff.
Über eine Arbitrierungslogik wird für jeden Takt entschieden, ob die Festkomma- oder die
Befehlsbereitstellungseinheit die MMU benutzen darf, da der Speicherzugriff für das Einlesen von
Befehlen oder für das Lesen / Schreiben von Daten benötigt wird.
Das TSA (translation shadow array) ist speziell für die schnelle Dekodierung von Befehlsadressen
vorgesehen. Es enthält die letzen vier Befehlsadressübersetzungen und führt einen assoziativen
Vergleich mit zu holenden Befehlsadressen durch. Meistens kann man damit die nächste
Befehlsadresse schnell bilden, ohne MMU nutzen zu müssen.
Die Adressbildung wird auf der Ebene von Segmenten, Seiten und Speicherblöcken unterstützt. Für
das Paging existiert ein Translation-Lookaside-Buffer (TLB) mit 256 Einträgen. Er wird sowohl für
Befehle als auch für Daten genutzt. Die Updates des TLB geschehen via Hardware durch die MMU.
Der PPC 601 hat einen 1st-Level-Cache von 32 KByte Größe gemeinsam für Daten und Adressen.
Der Cache ist 8-fach assoziativ aufgebaut.
Der PPC 601 wurde Mitte bis Ende 93 in 0,5 Mikrometer CMOS-Technologie und Taktraten von
50 und 66 MHz auf den Markt gebracht. Die Komplexität liegt bei 2,5 Mio. Transistoren, das
Gehäuse hat 304 Anschlusspins.
Innerhalb einer Allianz von IBM, Motorola und Apple wurde der 601 zunächst in neuen MacintoshPCs eingesetzt, die vorher zumeist mit Motorola-Prozessoren ausgestattet waren.
Der Power PC 603 ist eine erweiterte Version des 601 mit spezieller Auslegung für Notebooks, für
die er vier spezielle Energiespar-Modi besitzt.
Ein anderer wesentlicher Unterschied ist die Trennung von Befehls- und Daten-Cache (je 8 KByte).
Pro Takt können 2 Befehle aus dem Befehls-Cache in den Befehlspuffer eingeladen werden.
6.4.3 Der Power-PC 604
Der Power-PC 604 ist auch nahezu vier Jahre nach seiner Ankündigung (Februar 1994) eine
durchaus aktuelle Maschine. Man findet ihn mit Taktraten von 200 MHz und mehr sowohl in HighEnd-PCs der Macintosh-Serie, aber auch in Workstations und Servern von IBM dort, wo die teurere
64-Bit-Architektur des PPC 620 (noch) nicht erforderlich ist.
Während der Power PC 601 als 2-fach superskalar zu bezeichnen ist (max. 3 Befehle gleichzeitig,
aber z. B. nur je ein arithmetischer GK- und FK-Befehl, kann man den 604 als einen vierfach
superskalaren Rechner bezeichnen.
21
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Fetch
Unit
Instruction MMU / Cache
BTAC
Branch
Unit
BHT
Dispatch /Complete Unit
Prefetch
Buffer
Reorder
Buffer
Reservation Station (2)
Dispatch
Buffer
Dispatch- und Completion-Busse
Reservation
Station (2)
Reservation
Station (2)
Reservation
Station (2)
FPU
(3 stage)
Load / store
( 2-stage)
Integer
(3-stage)
FPRs and
Rename
Buffers
Reservation
Station (2)
Integer
(1-stage)
Reservation
Station (2)
Integer
(1-stage)
GPRs and Rename Buffers
Data MMU / Cache
Load / store Queues
Bus Interface Unit
Adressen
(32)
(64)
Adressen
Abb. 6.13: Struktur des Power-PC 604
Der PPC 604 hat zwei getrennte je 16 KByte große Caches für Befehle bzw. Daten.
Jede der 6 Ausführungseinheiten besitzt eine Reservation Station mit zwei Einträgen. Die beiden
Registersätze des 604 umfassen wie beim 601 und 603 32 allgemeine Register mit je 32 Bit Breite
und 32 Gleitkommaregister mit jeweils 64 Bit Breite.
Die drei Festkommaeinheiten sind zweimal einstufig bzw. dreistufig, wobei die dreistufige Einheit
(die drei Takte bzw. drei Pipelinephasen benötigt) für die Multiplikation und die Division benötigt
wird. Addition, Subtraktion und andere einfache arithmetisch-logische Operationen werden in den
einstufigen Einheiten erledigt.
Auch die Gleikommaeinheit ist dreistufig, benötigt aber 18 Takte für eine Division mit einfacher
Genauigkeit und 31 Takte für eine Division mit doppelter Genauigkeit.
Die Pipeline ist insgesamt 6-stufig mit den Phasen:
-
Befehlsbereitstellung
Decodierung
Befehlszuordnung
Ausführung
Prüfung der Ausführungsbeendigung
Rückschreiben ins Zielregister.
Bis zu vier Befehle werden in der Befehls-Bereitstellungs-Phase geholt und im Befehlspuffer
gespeichert. Dieser Puffer ist in einen Prefetch-Buffer und einen Dispatch-Buffer aufgeteilt. Die
Dekodierung ermittelt die Operanden, die Zielregister, die Ausführungseinheit und andere
Ressourcen. Die Zuordnungsstufe kann bis zu vier Befehle gleichzeitig an die Reservation Stations
der sechs einzelnen Ausführungseinheiten verteilen. Die Befehlszuordnung geschieht zwar
prinzipiell in Programmreihenfolge, durch unterschiedliche Laufzeiten der einzelnen Befehle
werden diese aber in der Regel nicht in derselben Reihenfolge beendet.
Um die sich daraus ergebenden Probleme (Daten-Hazards vom Typ "Write after Write") zu
korrigieren, wird eine weitere Pipelinestufe benötigt. Dazu wird ein Rückordnungs-Puffer benötigt.
Sobald ein Befehl die Befehlszuordnungsstufe passiert hat, wird er in den Rückordnungs-Puffer
eingeschrieben. Eine Befehlsausführung gilt erst dann als beendet, wenn alle vorangegangenen
Befehle im Rückordnungspuffer als abgearbeitet gekennzeichnet sind.
22
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
In der letzten Stufe werden die Ergebnisse in die Zielregister zurückgeschrieben.
Für einfache Befehle können über Forwarding-Techniken die beiden letzten Stufen auch in einem
Takt durchgeführt werden.
Die Bearbeitung von Programmverzweigungen wird beim 604 mit noch raffinierteren Techniken
bewältigt.
Bedingte Sprünge, die nur von einem Bit im Bedingungsregister abhängen, werden in einer Branch
History Table (BHT) registriert. Dies ist ein Cache mit 512 Einträgen für jeweils vier
Vorhersagestufen "oft ausgeführt", "weniger oft ausgeführt", weniger oft nicht ausgeführt", und "oft
nicht ausgeführt".
Der zweite neue Mechanismus ist die spekulative Ausführung von Befehlen. Der Power PC 601
kann den Befehlspuffer spekulativ laden, der 604 führt sie auch noch spekulativ aus. Wenn infolge
des BHE-Eintrages ein Verhalten als "wahrscheinlich" gekennzeichnet ist, so wird die
Befehlsausführung spekulativ gestartet. Die Ergebnisse werden in sogenannten Shadow-, Rename-,
oder Reorder-Registern gespeichert. Wenn die Ergebnisse später verwendet werden können, so
reicht eine Umbenennung der Register aus, um ihre Inhalte als gültige Ergebnisse weiter zu
verwenden.
Die jeweils 16 KByte großen Code- und Daten-Caches sind vierfach assoziativ organisiert und
besitzen eigene Speicherverwaltungseinheiten (MMUs).
Die Cache-Verwaltung ist so organisiert, dass sie mit dem MESI-Protokoll zur Speicherverwaltung
in Mehrprozessorsystemen kompatibel ist.
Der Power PC 604, gefertigt in 0,5 um CMOS-Technologie mit 3,6 Mio. Transistoren, benötigt bei
100 MHz Takt ca. 10 W Leistung im Normalbetrieb. Es existiert aber auch ein Energiesparmodus
mit max. 0,4 Watt Leistungsaufnahme.
6.4.4 Der Power-PC 620
Der Power PC 620 wurde im Oktober 1994 als erster 64-Bit-Mikroprozessor der Power-PC-Linie
vorgestellt. Er zielte auf Workstations und Server. Der 620 ist Binärcode-kompatibel mit den
32-Bit-Power PCs und hat einen dem PC 604 ähnlichen Aufbau mit den gleichen 6 Ausführungseinheiten.
23
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Fetch
Unit
Instruction MMU / Cache
BTAC
Branch
Unit
156
BHT
Dispatch /Complete Unit
Reservation Station (4)
InstructionPre-Decode
Prefetch
Buffer
Reorder
Buffer
Dispatch
Buffer
Dispatch- und Completion-Busse
Reservation
Station (2)
Reservation
Station (3)
Reservation
Station (2)
FPU
(3 stage)
Load / store
( 2-stage)
Integer
(3-stage)
FPRs and
Rename
Buffers
Reservation
Station (2)
128
Reservation
Station (2)
Integer
(1-stage)
Integer
(1-stage)
GPRs and Rename Buffers
Data MMU / Cache
Load / store Queues
40
128
L2
36
Adr. / Tag 128
40
128
L2 / Bus Interface Unit
Daten
Adressen
(40)
(128)
Adressen
Abb. 6.12: Struktur des Power PC 620
Dagegen sind die internen Datenpfade, Adressen-, Puffer-, und Registergrößen auf 64 Bit erweitert.
Die beiden Caches für Code und Daten sind jetzt jeweils 32 KByte groß und haben jeweils eigene
Speicherverwaltungseinheiten.
Alle allgemeinen Register sind jetzt 64 Bit breit. Entsprechend der erweiterten Spezifikation der
Power-PCs für 64-Bit-Prozessoren gibt es insgesamt 38 neue Befehle. Diese betreffen 64-BitOperationen wie z. B. das Laden und Speichern von 64-Bit-Worten. Ein per Software setzbares
Status-Bit im Prozessorstatusregister zeigt an, ob der Prozessor in 32 Bit - oder im 64-Bit-Modus
arbeitet.
Die Datenbusschnittstelle ist gegenüber dem 604 auf 128 Bit erweitert. Auch wird ein externer 2ndLevel-Cache von 1 bis 128 MByte Größe unterstützt.
Der Adressbus ist 40 Mit breit, womit bis zu 1 Terabyte physikalisch adressierbar ist. Die
Speicherverwaltung entspricht weitgehend der beim 32-Bit-Power PC, allerdings sind die logischen
Adressen 64 Bit breit und die virtuellen Adressen 80 Bit breit.
Eine echte architektonische Erweiterung ist die Vorab-Dekodiereinheit, welche die Befehle auf dem
Weg von der Busschnittstelle zum Cache durchlaufen. Die im Cache stehenden Befehle sind also
bereits teilweise dekodiert. Damit wird die Dekodierphase der Pipeline vereinfacht und verkürzt.
Dies erlaubt dann die Zusammenlegung der Dekodierphase und der Zuordnungsphase in der
Pipeline. Damit hat der Power-PC 620 im Gegensatz zum 604 nur eine 5-stufige Pipeline mit den
Schritten:
-
Befehlsbereitstellung (Instruction Fetch)
Dekodierung / Zuordnung
Ausführung
Vervollständigung
Rückschreiben in ein Register.
24
BTU Cottbus, Prozessor-Architektur, Kapitel 6, WS 99/00
Sobald ein Befehl für die Dekodier-/Zuordnungseinheit bereitsteht, wird diesem Befehl ein Platz im
Umbenennungs-Puffer (Rename Buffer) zugeordnet. Dieser enthält das Ergebnis des Befehls im
Fall einer spekulativen Ausführung. Die Resultate spekulativ ausgeführter Befehle verbleiben
jeweils im Umbenennungspuffer, bis der vorangehende Verzweigungsbefehl vollständig ausgewertet ist. War die Vorhersage richtig, so werden die Ergebnisse in die jeweiligen Zielregister
eingeschrieben, andernfalls werden sie gelöscht.
Der Umbenennungs-Puffer (Rename-Buffer) ist beim 620 durch einen Rückordnungs-Puffer
(Reorder-Buffer) erweitert. Dessen Aufgabe ist die Überwachung der Zustände der Befehlsverarbeitung von der Zuordnungsphase bis zum Ausführungsende. Der 620 kann pro Takt bis zu 4
Umbenennungs-Puffer-Register freigeben. Damit stehen diese schneller wieder für andere Befehle
zur Verfügung. Deshalb und wegen der kürzeren Pipeline kommt der 620 mit nur 16
Umbenennungs-Puffer-Registern (je 8 für Festkomma- und Gleitkommabefehle) gegenüber 20
beim 604 aus (dort 12 allgemein, 8 für Gleitkommabefehle).
Die Dekodier-/Befehlszuordnungseinheit kann pro Takt bis zu 4 Befehle dekodieren und den sechs
Ausführungseinheiten zuführen. In den Ausführungseinheiten gibt es "Warteschlangen (Reservation
Stations) von 1 bis 3 Befehlen Tiefe. Die Dekodier- und Zuordnungseinheit ordnet die Befehle zwar
in deren normaler Reihenfolge der einzelnen Ausführungseinheit zu, wegen Wartens in der
Reservation Station und auch ansonsten unterschiedlich langer Laufzeiten kann die Beendigung von
Befehlen aber durchaus außerhalb der normalen Reihenfolge passieren. Der Rückordnungs-Puffer
sichert dann, dass die Ergebnisse am Ende wieder in der richtigen Reihenfolge zur Verfügung
stehen.
Wie schon beim 601 und beim 604 gesehen nimmt die Vorhersage von Sprungbedingungen einen
ganz wesentlichen Platz in der Prozessorarchitektur ein.
Diese ist beim 620 noch mal weiter verbessert. Beim 604 konnten bis zu zwei noch nicht
vollständig ausgewertete Verzweigungsbefehle spekulativ ausgeführt werden, beim 620 sind es
vier. Der 620 benutzt eine 2048 Einträge umfassende Sprungtabelle, welche die Entscheidungen bei
zuvor ausgeführten bedingten Verzweigungen aufbewahrt. Dazu ist ein 256 Einträge umfassender
Sprungziel-Adressen-Cache vorhanden (Branch Target Address Cache, BTAC), der auch die
Adressen von Verzweigungsbefehlen, also die Sprungziel-Adressen, aufbewahrt. Damit soll die
Genauigkeit bei Vorhersagen bei etwa 90% liegen. Da die Reparatur einer falschen
Sprungvorhersage etwa vier Takte kostet, ist damit der Einfluss auf die Leistung des Prozessors
insgesamt erheblich.
Auch die Gleitkommaeinheit ist noch mal erweitert worden. Die Gleitkommadivision kommt mit 18
Takten (gegenüber 32 beim 604) aus. Die Quadratwurzelberechnung wird beim 604 mit Software
emuliert und kostet hier "nur" 22 Takte.
Auch das Laden und Speichern von Gleitkommabefehlen ist einen Takt kürzer als beim 604. Durch
die breiteren internen Datenpfade ist die Gleitkommaverarbeitung insgesamt wesentlich effizienter.
Der Power PC 620 sollte Ende 1995 mit einer Komplexität von ca. 7 Mio. Transistoren auf den
Markt kommen, gefertigt damals in 0,5 Mikrometer CMOS-Technologie und 133 MHz Prozessortakt.
Inzwischen sind Versionen mit 200 MHz Takt verfügbar.
Dass man aber neue Rechner von IBM (und nicht nur PCs) auch mit hoch getakteten 604-Prozessoren erhält, zeigt, dass der 620 vielleicht doch etwas zu high-end geworden ist.
In der Breite haben sich die 64-Bit-Prozessoren noch nicht durchsetzen können.
Anscheinend fährt man mit Mehrprozessorsystemen auf der Basis von 32-Bit-PCs günstiger.
25
Document
Kategorie
Technik
Seitenansichten
14
Dateigröße
125 KB
Tags
1/--Seiten
melden