12

kcachegrdindコードを最適化しようとしている間、とによって生成されたプロファイルの違いに少し戸惑っていますgprof。具体的には、gprof(-pgスイッチとのコンパイルなど)を使用する場合、次のようになります。

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 89.62      3.71     3.71   204626     0.02     0.02  objR<true>::R_impl(std::vector<coords_t, std::allocator<coords_t> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&) const
  5.56      3.94     0.23 18018180     0.00     0.00  W2(coords_t const&, coords_t const&)
  3.87      4.10     0.16   200202     0.00     0.00  build_matrix(std::vector<coords_t, std::allocator<coords_t> > const&)
  0.24      4.11     0.01   400406     0.00     0.00  std::vector<double, std::allocator<double> >::vector(std::vector<double, std::allocator<double> > const&)
  0.24      4.12     0.01   100000     0.00     0.00  Wrat(std::vector<coords_t, std::allocator<coords_t> > const&, std::vector<coords_t, std::allocator<coords_t> > const&)
  0.24      4.13     0.01        9     1.11     1.11  std::vector<short, std::allocator<short> >* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<std::vector<short, std::alloca

これは、私がどこかを探す必要がないことを示唆しているようですが、::R_impl(...)

同時に、-pgスイッチなしでコンパイルしてvalgrind --tool=callgrind ./a.out代わりに実行すると、かなり異なるものがあります。これがkcachegrind出力のスクリーンショットです。

ここに画像の説明を入力してください

これを正しく解釈すると、::R_impl(...)時間の約50%しかかからないのに対し、残りの半分は、プロファイルのはるか下にある線形代数( Wrat(...)、および基礎となるlapack呼び出し)に費やされていることを示唆しているようです。eigenvaluesgprof

私はそれを理解し、さまざまな手法gprofcachegrind使用しています。結果が多少異なっていてもかまいません。しかし、ここでは、それは非常に異なって見えます、そして私はそれらをどのように解釈するかについて途方に暮れています。何かアイデアや提案はありますか?

4

2 に答える 2

14

あなたは間違った列を見ています。kcachegrind出力の2番目の列である「self」を確認する必要があります。これは、特定のサブルーチンがその子を考慮せずにのみ費やした時間です。最初の列には累積時間があり(メインのマシン時間の100%に等しい)、それほど有益ではありません(私の意見では)。

kcachegrindの出力から、プロセスの合計時間が53.64秒であるのに対し、サブルーチン「R_impl」で費やされた時間は46.72秒であり、合計時間の87%であることがわかります。したがって、gprofとkcachegrindはほぼ完全に一致します。

于 2011-08-05T17:51:16.637 に答える
9

gprofインストルメント化されたプロファイラーcallgrindあり、サンプリングプロファイラーです。インストルメント化されたプロファイラーを使用すると、関数の開始と終了ごとにオーバーヘッドが発生します。これにより、特に何度も呼び出される比較的小さな関数がある場合に、プロファイルが歪む可能性があります。サンプリングプロファイラーはより正確になる傾向があります。プログラム全体の実行がわずかに遅くなりますが、これはすべての関数に同じ相対的な影響を与える傾向があります。

RotateRightからのZoomの30日間の無料評価を試してみてください-とcallgrindよりも一致するプロファイルが得られると思いますgprof

于 2011-06-11T15:49:21.883 に答える