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