Out of Order Execution - Optimierungsmöglichkeiten
Ein Compiler hat die Aufgabe, ein Programm so zu optimieren, so dass dieses so schnell wie möglich abläuft.
Im Falle des im Haupttext stehenden Beispiels würde die Optimierung folgendermaßen aussehen:
MOV EAX, [ESI]
; EAX = Inhalt der an der Speicheradresse ESI stehenden Speicherzelle
ADD ESI, 00000004h
; Erhöhung des Wertes in ESI um vier
MOV EBX, [ESI]
; EBX = Inhalt der an der Speicheradresse ESI stehenden Speicherzelle
ADD EAX, EBX
; Addition der beiden Register, speichern des Ergebnisses in EAX
Dies ist das Original – Codesegment. Es gibt nun zwei Möglichkeiten es zu optimieren: Der Programmierer / Compiler kann
den Programmcode entsprechend ändern, oder der Mikroprozessor kann über Register Renaming eigenständig eine
Optimierung durchführen.
Das optimierte Programmbeispiel könnte folgendermaßen aussehen:
LEA EDI, [ESI, 4, 0]
; EDI = ESI + 4 + 0
MOV EAX, [ESI]
; EAX = Inhalt der an der Speicheradresse ESI stehenden Speicherzelle
MOV EBX, [EDI]
; EBX = Inhalt der an der Speicheradresse EDI stehenden Speicherzelle
ADD EAX, EBX
; Addition der beiden Register, speichern des Ergebnisses in EAX
In diesem Programmbeispiel wird selbige Operation wie oben durchgeführt, mit dem Unterschied das die Ausführung deutlich schneller geht.
Der angewandte Trick ist folgender:
Anstelle das ESI – Register zweifach zu verwenden für beide Ladeoperationen, wird gleich zu Beginn des Programmsegments mit Hilfe
des LEA – Befehls eine Addition mit drei Operanden durchgeführt. Dank des dreistufigen Decoders der P6 als auch der K7-Architektur kann
diese Operation innerhalb weniger Taktzyklen durchgeführt werden.
Dadurch kann während der Leerlaufzeit der ersten Registertransfer – Operation die zweite eingeleitet werden. Die beiden werden quasi
gleichzeitig ausgeführt und somit viel Zeit bei der Ausführung eingespart.
Diese Optimierungsarbeit liegt jedoch beim Programmierer oder Compiler. Eine zweite Möglichkeit ist seit der P6-Architektur gegeben:
Das sog. Register Renaming, welches in obigem Beispiel jedoch nicht auftritt.
Der Mikroprozessor kann intern die acht GPRs auf mehrere interne, für den Programmierer unsichtbare Register abbilden.
Nach dem ersten Registerladebefehl kann der Mikroprozessor das ESI – Register intern auf ein unsichtbares Register abbilden
und die Ausführung des nächsten Befehls einleiten.
Diese Technik kann jedoch bei weiterer Verwendung des ESI – Registers einen Partial Register Stall bei der P6-Architektur auslösen,
was den Geschwindigkeitsvorteil wieder egalisiert.
Diesen Artikel bookmarken oder senden an ...