2

実行時間の特定の属性を分析するために、プログラムの個別の実行でPerfPINの両方を使用して、すべての情報を取得するつもりでした。PIN はインストラクション ミックスを提供し、Perf はそれらのミックスでのハードウェア パフォーマンスを提供します。健全性チェックとして、次のコマンド ライン引数のプロファイルを作成しました。

g++ hello_world.cpp -o hello

したがって、私の完全なコマンドライン入力は次のとおりです。

perf stat -e cycles -e instructions g++ hello_world.cpp -o hello
pin -t icount.so -- g++ hello_world.cpp -o hello

PIN コマンドでは、この投稿のために、ファイルのすべてのパスを無視しました。さらに、基本を変更しicount.soて、デフォルトの動的命令カウントに加えて、命令の組み合わせも記録しました。結果は驚くほど違った

PIN Results:
Count 1180608
14->COND_BR: 295371
49->UNCOND_BR: 21869
//skipping all of the other instruction types for now

Perf Results:
       20,538,346 branches                                                    
       105,662,160 instructions              #    0.00  insns per cycle        

       0.072352035 seconds time elapsed

これは、ほぼ同じ命令数とほぼ同じ分岐分布を持つことにより、健全性チェックとして機能するはずでした。 動的命令カウントが 100 倍もずれているのはなぜですか?! 多少のノイズを期待していましたが、それは少し大きいです。

また、Perf では分岐の量は 20% ですが、PIN では約 25% と報告されています (これも少し広い差異のように見えますが、これはおそらく大量の命令数の歪みによる副作用にすぎません)。

4

1 に答える 1

1

icountpintool によってカウントされるものと、最新の Intel プロセッサinstructionsのアーキテクチャ ハードウェア パフォーマンス イベントにマップされるパフォーマンス イベントとの間には、大きな違いがあります。Instructions RetiredIntel プロセッサを使用していると仮定します。

  • pinコマンド ライン オプションが指定されている場合にのみ子プロセスに挿入され-follow_execv、ピンツールがプロセスの作成をインターセプトするコールバック関数を登録した場合、コールバックは を返しtrueました。一方、perfデフォルトではすべての子プロセスをプロファイリングします。perfオプションを使用して、指定されたプロセスのみをプロファイリングするように指示でき-iます。
  • perfは、既定で、ユーザー モードとカーネル モードで発生するすべてのイベントをプロファイルします (/proc/sys/kernel/perf_event_paranoidが 2 より小さい場合)。pinユーザー モードでのプロファイリングのみをサポートします。
  • icountpintool は基本ブロックの粒度でカウントします。これは基本的に、短い単一エントリ、単一終了の命令シーケンスです。ブロック内の命令が例外を引き起こした場合、ブロック内の残りの命令は実行されませんが、それらは既にカウントされています。プログラムを終了せずに例外を処理することができます。instructions退職時の指示のみをカウントします。
  • icountデフォルトでは、pintool は、接頭辞が付いた命令の各反復を 1 つの命令としてカウントしますrep。このinstructionsイベントは、rep反復回数に関係なく、接頭辞付きの命令を 1 つの命令としてカウントします。
  • 一部のプロセッサでは、instructionsイベントが過大または過少にカウントされる場合があります。

最初のinstructions2 つの理由により、イベント数が大きくなる場合があります。次のicount2 つの理由により、pintool の命令カウントが大きくなる場合があります。最後の理由により、予測できない不一致が生じる可能性があります。perfカウントはカウントの約 100 倍であるためicount、この場合、最初の 2 つの要因が支配的であることは明らかです。

プロファイルの子ではないに渡し、ユーザー モードでのみカウントするイベント名に修飾子を追加し、反復ごとではなく命令ごとに count接頭辞付きの命令をに渡す-iことによって、2 つのツールを取得してより近いカウントを得ることができます。perf:uinstructions-reps 1pinrep

perf stat -i -e cycles,instructions:u g++ hello_world.cpp -o hello
pin -t icount.so -reps 1 -- g++ hello_world.cpp -o hello

に渡す代わりに-i、次のように に渡すことperfができます。-follow_execvpin

pin -follow_execv -t icount.so -reps 1 -- g++ hello_world.cpp -o hello

このように、両方のツールは、指定されたプロセス (つまり、実行中のg++) をルートとするプロセス階層全体をプロファイリングします。

カウントはこれらの測定値に非常に近いと予想されますが、それでも同じにはなりません.

于 2021-04-05T22:31:15.057 に答える