Instruction Level Profiling: Die Bedeutung des Anweisungszeigers?

8

Was bedeutet die Position des Befehlszeigers beim Profilieren von Code auf der Ebene der Assembly-Anweisung wirklich, da moderne CPUs Befehle nicht seriell oder in Reihenfolge ausführen? Angenommen, der folgende x64-Assembly-Code lautet:

%Vor%

Auf welche Anweisung wird der Befehlszeiger die meiste Zeit verbringen? Ich kann mir gute Argumente für alle vorstellen:

  • mov RAX, [RBX] benötigt wahrscheinlich 100 Zyklen, weil es sich um einen Cache-Fehler handelt.
  • mov RSI, [RBX + RCX] benötigt ebenfalls 100 Zyklen, wird aber wahrscheinlich parallel zum vorherigen Befehl ausgeführt. Was bedeutet es überhaupt, dass der Befehlszeiger auf dem einen oder dem anderen steht?
  • xor R8, R8 wird wahrscheinlich out-of-order ausgeführt und beendet, bevor die Speicherladevorgänge beendet werden, aber der Befehlszeiger kann hier bleiben, bis alle vorherigen Anweisungen ebenfalls beendet sind.
  • add RDX, RAX erzeugt einen Pipeline-Stall, weil es der Befehl ist, bei dem der Wert von RAX nach einem langsamen Cache-Miss-Laden tatsächlich verwendet wird.
  • add RDI, RSI blockiert auch, weil es abhängig von der Ladung in RSI ist.
dsimcha 09.06.2013, 13:35
quelle

1 Antwort

6

CPUs hält eine Fiktion aufrecht, dass es nur die architektonischen Register (RAX, RBX, usw.) gibt und dass es einen spezifischen Befehlszeiger (IP) gibt. Programmierer und Compiler zielen auf diese Fiktion.

Wie Sie bereits bemerkt haben, werden moderne CPUs nicht seriell oder in der Reihenfolge ausgeführt. Bis Sie der Programmierer / Benutzer die IP anfordern, ist es wie Quantenphysik, die IP ist eine Welle von Anweisungen ausgeführt wird; alles damit der Prozessor das Programm so schnell wie möglich ausführen kann. Wenn Sie die aktuelle IP-Adresse anfordern (z. B. über einen Debugger-Haltepunkt oder Profiler-Interrupt), muss der Prozessor die erwartete Fiktion neu erstellen, damit er diese Wellenform (alle "In-Flight" -Anweisungen) zusammenfasst und die Registerwerte wieder einträgt Architekturnamen und erstellt einen Kontext für die Ausführung der Debugger-Routine usw.

In diesem Kontext gibt es eine IP, die den Befehl angibt, wo der Prozessor die Ausführung fortsetzen sollte. Während der Ausführung außerhalb der Reihenfolge war dieser Befehl der älteste noch auszuführende Befehl, obwohl der Prozessor zum Zeitpunkt des Interrupts möglicherweise Befehle über diesen Punkt hinaus abgerufen hat.

Zum Beispiel gibt der Interrupt möglicherweise mov RSI, [RBX + RCX]; als IP an, aber der xor wurde bereits ausgeführt und abgeschlossen. Wenn der Prozessor jedoch die Ausführung nach dem Interrupt wieder aufnimmt, führt er den XOR erneut aus.

    
Brian 09.06.2013, 14:11
quelle