1

我已经编写了一个大型 Fortran 程序(使用新标准),我目前正在尝试让它运行得更快。我已经设法使用 gprof 简化了大多数例程,但我有一个非常大的子例程来组织计算,现在几乎占用了 50% 的 CPU 时间。我确信这个例程中有几个瓶颈,但我没有设法设置任何编译或运行程序的参数,所以我可以看到这个例程中的时间花在了哪里。我想至少简单地计算一下每行计算了多少时间,或者执行每行花费了多少 CPU 时间。也许 valgrind 是一个更好的工具?消除内存泄漏非常有用。

4

3 回答 3

0

GCC 中的“gcov”工具很好地概述了我的代码中的单个子例程,以了解每行执行了多少次。带有要“覆盖”的子例程的文件必须使用
gfortran -c -fprofile-arcs -ftest-coverage -g subr.F90 编译,并且要链接程序,我必须添加 -lgcov 作为 LAST 库。
运行程序后,我可以使用 gcov "subr.F90" 创建一个文件 "subr.F90.gcov",其中包含子例程中每行已执行次数的信息。这应该可以发现子程序中的瓶颈。这是对 gprof 的一个很好的补充,它给出了每个子例程的时间,但是由于我的程序有超过 50000 行代码,因此能够为这个“逐行”选择几个子例程真是太好了

于 2019-11-14T15:48:17.477 回答
0

我发现的一种解决方法是使用cpu_timemodule. 虽然这不会自动进行分析,但如果您愿意投入手动工作,您可以cpu_time在要分析的语句之前和之后调用。这些时间的差异为您提供了在两次调用之间执行语句所需的总时间cpu_time。如果语句在循环内,您可以添加这些差异并打印循环外的总时间。

于 2021-09-15T11:01:59.683 回答
0

这有点老派,但我喜欢OProfile linux 工具集。

如果你有一个 fortran 程序prog,那么运行

operf -gl prog

将运行prog并使用内核分析来生成prog.

然后可以将它们馈送到KCachegrind之类的东西,以将它们视为一个漂亮的嵌套矩形图。为了从 operf 输出转换为 KCachegrind 输入,我使用了这个 python 脚本的稍微修改的版本。

于 2021-09-15T18:44:50.630 回答