Muliple Issue am Beispiel
Instruktionen werden in eine oder mehrere Mikrooperationen dekodiert und in
eine Warteschlange gestellt. Sprungerkennung erfolgt erst statisch und dann
dynamisch mit 4 History Bits (da siebenstufige Decode-Pipeline!). Dann werden
Register im Reorder-Buffer (der P4 hat Platz für 40 µOps) zugewiesen. Dabei
werden um Konflikte zu vermeiden Renaming-Register (Schattenregister)
eingesetzt. In der Execute Phase werden Mikrooperationen aus dem Reorderbuffer
entnommen und spekulativ ausgeführt.
Es wird ein komplexes Scoreboard verwendet, um aktive Operationen und
Register zu verwalten. Falls mehrere Mikrooperationen bereit sind, wählt ein
Algorithmus den nächst Wichtigsten aus (z.B. Sprünge).
Mikrooperationen deren Operanden alle verfügbar sind, werden in die Reservation
Stations geschrieben, welche 20 solcher Einträge aufnehmen kann. Dort warten
die Ops, bis eine entsprechende Ausführungseinheit frei wird.
Die Execute-Units haben fünf Ports, um Operationen auszuführen. Manche
Ausführungseinheiten teilen sich einen Port (FPU,MMX).
Die Retire (Completion) Einheit sendet fertige Ergebnisse an die richtige Stelle.
Der P2 unterstützt speculative execution. Falls begonnene Instruktionen nicht mehr
benötigt werden, wird die Rollback Fähigkeit genutzt.
Der Pentium 4 nutzt einen Trace Cache für die letzten drei dekodierten
Befehle. Im Hit Falle, bedient sich die Execution Unit direkt dieser Befehle, was
vor allem bei Schleifen einen beträchtlichen Speedup bringt.
Die UlraSparc 2 ist dagegen eine reine Risc Maschine mit vierfachen statt 2facher
Superskalarität. Durch das Risc Prinzip müssen hier Instruktionen nicht in mehrere
Mikrooperationen umgesetzt werden. Desweiteren unterstützt die meist gleich große
Befehlslänge das Pipelining besser, als die z.T. komplexeren Cisc Befehle des
Pentium.
Neu ist das so genannte Folding der PicoJava CPU, welche Instruktionen faltet, d.h.
zusammenfasst und gleiche Instruktionen in einem Zyklus (auf verschiedenen
Regstern) abarbeiten kann. ( 5 x schneller als P2, obwohl auch CISC)
Superskalarität
- Auflösung von RAW durch Out-Of-Order Ausführung möglich
- WAW und WAR Konflikte durch Register Renaming auflösbar
- Tomasulo liegt Idee der Reservation Stations zu Grunde
- Tomasulo wird zusammen mit Spekulativer Ausführung angewandt
- Meist vier Phasen, wie Fetch/Decode, Issue, Execute und Commit
Wie werden Unterbrechungsanforderungen gehandhabt?
Bei Interrupts muss sichergestellt werden, daß nach Abarbeitung der
Unterbrechung, die CPU wieder in einen sicheren (präzisen) Zustand zurückkehren
kann.
Das erste Verfahren benutzt Checkpoints, an denen der tatsächliche Zustand der CPU
ein Update erfährt und der bisherige in einen History-Buffer gelegt wird. Somit ist
jederzeit ein präziser Zustand wiederherstellbar (Recovery), wobei
innerhalb der Commit-Phase nur der korrekte Zustand hergestellt werden muss und die
nicht weiter benötigten aus dem Historybuffer wieder entfernt werden.
Das zweite Verfahren wird dem Ersten oft bevorzugt. Es steht eng mit der Verwendung
des Reorder-Buffers in Verbindung. Dabei wird der Zustand des Rechners in zwei
aufgeteilt:
- einen Physikalischen Zustand, der bei jeder ausgeführten Instruktion gesetzt wird
- und einem architekturellen Zustand, welcher erst beschrieben wird, wenn ein eventueller spekulativer Status geklärt wurde
Während der Commit-Phase, wird der spekulative Zustand in den architekturellen
(und den physikalischen) übernommen, die Renaming Register des Reorder-Buffers in
die Registerfile geschrieben bzw. die Store-Operation durchgeführt. Dabei wird der
"spekulative Zustand" ebenfalls im Reorder-Buffer mitgeloggt.
Zusammenfassung Superskalar-CPU's - dynamic scheduled pinelines
Da das Pipeline Konzept schnell an seine Grenzen gelangt ist, ist eine andere
Methode notwendig. Es
...