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.