アセンブリ命令レベルでコードをプロファイリングする場合、最新の CPU が命令をシリアルまたはインオーダーで実行しないことを考えると、命令ポインターの位置は実際には何を意味するのでしょうか? たとえば、次の x64 アセンブリ コードがあるとします。
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.
命令ポインターが最も多くの時間を費やすのはどの命令ですか? 私はそれらすべてについて良い議論を考えることができます:
mov RAX, [RBX]
キャッシュミスであるため、おそらく数百サイクルかかります。mov RSI, [RBX + RCX]
これも数百サイクルかかりますが、おそらく前の命令と並行して実行されます。命令ポインターがこれらのいずれかにあるとはどういう意味ですか?xor R8, R8
おそらく順不同で実行され、メモリのロードが完了する前に終了しますが、命令ポインターは、前のすべての命令も終了するまでここに留まる可能性があります。add RDX, RAX
はパイプライン ストールを生成しますRAX
。これは、低速のキャッシュ ミス ロード後に の値が実際に使用される命令であるためです。add RDI, RSI
への負荷に依存しているため、 も失速しRSI
ます。