CISC-/RISC-Prozessoren (PDF, Handouts)

Transcription

CISC-/RISC-Prozessoren (PDF, Handouts)
ARM: Befehlssatz (Forts.)
Befehl SWI zum Auslösen eines Software-Interrupts:
•
Instruktionsformat:
•
Ausführung von SWI überführt CPU in den „supervisor mode“ (nach Retten
des PC in r14_svc und des CPSR in SPSR_svc) und setzt PC auf 0x08
•
24-Bit Operand wird von CPU vollständig ignoriert und dient zur Übergabe
eines Parameters an die Interrupt-Behandlungsroutine, z.B. wie folgt:
0x08
svc
B
svc
; Sprung an Interrupt-Behandlungsroutine
...
LDR r13,[r14,#-4]
; Laden des Befehlswortes in r13
BIC r13,r13,#0xFF000000
; Löschen von Bit 31-24
...
; in r13 steht nun Operand zur Analyse bereit
MOVS PC,r14
; Rücksprung ins unterbrochene Programm
Weitere ARM-Befehle (hier nicht behandelt) ermöglichen z.B. den
Transfer mehrerer Registerinhalte und Zugriff auf Statusregister
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
33
ARM: Beispielprogramm 1
Berechnung des größten gemeinsamen Teilers („greatest common divisor“)
zweier ganzer Zahlen
AREA
calcgcd, CODE, READONLY
ENTRY
; nachfolgende Instruktion repräsentiert den
; ersten auszuführenden Befehl (Einsprung)
start MOV
r0, #15
; Lade zwei Zahlen in r1 und r2
MOV
r1, #6
BL
gcd
; Aufruf von Unterprogramm gcd
SWI
0x11
; Ende durch Software-Interrupt
;
;
gcd
CMP
SUBGT
SUBLT
BNE
MOV
r0, r1
r0, r0, r1
r1, r1, r0
gcd
pc,lr
END
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
;
;
;
;
bilde r0 ← r0-r1, wenn r0 > r1
bilde r1 ← r1-r0, wenn r1 > r0
fertig, wenn r1=r0 (entspricht Ergebnis)
Rücksprung ins Hauptprogramm
; Ende des Code-Blocks
Kapitel 1.6 : CISC-/RISC-Prozessoren
34
1
ARM: Beispielprogramm 2
AREA
ENTRY
start LDR
MOV
loop
LDRB
CMP
BNE
SUB
BL
SWI
string DCB
ALIGN
pal
LDRB
LDRB
CMP
MOVNE
CMP
BMI
MOV
MOV
END
palindrom, CODE, READONLY
; Routine palindrom
; testet, ob ein String ein Palindrom darstellt
r0,=string
; in r0 steht Zeiger i auf String-Anfang
r1,r0
; in r1 wird Zeiger j auf String-Ende ermittelt
r10,[r1],#1
; lade nächstes Zeichen (Suffix „B“ heißt Byte)
r10,#0
; Ende des Strings erkannt ?
loop
r1,r1,#2
; Korrektur von r2
pal
; Aufruf von Unterprogramm pal
0x11
ABCCBA ,0
; Definition eines Strings als Beispiel
; neue Ausrichtung auf 32-Bit Grenze
r3,[r0],#1
; Lade string[i] in r3, i ← i+1 in r0
r4,[r1],#-1
; Lade string[j] in r4, j ← j-1 in r1
r3,r4
; string[i] = string[j] ?
pc,lr
; wenn ungleich, dann kein Palindrom
r0,r1
; i<j ?
pal
; wenn ja, dann noch nicht fertig
r10,#1
; Palindrom gefunden ⇒ setze r10 auf 1
pc,lr
; Rücksprung aus Unterprogramm
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
35
Weiterentwicklung RISC
Nach den Erfolgen von RISC (University of Berkeley, 1982) und
MIPS (University of Stanford, 1984) begannen neben ARM auch
einige etablierte Prozessorhersteller mit der Entwicklung eigener
RISC CPUs:
•
Sun SPARC (offenes Architekturkonzept, basierend auf Berkeley RISC, bis
zu 520 Register in bis zu 32 überlappenden Registerfenstern, 1988)
•
Motorola 88x00 (1988)
•
Intel i860 (1989)
•
IBM RS/6000 (1990)
•
DEC Alpha 21x64 (erste 64-Bit Architektur, 1992)
•
Motorola/IBM/Apple PowerPC (1994)
Die letzten RISC CPUs weichen wieder etwas vom RISC-Konzept
ab, z.B. durch eine hohe Instruktionsanzahl (bei PowerPC: 184)
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
36
2
RISC Registerfenster
in Berkeley RISC und Sun SPARC
implementiertes Konzept zum
effizienten Unterprogrammaufruf
•
Registerfenster für Unterprogrammebene i
enthält 32 Register, z.B. wie folgt:
– 10 „global registers“ für globale, in allen
Fenstern sichtbare Variablen
– 6 „input registers“ für Eingabeparameter
– 10 „local registers“ für lokale Variablen
– 6 „output registers“ für Ausgabeparameter
•
Ausgaberegister der Ebene i entprechen den
Eingaberegistern der Ebene i+1
•
bei n Fenstern insgesamt 16+n·16 Register
•
bei Überlauf werden Register des ältesten
Fensters auf Stack gesichert und verwendet
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
37
RISC Instruktionspipelining
•
•
•
Ziel: hoher Durchsatz an Instruktionen
Problem: bei hohen Taktraten kann jedoch selbst ein einfacher
Befehl (wie z.B. ADD r1,r2,r3) nicht in einem Taktzyklus
geholt, dekodiert und ausgeführt werden
Idee: Zerlegung der Befehlsarbeitung in mehrere Phasen, die
nach dem Prinzip eines Fließbandes verarbeitet werden, z.B.:
1. „Instruction Fetch“ (IF) : Holen des nächsten Befehls aus dem Speicher
und Inkrementieren des PC
2. „Instruction Decode“ (ID) : Dekodieren der Instruktion
3. „Operand Fetch“ (OF) : Holen der Operanden aus Registern und/oder
Berechnung der effektiven Adresse (bei Load/Store-Befehlen)
4. „Execute“ (EX) : Ausführen der Operation oder Lesen/Schreiben eines
Wertes in/aus Speicher bzw. Cache (bei Load/Store-Befehlen)
5. „Write Back“ (WB) : Zurückschreiben des Ergebnisses in Register
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
38
3
Instruktionspipelining (Forts.)
•
durch eine Fließbandverarbeitung (Pipelining) der Instruktionen
in n Phasen anstatt sequentieller Verarbeitung kann ein bis zu
n-facher Geschwindigkeitsgewinn erreicht werden:
•
Ausführungszeit jeder einzelnen Instruktion unverändert, aber
Durchsatz wächst mit der Anzahl n der Pipelinestufen
Aufteilung und Anzahl der Phasen ist von Prozessor zu
Prozessor unterschiedlich
•
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
39
Instruktionspipelining (Forts.)
•
Instruktionspipelining bei CISC-Prozessoren:
– prinzipiell möglich (und in letzten Generationen der CISC-Prozessoren
zum Teil auch realisiert)
– jedoch bedingt durch stark variierende Instruktionslängen und
unterschiedliche Ausführungszeiten in den einzelnen Phasen nur mit sehr
hohem Aufwand zu realisieren
– ineffizient, da einige Phasen der Pipeline nur schlecht ausgelastet sind
•
komplexester Teilschritt bestimmt Dauer einer Pipelinephase
und damit die maximale Taktfrequenz
•
Voraussetzungen für effizientes Pipelining:
– alle Instruktionen müssen in der gleichen Anzahl n von Teilschritten
abgearbeitet werden
– jeder Teilschritt sollte ungefähr die gleiche Ausführungszeit benötigen
– Instruktionspipeline sollte stets zu 100% gefüllt sein
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
40
4
Instruktionspipelining (Forts.)
Probleme des Instruktionspipelining:
•
Ressourcenkonflikte („structural hazards“) können entstehen,
– wenn zwei Instruktion in verschiedenen Phasen ihrer Befehlsarbeitung auf das
gleiche interne Register zugreifen oder das gleiche Rechenwerk benötigen
⇒ Lösung: Register oder Rechenwerke müssen mehrfach vorhanden sein
– wenn gleichzeitig in IF eine Instruktion und in EX ein Datenwert geholt wird
⇒ Lösung: separate interne Busse sowie Caches für Instruktionen und Daten
•
Datenkonflikte („data hazards“) können entstehen,
– wenn die nächste Instruktion oder ein Speicheroperand nicht im Cache vorhanden
ist und aus dem langsamen Arbeitsspeicher geholt werden muß
– nachfolgende Instruktionen auf noch nicht verfügbare Ergebnisse vorhergehender
sich noch in der Pipeline befindlicher Befehle warten
•
Kontrollkonflikte („control hazards“) können entstehen,
– wenn bedingte oder unbedingte Sprünge ausgeführt werden und somit die bereits
in der Instruktionspipeline vorhandenen nachfolgenden Befehle ungültig werden
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
41
Instruktionspipelining (Forts.)
•
Beispiel für
Datenkonflikt:
ohne besondere Maßnahmen würde in r4 ein falsches Ergebnis berechnet !
•
Lösungsmöglichkeiten: manuelles/autom. Einfügen von NOP Instruktionen,
frühes Weiterreichen von Ergebnissen („internal forwarding“) in Pipeline
oder Anhalten der Pipeline durch Einfügen von „bubble“ Zyklen:
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
42
5
Instruktionspipelining (Forts.)
•
Beispiel für
Kontrollkonflikt:
die unmittelbar nach einem bedingten Sprungbefehl folgenden Instruktionen
müssen verworfen werden, wenn sich Bedingung als erfüllt herausstellt !
•
Lösungsmöglichkeiten:
–
–
„delayed branch“ Technik: die einem Sprungbefehl unmittelbar folgende(n)
Instruktion(en) werden stets ausgeführt, d.h. Programmierer oder Compiler muß
hier Befehle einfügen, die eigentlich vor dem Sprung auszuführen wären
„branch prediction“ Technik: durch einfache Heuristiken (wie z.B. „backward
branch always taken“) oder Speicherung des letzten Sprungverhaltens für jeden
Sprungbefehl im „branch prediction buffer“ wird Sprungverhalten vorhergesagt
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
43
Vergleich CISC/RISC
• RISC führt zu einfacheren und schnelleren Steuerwerken
(typisches RISC-Steuerwerk nimmt 10% der Chipfläche ein, während das
Steuerwerk des Motorola 68020 fast 70% der Chipfläche benötigt)
• RISC-Prozessoren sind einfacher zu entwerfen
• aufgrund der vielen Register und wenigen Adressierungsarten
kann ein Compiler RISC-Code einfacher optimieren
• einheitliche RISC-Instruktionslänge von einem Wort ermöglicht
die Realisierung eines effizienten Instruktionspipelining
(CPI-Werte zwischen 1 und 1.7 können erreicht werden !)
• RISC-Code ist länger als CISC-Code, da mächtige CISCBefehle Sequenzen einfacher RISC-Instruktionen ersetzen
(typischer RISC-Code ist um 30% länger als CISC-Code)
• RISC-CPUs benötigen höhere Speicherbandbreite für Befehle
Technische Informatik II, WS 2001/02
A. Strey, Universität Ulm
Kapitel 1.6 : CISC-/RISC-Prozessoren
44
6