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.
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 codierenmovq
Anweisung und damit das Register für die (fast) sofortige Nutzung durch dieinc
. Die Seite listet auch aufreciprocal 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.