Latenzsemantik von Leseregistern auf x86-ASM

1

Per A. Nebels Anweisungstabellen hat eine Ivy Bridge eine Latenz 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 dies, dass RAX, das gelesen wird, nicht für die nächsten 2 Uhren geändert werden kann? Im Einzelnen würde Folgendes eine Ausführungsverzögerung verursachen:

  mov               [rcx], rax
  inc               rax
IamIC
quelle

Antworten:

1

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 ist nicht einfach vorherzusagen, welche Daten ankommen werden inc Anweisung kann einfach nicht bis zum laufen mov ist komplett.

Dies ist jedoch möglicherweise kein großes Problem, da der Prozessor möglicherweise Befehle planen kann, die nicht vom Ergebnis abhängen mov Unterricht, um den Kern am Laufen zu halten.

Dies ist bekannt als Out-of-Order-Ausführung und es kann helfen, die Kosten für Prozessorstillstände beim Warten auf lange Anweisungen wie diese zu verringern.


Eine weitere Klarstellung ...

Ich hätte dein Beispiel besser lesen sollen, ich glaube nicht, dass das mov [rcx], rax Anweisung führt zu einem Stall auf der inc rax Anweisung, wird aber alles abhängig von verursachen rcx zum Stillstand bringen.

Die Seite, die Sie verlinkt haben, listet den gegenseitigen Durchsatz auf, durch den eine andere Anweisung dieses Typs ausgegeben werden kann. Konkret würde ich in dieser Zeitspanne davon ausgehen irgendein Anweisungen mit ähnlichen Abhängigkeiten könnten ausgegeben werden.

Also ich würde davon ausgehen, dass das RAX-Register entweder ist umbenannt da die Anweisung zur Ausführung gesendet wird oder in den U-Ops für die Anweisung codiert ist. Der nächste Befehl kann mit diesem Register arbeiten, solange er nicht von den Ergebnissen einer vorherigen Operation abhängt, die gespeichert wird im dieses Register

Also in deinen Fragen zum Beispiel was ich glaube sollte Zufall ist, dass die CPU effektiv zwei Befehle hat, deren einzige Abhängigkeit der aktuelle Wert des RAX-Registers ist und dessen Wert nur durch den zweiten Befehl geändert wird. Die erste Anweisung sollte versandt werden und die Ausführung kann fast sofort mit der zweiten beginnen ( inc ) Anweisung.

Mokubai
quelle
Ich gehe davon aus, dass in {movq xmm1, [r10 + rax * 8]} RAX auch für 3 Zyklen gebunden wäre oder dass dies anders wäre, da RAX für Zyklus 1 verwendet würde, um die Adresse zu bestimmen, und die nächsten 2 Zyklen der Abruf & amp; Geschäft?
IamIC
2
@ IanC Ich glaube, ich sehe, wohin du gehst. Ob RAX gebunden ist (und damit die inc ) für den gesamten Zeitraum ist ohne einige ziemlich spezifische architektonische Kenntnisse, die ich nicht habe, nicht zu erkennen. Der Dispatcher könnte den in RAX gespeicherten Wert problemlos in den U-Ops für die codieren movq Anweisung und damit das Register für die (fast) sofortige Nutzung durch die inc. Die Seite listet auch auf reciprocal throughput wodurch ein anderer Befehl dieses Typs ausgegeben werden kann, und ich würde davon ausgehen, dass in diesem Zeitraum ein Befehl mit ähnlichen Abhängigkeiten ausgegeben werden könnte.
Mokubai
Das ist sicherlich eine knifflige Frage. Die Beziehung zwischen Latenz und wechselseitigem Durchsatz ist komplex. An diesem Punkt würde ich sagen, dass das Testen der einzige Weg ist, es wirklich zu wissen. Aber testen Sie etwas, das so niedrig ist, dass es wahrscheinlich nicht einfach ist.
IamIC
@IanC Wie Sie sagen, ist es nicht ganz einfach herauszufinden, dass es viele hochentwickelte Funktionen gibt, die bestimmen, ob und wie lange der Befehl die weitere Ausführung blockiert. Ich habe meine Antwort dahingehend überarbeitet, dass sie meiner Meinung nach das logischste Ergebnis ist. Die einzigen Beispiele, die ich finden kann, betreffen Operationen mit Registern mit unterschiedlichen Namen, nicht zwei Anweisungen, die nur auf dem aktuellen Status des Registers basieren.
Mokubai