2009-07-12 11 views
2

私のコードでいくつかのCPU命令を数えたいと思います。例えばどのように多くの加算、いくつの乗算、どのように多くの浮動小数点演算、私のコードが実行する分岐の数を知っていると思います。私は現在、Linuxでgprofを使用してC++コードのプロファイリングを行っていますが、関数への呼び出し回数を指定するだけで、手動で命令数を見積もります。私のためのトリックを行う可能性のあるツールはありますか?多分いくつかの仮想マシン?プロファイリングの指示

答えて

2

あなただけの好奇心のうち、この

+0

命令を直接カウントするのではなく、非常に便利な方法でアセンブリをブラウズするのに役立ちます。ありがとう。 –

5

実際に命令を数える必要があるのであれば、おそらくアセンブラを生成し、その出力をインテリジェントなgrep同等物に渡すのが最良です。 gccの場合は、-Sスイッチを試してください。

0

を達成するために--dump-instr=yesフラグとValgrindCallgrindを使用することができるかもしれ、コードのパフォーマンスをプロファイリングする便利な方法を指示がカウントされますか?

「シンプルな」CPU設計の時代には、各オペコードがCPUの実行にかかるCPU時間がちょうど多すぎると思うかもしれませんが、最近はすべての複雑なメモリキャッシュ方式で、パイプライン処理、スーパースカラ・アーキテクチャ、および現代のCPUに投げ込まれたすべてのものは、オペコード実行の単純なカウントによって、実行するコードの長さがわかります。あるいは、実行時間は、メモリアクセスパターンやopcodeの実行の生の頻度と同じようにopcodeが実行されるかどうかに基づいて多少異なるでしょうか?

最近、コードのパフォーマンスを確実に予測する唯一の方法は、実際にターゲットアーキテクチャでコードを実行して時間を掛けることです。つまり、コンパイラが非効率的なコードを発行したように見える場合は、現代のCPUアーキテクチャーの微妙な機能を利用して、賢明なことをしてください。

+0

確かに、今までより多くの変数があり、正確な予測は難しいです。命令数よりも重要な要素が多くあります。それにもかかわらず、ある種の関係は真実であり、コスト(追加)<=コスト(掛け算)<=コスト(分割)<=コスト(平方根)のような予測可能な将来には真実のままです。乗数を乗じて除算を置き換えると、パフォーマンスが低下する可能性は低く、助けになる可能性があります。 –

+0

あなたは正しいパフォーマンスを発揮します。しかし、私の目標はパフォーマンスのためにコードを最適化するのではなく、他のタイプの分析(命令の種類と頻度)を行うことです。 –

1

Intels vtuneは、Linuxユーザ、AFAIK(Intelベースのx86 Linuxマシンについて話していると仮定していると仮定して)には無料です。それはあなたに必要なすべての情報とSOOOを提供します。

+1

コンパイラと同様、Vtuneは「評価」として30日間のみ無料です。それは$ 699としてリストされています。 "無料"からかなり遠いフェッチ。 – greyfade

+0

私の間違い私はLinuxユーザーのために自由に使うことができると確信しています...または多分私はちょうど怒っています.... – Goz

4

これは一般的なアドバイスであり、Linux特有のものではありません。代わりにCPUサイクルに関心があります。パフォーマンスの指標としての命令数を忘れてしまいます。 1つの手順で他の10と同じコストがかかる場合がありますので、何も教えてくれません。

CPUサイクルとマルチスレッド環境(今日ではないにしても大部分ではないにしてもほとんど)にスレッドをスリープ状態にしておくことに焦点を当てる必要があります。 I/O、DBなどが完了するのを待っており、CPU特権時間に影響を与えます。

+0

+1そしてメモリアクセス(キャッシュヒット/ミス)は実際のパフォーマンスを決定する際に大きな役割を果たすことができますオペレーションはそれについて何も言わないでしょう。 – sharptooth

0

pin-instatPINツールです。それを使用するには、PINをインストールする必要があります。しかし、命令数だけではパフォーマンスについてはあまり言いません。キャッシュミス、分岐予測も大きな役割を果たします。

免責事項:私はpin-instatの著者です。

関連する問題