アセンブリ命令レベルでコードをプロファイリングするとき、現代の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.
命令ポインタはほとんどの時間を費やしますか?
- は、キャッシュミスであるため、おそらく100sのサイクルを取っています。
mov RSI, [RBX + RCX]
も100sのサイクルを要しますが、おそらく前の命令と並行して実行します。命令ポインタがこれらのどちらか一方にあることさえも意味しますか?xor R8, R8
はおそらく、メモリのロードが完了する前にアウトオブオーダーで終了しますが、以前のすべての命令も終了するまで命令ポインタはここにとどまる場合があります。add RDX, RAX
は、遅いキャッシュミスロードの後にRAX
の値が実際に使用される命令であるため、パイプラインストールを生成します。add RDI, RSI
もロードに依存するので、ストールしますRSI
に。
ハードウェアパフォーマンス監視カウンタがそのコンテキストでどのように動作するかを説明できますか?例えば。 Linuxには、PMCに基づく統計プロファイリングを提供する 'perf'サブシステムがあります。カーネルは高周波割り込みを生成していますか?非常に良いアナロジーによれば、IP波機能を崩壊させてPMCを読み込み、そのPMCの現在の値を現在見つかっているIPに割り当てます機能の崩壊)?その後、PMCをリセットして割り込みから復帰しますか? – oberstet