2013-06-09 34 views
8

アセンブリ命令レベルでコードをプロファイリングするとき、現代の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に。

答えて

6

CPUは、アーキテクチャレジスタ(RAX、RBXなど)のみが存在し、特定の命令ポインタ(IP)が存在するというフィクションを維持します。プログラマーやコンパイラがこのフィクションをターゲットにしています。

ご存知のように、現代のCPUはシリアルまたは順番に実行されません。あなたがプログラマー/ユーザーがIPを要求するまで、それはQuantum Physicsのようなもので、IPは実行されている命令の波です。すべてのプロセッサは、できるだけ速くプログラムを実行できるようにします。現在のIPを要求すると(たとえば、デバッガのブレークポイントまたはプロファイラ割り込みなど)、プロセッサは、この波形を折りたたむように(すべての「飛行中」の指示で)フィジカルを再作成し、レジスタ値をアーキテクチャ名、およびデバッガルーチンを実行するためのコンテキストを構築する。

このコンテキストでは、プロセッサが実行を再開する命令を示すIPがある。アウト・オブ・オーダー実行中、この命令はまだ完了していない最も古い命令であったが、割込みの時点でプロセッサはおそらく命令をその時点より先にフェッチしていた。

たとえば、おそらく割り込みはIPとしてmov RSI, [RBX + RCX];を示しますが、xorはすでに実行され完了していると思われます。ただし、プロセッサが割り込み後に実行を再開すると、xorが再実行されます。

+1

ハードウェアパフォーマンス監視カウンタがそのコンテキストでどのように動作するかを説明できますか?例えば。 Linuxには、PMCに基づく統計プロファイリングを提供する 'perf'サブシステムがあります。カーネルは高周波割り込みを生成していますか?非常に良いアナロジーによれば、IP波機能を崩壊させてPMCを読み込み、そのPMCの現在の値を現在見つかっているIPに割り当てます機能の崩壊)?その後、PMCをリセットして割り込みから復帰しますか? – oberstet