Profilerstellung auf Befehlsebene: Die Bedeutung des Befehlszeigers?

Was bedeutet die Position des Befehlszeigers beim Erstellen von Codeprofilen auf der Ebene der Assemblyanweisungen wirklich, da moderne CPUs Befehle nicht seriell oder in der richtigen Reihenfolge ausführen? Nehmen Sie beispielsweise den folgenden x64-Assemblycode an:

mov RAX, [RBX];         // Assume a cache miss here.
mov RSI, [RBX + RCX];   // Another cache miss.             
xor R8, R8;        
add RDX, RAX;           // Dependent on the load into RAX.
add RDI, RSI;           // Dependent on the load into RSI.

Für welche Anweisung verbringt der Anweisungszeiger die meiste Zeit? Ich kann mir für alle gute Argumente vorstellen:

mov RAX, [RBX] dauert wahrscheinlich 100s von Zyklen, weil es ein Cache-Miss ist.mov RSI, [RBX + RCX] dauert ebenfalls 100s von Zyklen, wird aber wahrscheinlich parallel zum vorherigen Befehl ausgeführt. Was bedeutet es überhaupt, wenn sich der Befehlszeiger auf dem einen oder anderen befindet?xor R8, R8 Wahrscheinlich wird das Programm nicht in der richtigen Reihenfolge ausgeführt und beendet, bevor das Laden des Speichers beendet ist. Der Befehlszeiger bleibt jedoch möglicherweise hier, bis alle vorherigen Befehle ebenfalls beendet sind.add RDX, RAX generiert einen Pipeline-Stall, weil es der Befehl ist, bei dem der Wert vonRAX wird tatsächlich verwendet, nachdem ein langsamer Cache-Miss geladen wurde.add RDI, RSI kommt auch zum Stillstand, weil es von der Ladung abhängtRSI.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage