Latenzsemantik von Leseregistern auf x86-ASM

482
IamIC

Gemäß A. Fog's Anweisungstabellen hat eine Ivy Bridge eine Latenzzeit von 3 Zyklen für einen MOV-Befehl.

Das Folgende benötigt 3 Zyklen, um RAX in die Adresse in RCX zu verschieben:

 mov [rcx], rax 

Meine Frage ist, bedeutet das, dass der gelesene RAX für die nächsten 2 Uhren nicht modifiziert werden kann? Würde insbesondere Folgendes zu einer Ausführungsverzögerung führen:

 mov [rcx], rax inc rax 
1

1 Antwort auf die Frage

1
Mokubai

Kurz gesagt, ja. Dadurch wird der Prozessor angehalten, während er darauf wartet, dass der Befehl abgeschlossen ist und Daten verfügbar sind, bevor der nächste Befehl ausgeführt werden kann. Es gibt keine Möglichkeit, auf einfache Weise vorherzusagen, welche Daten ankommen, und der incBefehl kann erst ausgeführt werden, wenn der Befehl movabgeschlossen ist.

Dies ist jedoch kein großes Problem, da der Prozessor möglicherweise in der Lage ist, Anweisungen einzuplanen, die nicht vom Ergebnis dieser movAnweisung abhängen, um den Kernbetrieb aufrechtzuerhalten.

Dies wird als Out-of-Order-Ausführung bezeichnet und kann dazu beitragen, die Kosten für Prozessorstillstände zu verringern, wenn auf lange Anweisungen wie diese gewartet wird.


Eine weitere Klarstellung ...

Ich hätte Ihr Beispiel besser lesen sollen, ich glaube nicht, dass die mov [rcx], raxAnweisung die Anweisung zum Stehen bringen wird inc rax, aber alles, was davon abhängig ist, rcxzum Stehen kommt.

Die von Ihnen verlinkte Seite listet den wechselseitigen Durchsatz auf, wodurch eine weitere Anweisung dieses Typs ausgegeben werden kann. Im Einzelnen würde ich davon ausgehen, dass in dieser Zeit eine Anweisung mit ähnlichen Abhängigkeiten ausgegeben werden könnte.

Ich würde also annehmen, dass das RAX-Register entweder umbenannt wird, wenn der Befehl zur Ausführung gesendet wird, oder in den U-Ops für den Befehl codiert ist. Die nächste Anweisung kann mit diesem Register arbeiten, solange sie nicht von den Ergebnissen einer vorherigen Operation abhängt, die in diesem Register gespeichert ist.

Also in Ihrem Fragen Beispiel, was ich glaube, soll geschehen ist, dass die CPU effektiv zwei Befehle, deren einzige Abhängigkeit hat der aktuelle Wert des RAX - Registers und der Wert darin wird nur durch die zweite Anweisung geändert. Die erste Anweisung sollte abgesetzt werden und die sofortige Ausführung kann mit der zweiten incAnweisung beginnen.

Ich nehme an, dass in auch RAX für 3 Zyklen gebunden ist, oder wäre dies anders, da RAX im Zyklus 1 zur Bestimmung der Adresse verwendet würde und die nächsten 2 Zyklen sind der Laden & Laden? IamIC vor 8 Jahren 0
@IanC Ich glaube, ich sehe, wohin du gehst. Ob RAX für den gesamten Zeitraum gebunden ist (und somit das "inc" hochhält), ist ohne ein ziemlich spezifisches architektonisches Wissen, das ich nicht besitze, nicht bekannt. Der Dispatcher könnte den in RAX in den u-ops gespeicherten Wert für den Befehl "movq" leicht codieren und somit das Register für die (fast) sofortige Verwendung durch den "inc" freigeben. Die Seite listet auch "wechselseitigen Durchsatz" auf, wodurch eine andere Anweisung dieses Typs ausgegeben werden kann, und ich würde in derselben Zeitspanne davon ausgehen, dass eine Anweisung mit ähnlichen Abhängigkeiten ausgegeben werden könnte. Mokubai vor 8 Jahren 2
Es ist sicherlich eine knifflige Frage. Die Beziehung zwischen Latenz und gegenseitigem Durchsatz ist komplex. An diesem Punkt würde ich sagen, dass das Testen der einzige Weg ist, um wirklich zu wissen. Aber testen Sie etwas, das auf diesem niedrigen Niveau wahrscheinlich untrivial ist. IamIC vor 8 Jahren 0
@IanC Wie Sie sagen, es ist nicht ganz unbedeutend, dies herauszufinden, es gibt viele hochentwickelte Funktionen, die bestimmen, ob der Befehl die weitere Ausführung blockiert und ob und wie lange. Ich habe meine Antwort so bearbeitet, dass sie meiner Meinung nach das logischste Ergebnis widerspiegelt. Die einzigen Beispiele, die ich dazu finden kann, betreffen Operationen in Registern mit unterschiedlichen Namen, nicht zwei Anweisungen, die sich nur auf den aktuellen Status des Registers beziehen. Mokubai vor 8 Jahren 0