2011-11-30 12 views
4

私はこれに私の歯を噛んでいます...gccコンパイル済みコードとARM Cortex A8ターゲットでコールグラフプロファイリングを行うにはどうすればよいですか?

私はARMボード上でプロファイリングを行う必要があり、コールグラフを表示する必要があります。私はOProfile、Kernel perf、Googleのパフォーマンスツールを試してみました。すべて正常に動作しますが、コールグラフの情報は出力されません。

これは私のコードを正しくコンパイルしていないという結論に至りました。私のC++コードをコンパイルするとき

は、私は以下のフラグを使用します。

をアーチ特定:

-march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -mfpu=vfpv3 

全般:(最適化)

-fexceptions -fno-strict-aliasing -D_REENTRANT -Wall -Wextra 

デバッグ:

-O2 -g -fno-omit-frame-pointer 

I di d多くのGoogle検索で、関連するトピックが見つかりました:

  • libunwind?
  • ドワーフ
  • (asynchronous-)くつろぐ-テーブル、私は完全にこれらが全て接続されているかを理解していないが
  • -mapcs-frame

。コールグラフをどのように動かすかについてのヒント?

ノート(私はRianの答えによる):いくつかの方法がx86-64よりARM上で(他のものと比べて)時間がかかるのかどうかを調べることに興味があります。私のコードは両方でコンパイルされ、私はx86-64上でコールグラフを実行できますが、これは別のプラットフォームでこれを行うのに役立ちません。

+0

は、あなたがハード= -mfloat-ABIでコンパイルしてもよろしいでしょうか?私が理解しているところから、mfloat-abi = softfpはまだNEONを使用していますが、既存のバイナリと互換性がありますが、mfloat-abi = hardのようにパフォーマンスはあまり良くありません。https://wiki.linaro.org/Linaro-arm-hardfloat –

+0

hardパフォーマンスを向上させる必要があります。 –

+0

oprofileはカーネルによって異なります。プロファイリングを容易にするためにカーネルを再構成しましたか? – accuya

答えて

2

私はARM Cortex-A8でプロファイリングしたいと思っていますが、コールグラフに興味がある場合は、x86用にコンパイルしてvalgrindのcallgrindツールを実行し、kcachegrindで結果を調べてください。

2つのアーキテクチャ間でコールグラフが同じである必要があります。たとえ関数がわずかに異なる場合でも、関数間の関係は変更してはなりません。

特別なフラグは必要ありません:

valgrind --tool=callgrind -v --dump-every-bb=10000000 ./some-app 
kcachegrind & 
+1

私は特に関数ごとの累積時間(サブコールを含む)に興味がありますので、いくつかの使用パターンがプラットフォーム固有のパフォーマンスにどのように影響するかを見ることができます。 「呼び出しチェーンごとに」関係が異なるため、あるプラットフォームから別のプラットフォームに転送するのは困難です。しかし、あなたの答えは、タイミングに興味を持たずにコールグラフを取得したいと思っている人のための良いアドバイスです。 +1 –

関連する問題