実行時間の特定の属性を分析するために、プログラムの個別の実行でPerfとPINの両方を使用して、すべての情報を取得するつもりでした。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% と報告されています (これも少し広い差異のように見えますが、これはおそらく大量の命令数の歪みによる副作用にすぎません)。