Register-Renaming ist ein Hardware-Mechanismus moderner superskalarer Prozessoren: Er bildet die wenigen architektonischen Register (die der Befehlssatz sichtbar macht, z.B. 16 bei x86-64 oder 32 bei RISC-V) auf deutlich mehr physische Register ab (typisch 150 bis 250 in der Register-Bank). Dadurch verschwinden die scheinbaren Datenabhängigkeiten, die bei der Pipeline-Ausführung zu Stalls führen würden.
Das Problem: Namenskollisionen ohne echten Datenfluss
Betrachte diese Befehlsfolge – es gibt keine echte Abhängigkeit zwischen den beiden Befehlen, aber beide schreiben in dasselbe Register r1:
add r1, r2, r3 ; liest r2, r3, schreibt r1
sub r1, r4, r5 ; liest r4, r5, schreibt r1
In einer Out-of-Order-Ausführung (siehe Superskalar) würde der sub gerne schon loslaufen, bevor der add fertig ist. Ohne Renaming dürfte er nicht schreiben, solange irgendein älterer Befehl r1 noch lesen will (WAR, Write-After-Read); und zwei Schreibziele mit demselben Namen erzeugen einen WAW-Konflikt (Write-After-Write). Diese Anti- und Output-Abhängigkeiten existieren nur wegen der Namensgleichheit – das Renaming löst genau das.
So funktioniert Renaming
- Beim Dekodieren erhält der Ziel-Register-Namen des Befehls ein frisches physisches Register aus der Free List; eine Remap-Tabelle (Register Alias Table, RAT) merkt sich die Zuordnung architektonisch → physisch.
- Jeder Lesevorgang wird über die aktuelle Remap-Tabelle auf das zuletzt zugewiesene physische Register umgelenkt.
- Der alte Wert bleibt in seinem physischen Register liegen – dadurch kann ein wartender Leser des alten Werts gefahrlos später zugreifen, während das neue Schreiben schon auf einem anderen physischen Register passiert (kein WAR mehr).
- Nach der Ausführung schreibt der Befehl sein Ergebnis in den Reorder Buffer; bei der Retirement (In-Order-Komplettierung) wird das vorherige physische Register des Ziels wieder freigegeben und in die Free List zurückgelegt.
Spekulation und Rollback
Renaming ist auch die Grundlage für spekulative Ausführung: Wird eine Sprungvorhersage später als falsch erkannt, genügt es, die Remap-Tabelle auf den Stand des Verzweigungspunkts zurückzusetzen – die fehlerhaft spekulativ vergebenen physischen Register wandern einfach zurück in die Free List. Echte Programmdaten müssen nicht bewegt werden.
Geschichte
Die Idee stammt aus dem Tomasulo-Algorithmus (Robert Tomasulo, IBM System/360 Model 91, 1967). In den Mainstream gelangte das Renaming mit dem Intel Pentium Pro (P6, 1995); auch AMD K5, MIPS R10000 und DEC Alpha 21264 setzten es früh ein. Heute ist Renaming in jeder x86-64-CPU und in leistungsfähigen ARM-Kernen Standard.
Abgrenzung zur Software-Registerallokation
Nicht verwechseln: Die Registerallokation im Compiler verteilt Variablen auf die architektonischen Register – sie arbeitet auf dem Maschinensprache-Niveau und ist für die Software komplett sichtbar. Das Register-Renaming dagegen ist eine transparente Hardware-Ebene der Mikroarchitektur: Software sieht davon nichts, der Prozessor gewinnt dadurch nur Parallelität.