Hochleistungs-CPUs früher: CISC ( Complex Instruction Set Computer ) mächtige Instruktionssätze zur Unterstützung von Hochsprachenkonstrukten durch Hardware (Idee: don t do in software what you can do in hardware ) resultierender Code ist kompakt Compiler kann jedoch i.a. die Möglichkeiten des Instruktionssatzes nicht richtig ausnutzen Beispiele: DEC VAX, Motorola 680x0, Intel Pentium heute: RISC ( Reduced Instruction Set Computer ) einfacher Instruktionssatz: kleine Anzahl an Instruktionen und Adressierungsarten einfacher Entwurf hohe Registeranzahl erspart viele Speicherzugriffe einheitliche Instruktionslänge, Register/Register-Operationen und separate Load/Store-Befehle ermöglichen effizientes Instruktions-Pipelining Beispiele: SPARC, MIPS, DEC Alpha, HP PA-Risc, IBM RS-6000, PowerPC 18 Hochleistungs-CPUs: RISC Architektur einer einfachen RISC-CPU: interne Harvard-Architektur durch separate D- und I-Caches ( entschärft von Neumann Flaschenhals ) großer Registersatz mindestens 1 Integer Unit und 1 Floating Point Unit je Takt eine Instruktion angestrebt, d.h. CPI = 1 19 1
Hochleistungs-CPUs: Instruktionspipelining bei hohen Taktraten reicht eine Taktzykluszeit nicht mehr aus für Holen, Dekodieren und Ausführen einer Instruktion k-facher Durchsatz durch k-phasiges Instruktionspipelining: Beispiel mit k=5: (IF = Instruction Fetch, ID = Instruction Decode, OF = Operand Fetch, EX = Execute, WB = Write Back ) Probleme: Datenabhängigkeiten aufeinander folgender Befehle, unbedingte und bedingte Sprünge, langsamer Speicherzugriff 20 Hochleistungs-CPUs: Sprünge ISAs vieler RISC-CPUs verwenden Delayed Branches : ein Branch Delay Slot besteht aus den einem Sprung folgenden q Instruktionen Compiler muß hier q Instruktionen einfügen, die unabhängig vom Sprungverhalten in jedem Fall ausgeführt werden können! Hardware für Sprungvorhersage ( Branch Prediction Unit ) : Branch Target Address Cache (BTAC) enthält die zuletzt verwendeten Sprungzieladressen Branch Target Buffer (BTB) enthält für jeden Sprungbefehl zusätzliche lokale Sprunghistorie ( accuracy 85%) (z.b. 11 = strongly taken, 10 = taken, 01 = not taken, 00 = strongly not taken ) Branch History Table (BHT) mit Zugriff über globale Sprunghistorie ( accuracy 95%) 21 2
Hochleistungs-CPUs: Konzepte p-fache Superskalarität ( Instruction Level Parallelism, ILP): (p aufeinander folgende sequentielle Instruktionen werden gleichzeitig dekodiert und bei Unabhängigkeit gleichzeitig ausgeführt, CPI min = 1/p) Problem: Datenabhängigkeiten falsche Sprungvorhersagen erhöhen CPI! Out-Of-Order Befehlsausführung: (Hardware sucht automatisch in einem Puffer mit bereits dekodierten Instruktionen nach unabhängigen Instruktionen; spätere Instruktionen können ggf. spekulativ ausgeführt werden) 22 Hochleistungs-CPUs: Konzepte (Forts.) zweistufige oder dreistufige Cache-Hierarchien mit großer Kapazität verstecken weitgehend hohe Speicherzugriffszeiten spekulatives Laden von Daten mittels Prefetch Instruktionen gepufferte Load/Store-Einheiten Lade- oder Schreiboperation aus/in den Hauptspeicher (z.b. bei cache miss ) werden separat ausgeführt Instruktions-Pipeline kann nachfolgende Befehle ausführen, bis Ergebnis benötigt wird interner Puffer für mehrere Speicherzugriffe Funktions-Einheiten mit separaten arithmetischen Pipelines insbesondere für Gleitkomma-Operationen Ausführung wird in Phase EX der Instruktionspipeline gestartet; Ergebnis liegt zu einem späteren Zeitpunkt vor i.a. ein Ergebnis je Takt 23 3
Hochleistungs-CPUs: Konzepte (Forts.) bedingte Befehlsausführung durch Prädikate ersetzt Sprünge: Beispiel: if (a<b) kann wie folgt kodiert werden: test a<b a=c if TRUE a=c else if FALSE a=d a=d SIMD-Parallelität ( Data Level Parallelism, DLP): (sogenannte Multimedia- oder Vektoreinheiten gestatten die datenparallele Ausführung von arithmetischen Operationen auf mehrere in ein 64-Bit oder 128-Bit Register gepackte 8-, 16- oder 32-Bit Daten) Beispiele: Intel MMX, Intel SSE, AMD 3DNow!, Sun VIS Superpipelining: Instruktions-Pipelining mit k» 5 Phasen (höherer Durchsatz, aber größerer Leistungsverlust bei Pipeline-Konflikten) EPIC ( Explicitly Parallel Instruction Computing ) (statt Out-Of-Order Befehlsausführung muß Compiler unabhängige parallel ausführbare Instruktionen finden und entsprechend kodieren) 24 Beispiel 1: Sun UltraSPARC III CPU-Architektur: 25 4
Beispiel 1: Sun UltraSPARC III (Forts.) Instruktionspipeline mit bis zu 14 Phasen: separate Pipelines für Gleitkomma- und Load/Store-Befehle charakteristische Zeiten: misprediction penalty : 7 Takte misfetch penalty : 3 Takte D-cache latency : 2 Takte floating point divide latency : 20 Takte (ohne Pipeline) integer mult / divide latency : 6 / 64 Takte (ohne Pipeline) 26 Vergleich UltraSPARC III, Pentium, Alpha Pentium III UltraSparc III Alpha 21264 Superskalarität 3-fach 4-fach 4-fach Pipelinestufen 12-17 10-14 7-10 Out-of-Order ja nein ja Reorder Buffer Size 40 80 Funktionseinheiten Int/FP, Int, 3LS 4 Int, 2 FP, 1 LS 4 Int, 2 FP, 2 LS SIMD-Erweiterungen 2 MMX / 1 SSE 2 VIS 1 MVI Register 8(+40) Int, 8 FP 136 Int, 32 FP 32(+48) Int, 32(+40) FP Caches (I, D, L2) 16k, 16k, 512k 64k, 64k, 0.5-8M 64k, 64k, 1-16M Branch Prediction 0.5k BTAC + BHT 16k BHT 4k BHT Anzahl Transistoren 9.5M 16M 15.2M Taktfrequenz (MHz) 500-1G 750-1G 500-1G SPECint2000 (1 GHz) 408 610 679 SPECfp2000 (1 GHz) 264 827 960 27 5
Beispiel 2: IA-64 HP und Intel entwickelten gemeinsam IA-64 Architektur, bei dem der Compiler unabhängige Instruktionen ermittelt (hat umfassendere Sicht auf Programm; einfachere Scheduling-Hardware) zentrale Ideen: 64-Bit Architektur, EPIC-Konzept 128-Bit Instruktionswort ( Bundle ): drei 41-Bit Instruktionen, RISC-ähnlich kodiert ein 5-Bit Template, in dem festgelegt wird, 1) von welchen Funktionseinheiten die drei Instruktionen ausgeführt werden (M=Memory, I=Complex Integer, A=Integer, F=Floating Point, B=Branch) 2) welche Instruktionen unabhängig und somit parallel ausführbar sind (durch Einfügen eines Break Bits S zwischen abhängigen Befehlen) nicht alle Kombinationen im Template kodierbar! 28 Beispiel 2: IA-64 (Forts.) IA-64 ISA: fast alle Instruktionen mittels Prädikate bedingt ausführbar Beispiel: (p1) add r1=r2,r3 viele Register: 128 Integer-Register (64 Bit + 1 NaT-Bit, NaT= Not a Thing ), 128 Gleitkomma-Register (82 Bit), 128 Applikations-Register (64 Bit Spezialregister, enthalten u.a. IA-32 Register) 64 Prädikat-Register (1 Bit) für Ergebnisse von Vergleichsbefehlen Compiler setzt bei Sprung-Befehlen Branch Hint Bits zur statischen Vorhersage des Sprungverhaltens spezielle loop Befehle Befehle ld.s und chk.s zum spekulativen Laden von Daten Compiler kann bei allen load/store-befehlen Cache Hint Bits setzen Register-Stack: Subroutine kann mit alloc neuen Registersatz anfordern automatische Entrollen von Schleifen mittels Register-Rotation 29 6
Beispiel 2: IA-64 (Forts.) Intel Itanium: erster Prozessor für IA-64 ISA mit 800 MHz 6-fache Befehlsparallelität: Prozessor kann alle 6 Instruktionen aus zwei Bundles gleichzeitig beginnen 10-phasige Instruktionspipeline: viele Funktionseinheiten: 4 Integer- und Multimedia-Einheiten 2 Load/Store Einheiten 3 Sprungvorhersage-Einheiten 2 Gleitkomma-Einheiten (enthalten SIMD-EInheiten) 16 KByte L1-Caches, 96 KByte L2-Cache, 4 MByte L3-Cache Systembus für bis zu 4 CPUs vorgesehen max. 6.4 GFlop/s (32-Bit), SPECint2000: 342, SPECfp2000: 645 30 Beispiel 2: IA-64 (Forts.) Architektur der CPU Itanium: 31 7
Hochleistungs-CPUs: Ausblick Hauptprobleme von Hochleistungs-CPUs: Forderung nach (binärer) Kompatibilität hohe Zugriffszeit auf Hauptspeicher p-facher DLP: SIMD-Einheiten ermöglichen zwar einen p-fachen Leistungsgewinn, aber maschinennahe Programmierung erforderlich p-facher ILP: bedingt durch falsche Sprungvorhersagen und hohe Datenabhängigkeiten ist CPI-Wert von 1/p nicht erreichbar! schlechte Auslastung der vorhandenen Funktionseinheiten! OOO-Ausführung findet i.a. zu wenige unabhängige Instruktionen! ist Aufgabenverlagerung in Compiler (Bsp. IA-64) eine gute Alternative? neue Ideen für zukünftige Hochleistungs-CPUs: Multithreading-Architekturen mit mehrfach vorhandenen Registersätzen für schnellem Thread-Wechsel (z.b. nach cache miss ) OnChip-Multiprozessoren mit mehreren CPUs auf einem Chip 32 8