我有一个使用本征矩阵库的C++项目。为了提高性能,我需要获取一个配置文件。我尝试使用gprof,但配置文件包含大量结果,如下所示,其中将其标记为“自发”:

                                                 <spontaneous>
[1]     48.8 2535.09 38010.25                 GaugeField::read_lime_gauge_field_doubleprec_timeslices(double*, char const*, long, long) [1]
             20857.12    0.00 3419496363/5297636514     Eigen::internal::gebp_kernel<std::complex<double>, std::complex<double>, long, Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0>, 1, 4, false, false>::operator()(Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0> const&, std::complex<double> const*, std::complex<double> const*, long, long, long, std::complex<double>, long, long, long, long) [2]
             5844.01 11309.11 3350517373/3366570904     Eigen::internal::gebp_kernel<std::complex<double>, std::complex<double>, long, Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0>, 1, 4, true, false>::operator()(Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0> const&, std::complex<double> const*, std::complex<double> const*, long, long, long, std::complex<double>, long, long, long, long) [4]

有时,直接调用Eigen被标记为自发的。

我将85%的时间用于标记为自发的部分。这没有多大用处,因为我已经知道在我的张量收缩代码中,调用Eigen的开销最大。我需要知道这些调用来自代码的哪一部分。

有什么方法可以使gprof从程序中提取更多有用的信息?

最佳答案

似乎没有消除所有优化的纯gprof真的没有办法解决这个问题。当然,这会使性能测量结果产生偏差,并且毫无用处。

我最后只写了一点代码,以分层的方式跟踪调用。该程序现在在函数顶部定义了许多TimingScope<3>("Diagram::request");对象。然后,这些将自己注册为对单例的正在进行的函数调用。然后,该对象的析构函数将停止该时间,并将其添加到给定节点和边的时间,并从父对象的自身时间推导出该时间。我使用python脚本来生成输出,就像gprof2dot给出的那样:

c&#43;&#43; - gprof用Eigen声明为 “spontaneous”太多-LMLPHP

如果它对我们有用,那么我们可以比gprof更加了解上下文。

09-10 04:51
查看更多