17

gprof を使用して、私が作成した C++ プログラムのプロファイリングを行っているときに、実行時間の大部分が関数「frame_dummy」で費やされていることに気付きました。より正確には、gprof の出力からのフラット プロファイルの最初のエントリは、サンプル時間の 76.38% と、frame_dummy という名前の関数への 24611191 回の呼び出しを示しています。

要するに、私は frame_dummy が何を参照しているのかを理解しようとしています.

関連する可能性は低いですが、このプログラムは、マルチグリッド アルゴリズムを使用してポアソン方程式を解くように設計されており、MPI を使用してタスクを並列化するように設計されていることを付け加えておきます。ただし、MPI 関数呼び出しは存在しますが、上記の gprof の出力は、単一のプロセスのみを実行して得られたものです。また、私のプログラムには MPI 以外の依存関係がなく、g++ 4.6.1 でコンパイルされていることにも注意してください。

4

2 に答える 2

15

ここに非常に良い説明があります: http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html。しかし、なぜあなたのプログラムが frame_dummy に多くの時間を費やしたのか、なぜ何度も呼び出されたのか、私にはわかりません。

おそらく、バイナリのデバッグ情報が何らかの形で破損しているか、gprof によって読み違えられているのでしょうか? または、gprof が MPI によって混乱する可能性がありますか? ここで試してみてください: gdb でプログラムを実行し、frame_dummy 関数にブレークポイントを設定します。本当に 2,400 万回呼び出されるかどうかを確認し、もしそうなら、何から呼び出されているかを確認してください。

また、これが crtbegin.o の frame_dummy であり、他の frame_dummy ではないことを確認できますか?

crtbegin.cの frame_dummy のソースは次のとおりです。コードを読むと、一度だけ呼び出されるはずです。

また、あなたのプログラムが実行され、正しい結果が得られると仮定していますか? (特に、プログラムにメモリのバグがある場合、かなり奇妙な動作が発生する可能性があります。)

于 2012-12-27T17:52:07.183 に答える
5

同じ問題が発生しました。gprof からの出力は次のとおりです。

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 52.00     16.27    16.27   204000     0.08     0.08  frame_dummy
 47.46     31.12    14.85   418000     0.04     0.07  f2
  0.51     31.28     0.16    21800     0.01     1.42  f1
  0.03     31.29     0.01     1980     0.01    14.21  f5

私の場合、gcc -Os代わりにコンパイルすると解決しましたgcc -O3

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 53.12     22.24    22.24   200000     0.11     0.11  f4
 45.65     41.36    19.11   598000     0.03     0.03  f2
  0.69     41.65     0.29    20000     0.01     1.45  f3
  0.45     41.84     0.19    39800     0.00     0.32  f1
  0.10     41.88     0.04                             evaluate

つまり、gprof は と間違えf4ましたframe_dummy

于 2013-03-11T03:33:09.337 に答える