我有一个使用Eigen矩阵库的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从程序中提取更多有用的信息?
答案 0 :(得分:0)
看来,在不删除所有优化的情况下,真的没有办法解决普通的gprof问题。当然,这会使性能测量值产生偏差,并且毫无用处。
我最终只编写了一些代码,该代码以分层的方式跟踪调用。该程序现在在函数顶部定义了一组TimingScope<3>("Diagram::request");
对象。然后,这些将自己注册为对单例的正在进行的函数调用。然后,该对象的析构函数将停止该时间,并将其添加到给定节点和边的时间,并从父对象的自身时间推导出该时间。我使用Python脚本来生成输出,就像gprof2dot给出的那样:
如果该程序对我们有用,那么它使我们可以比gprof更了解上下文。