4

我写了一个 Fortran 95 代码并用 gfortran 编译它。我使用了 gprof,发现它给出的时间明显少于 CPU 时间。gprof 告诉我所有函数使用的时间是 15.77 秒。然而,经过的 CPU 时间为 1 分 28 秒。配置文件结果的一瞥如下所示:

    Each sample counts as 0.01 seconds.
    %   cumulative   self              self     total           
    time   seconds   seconds    calls   s/call   s/call  name    
    76.67     12.09    12.09        1    12.09    12.82  __bem_mod_MOD_rradwbem
    15.60     14.55     2.46        1     2.46    15.77  MAIN__
    3.36     15.08     0.53      736     0.00     0.00  __bem_mod_MOD_dbesselh_3d
    3.11     15.57     0.49      140     0.00     0.00  __fem_mod_MOD_feasmbl
    0.70     15.68     0.11    30912     0.00     0.00  __bem_mod_MOD_bdrdn
    0.38     15.74     0.06    30915     0.00     0.00  __bem_mod_MOD_bq1n3
    0.13     15.76     0.02        2     0.01     0.01  __bem_mod_MOD_bdrdn_3d
    0.06     15.77     0.01    30912     0.00     0.00  __bem_mod_MOD_dbesselh_1d

其他功能几乎不需要时间。此代码包含许多复杂的*16 类型矩阵运算。这些操作主要包含在 __bem_mod_MOD_rradwbem 中。

我没有在代码中使用 I/O 操作。

我不清楚为什么 gprof 告诉我的时间比 CPU 时间少?有什么方法可以让我知道时间花在了哪里?我是否可以将代码的速度提高到与 gprof 上显示的速度不相上下的水平?目前我只让(外)循环运行一次,gprof 显示这方面的分析结果。但是我将来需要成千上万个这样的循环。

谢谢

4

1 回答 1

2

您是否尝试过使用tcov

tcov逐行分析,非常老式但在某些环境中仍然有价值。

在此处观看:http: //www.amath.unc.edu/sysadmin/DOC4.0/fortran/prog_guide/8_profiling.doc.html 和手册页。

PS:抱歉,这可能更像是评论,但我没有必要的 50 代表。而且我认为这正是您想要的。

于 2013-12-02T23:39:04.570 回答