尽管gprof说的是,代码速度较慢

时间:2016-06-27 08:44:55

标签: c++ gprof

我已获得优化的c ++代码,第一步是引入OpenMP的并行性。我能够确定几个非常需要优化的函数,所以我专注于它们。

问题是,当分析文件似乎告诉我它应该快得多时,执行时间已经乘以2左右。

以下是我在不使用OpenMP时获得的gprof配置文件:

38.07      5.55     5.55                             __tcf_0
 20.99      8.61     3.06 86196302     0.04     0.04  is_neighbor(int, int, int, int, double)
 13.24     10.54     1.93   425940     4.53     4.53  Ellips::data_fiting(double*, int, int, double) const
  9.05     11.86     1.32                             _fu51___ZSt4cout
  5.90     12.72     0.86  5645243     0.15     0.15  Ellips::Ellips()
  3.70     13.26     0.54  4013067     0.13     0.13  intersect(Ellips&, Ellips&)
  2.40     13.61     0.35                             dgemv_
  1.44     13.82     0.21                             ddot_
  1.23     14.00     0.18 141257881     0.00     0.00  Configuration::get_position(int)
  1.03     14.15     0.15                             __tcf_0
  0.82     14.27     0.12   594893     0.20     0.20  Ellips::Ellips(double, double, int, int)
  0.41     14.33     0.06     7099     8.45   400.75  Configuration::Configuration(double, double, int, int, int, int, double*, double)
  0.34     14.38     0.05  3203279     0.02     0.02  Ellips::operator=(Ellips const&)
  0.34     14.43     0.05                             ceil
  0.21     14.46     0.03                             dnrm2_
  0.14     14.48     0.02                             _fu32___ZSt4cout
  0.14     14.50     0.02                             dcopy_
  0.14     14.52     0.02                             dscal_
  0.07     14.53     0.01  7775127     0.00     0.00  Configuration::get_Ellips(int)
  0.07     14.54     0.01  6239588     0.00     0.00  Ellips::~Ellips()
  0.07     14.55     0.01  4349523     0.00     0.00  Configuration::get_data_fit(int)
  0.07     14.56     0.01     7097     1.41     1.41  Graph<float, float, float>::maxflow(bool, Block<int>*)
  0.07     14.57     0.01                             _fu53___ZNSs4_Rep20_S_empty_rep_storageE
  0.07     14.58     0.01                             floor
  0.00     14.58     0.00 432232036     0.00     0.00  Configuration::save_config(std::string)
  0.00     14.58     0.00  1180034     0.00     0.00  Ellips::data_fiting(double, double*, double*, double, int, int, double) const
  0.00     14.58     0.00  1173980     0.00     0.00  Ellips::get_cx() const
  0.00     14.58     0.00  1164513     0.00     0.02  Configuration::add_Ellips(Ellips const&, int, double)
  0.00     14.58     0.00  1157360     0.00     0.00  Ellips::get_cy() const
  0.00     14.58     0.00   425940     0.00     0.00  shift_cost_exp1(double, double)
  0.00     14.58     0.00    23625     0.00     0.00  Graph<float, float, float>::augment(Graph<float, float, float>::arc*)
  0.00     14.58     0.00    22504     0.00     0.00  Graph<float, float, float>::process_sink_orphan(Graph<float, float, float>::node*)
  0.00     14.58     0.00    21293     0.00    27.35  Configuration::operator=(Configuration const&)
  0.00     14.58     0.00    14203     0.00     0.23  Configuration::~Configuration()
  0.00     14.58     0.00    14196     0.00     0.00  Configuration::get_nb_Ellipses()
  0.00     14.58     0.00     7097     0.00    34.30  Configuration::Configuration(Ellips const&, int, double, int)
  0.00     14.58     0.00     7097     0.00     0.00  Graph<float, float, float>::maxflow_init()
  0.00     14.58     0.00     7097     0.00     0.00  Graph<float, float, float>::reset()
  0.00     14.58     0.00     2406     0.00     0.00  Ellips::get_a() const
  0.00     14.58     0.00     2406     0.00     0.00  Ellips::get_b() const
  0.00     14.58     0.00     2406     0.00     0.00  Ellips::get_theta() const
  0.00     14.58     0.00     1137     0.00     0.00  Graph<float, float, float>::process_source_orphan(Graph<float, float, float>::node*)
  0.00     14.58     0.00        7     0.00    38.00  Configuration::Configuration(Configuration const&)
  0.00     14.58     0.00        3     0.00     0.32  Configuration::Configuration()
  0.00     14.58     0.00        2     0.00     0.00  min_max_val(_IplImage*, double&, double&)
  0.00     14.58     0.00        1     0.00     0.00  convert_char_to_double(_IplImage*, double*)
  0.00     14.58     0.00        1     0.00     0.00  Graph<float, float, float>::reallocate_nodes(int)
  0.00     14.58     0.00        1     0.00     0.00  Graph<float, float, float>::Graph(int, int, void (*)(char*))

这是我用OpenMP获得的代码(代码是一个递归算法,没有真正的&#34;结束&#34;,这两个配置文件是在主循环的大约7000次迭代之后获得的。)

36.57      4.45     4.45                             __tcf_0
 25.72      7.58     3.13 86434458     0.04     0.04  is_neighbor(int, int, int, int, double)
 12.41      9.09     1.51                             _fu51___ZSt4cout
  7.97     10.06     0.97  5646276     0.17     0.17  Ellips::Ellips()
  4.35     10.59     0.53  4020048     0.13     0.13  intersect(Ellips&, Ellips&)
  2.47     10.89     0.30                             dgemv_
  1.73     11.10     0.21                             ddot_
  1.64     11.30     0.20 141852099     0.00     0.00  Configuration::get_position(int)
  1.15     11.44     0.14     7038    19.89   164.95  Configuration::Configuration(double, double, int, int, int, int, double*, double)
  1.07     11.57     0.13   589659     0.22     0.22  Ellips::Ellips(double, double, int, int)
  0.99     11.69     0.12                             __tcf_0
  0.90     11.80     0.11   422280     0.26     0.33  Ellips::data_fiting(double*, int, int, double) const
  0.74     11.89     0.09  3208793     0.03     0.03  Ellips::operator=(Ellips const&)
  0.41     11.94     0.05                             ceil
  0.25     11.97     0.03   422280     0.07     0.07  shift_cost_exp1(double, double)
  0.25     12.00     0.03                             GOMP_parallel_end
  0.25     12.03     0.03                             _fu53___ZNSs4_Rep20_S_empty_rep_storageE
  0.16     12.05     0.02    21110     0.95    32.56  Configuration::operator=(Configuration const&)
  0.16     12.07     0.02     7036     2.84     2.84  Graph<float, float, float>::maxflow(bool, Block<int>*)
  0.16     12.09     0.02                             _fu32___ZSt4cout
  0.16     12.11     0.02                             daxpy_
  0.16     12.13     0.02                             dnrm2_
  0.08     12.14     0.01  1171018     0.01     0.04  Configuration::add_Ellips(Ellips const&, int, double)
  0.08     12.15     0.01                             GOMP_parallel_start
  0.08     12.16     0.01                             dcopy_
  0.08     12.17     0.01                             dgemm_
  0.00     12.17     0.00 432088679     0.00     0.00  Configuration::save_config(std::string)
  0.00     12.17     0.00  7813683     0.00     0.00  Configuration::get_Ellips(int)
  0.00     12.17     0.00  6235383     0.00     0.00  Ellips::~Ellips()
  0.00     12.17     0.00  4360587     0.00     0.00  Configuration::get_data_fit(int)
  0.00     12.17     0.00  1187310     0.00     0.00  Ellips::data_fiting(double, double*, double*, double, int, int, double) const
  0.00     12.17     0.00  1163572     0.00     0.00  Ellips::get_cx() const
  0.00     12.17     0.00  1147536     0.00     0.00  Ellips::get_cy() const
  0.00     12.17     0.00    35748     0.00     0.00  Graph<float, float, float>::augment(Graph<float, float, float>::arc*)
  0.00     12.17     0.00    33436     0.00     0.00  Graph<float, float, float>::process_sink_orphan(Graph<float, float, float>::node*)
  0.00     12.17     0.00    14081     0.00     0.00  Configuration::~Configuration()
  0.00     12.17     0.00    14074     0.00     0.00  Configuration::get_nb_Ellipses()
  0.00     12.17     0.00     7036     0.00    39.10  Configuration::Configuration(Ellips const&, int, double, int)
  0.00     12.17     0.00     7036     0.00     0.00  Graph<float, float, float>::maxflow_init()
  0.00     12.17     0.00     7036     0.00     0.00  Graph<float, float, float>::reset()
  0.00     12.17     0.00     2424     0.00     0.00  Ellips::get_a() const
  0.00     12.17     0.00     2424     0.00     0.00  Ellips::get_b() const
  0.00     12.17     0.00     2424     0.00     0.00  Ellips::get_theta() const
  0.00     12.17     0.00     2355     0.00     0.00  Graph<float, float, float>::process_source_orphan(Graph<float, float, float>::node*)
  0.00     12.17     0.00        7     0.00    44.91  Configuration::Configuration(Configuration const&)
  0.00     12.17     0.00        3     0.00     0.37  Configuration::Configuration()
  0.00     12.17     0.00        2     0.00     0.00  min_max_val(_IplImage*, double&, double&)
  0.00     12.17     0.00        1     0.00     0.00  convert_char_to_double(_IplImage*, double*)
  0.00     12.17     0.00        1     0.00     0.00  Graph<float, float, float>::reallocate_nodes(int)
  0.00     12.17     0.00        1     0.00     0.00  Graph<float, float, float>::Graph(int, int, void (*)(char*))

我是如何使用探查器的?或者这是来自代码本身?使用OpenMP完成1000次迭代大约需要12秒,而使用OpenMP需要大约31秒(使用omp_get_wtime()而不是clock())

0 个答案:

没有答案