我已经编写了一个大型Fortran程序(使用新标准(,我目前正在尝试使其运行得更快。 我已经设法使用 gprof 简化了大多数例程,但我有一个非常大的子例程来组织计算,现在占用了近 50% 的 CPU 时间。 我确信此例程中存在几个瓶颈,但我尚未设法设置任何编译或运行程序的参数,因此我可以看到在此例程中花费的时间。 我想要至少一个简单的计数,每行计算了多少时间,或者执行每行花费了多少 CPU 时间。 也许瓦尔格林德是一个更好的工具? 消除内存泄漏非常有用。
我发现的一种解决方法是使用cpu_time
模块。虽然这不会自动执行分析,但如果您愿意投入手动工作,则可以在要分析的语句之前和之后调用cpu_time
。这些时间的差异为您提供了在两次调用cpu_time
之间执行语句所需的总时间。如果语句在循环内,则可以添加这些差异并打印循环外的总时间。
这有点老派,但我喜欢OProfile linux工具集。
如果你有一个 fortran 程序prog
,则运行
operf -gl prog
将运行prog
,并使用内核分析生成prog
的配置文件和调用图。
然后可以将这些输入到类似 KCachegrind 的东西,将它们视为一个漂亮的嵌套矩形图。为了从 operf 输出转换为 KCachegrind 输入,我使用了这个 python 脚本的稍微修改版本。
GCC 中的gcov
工具很好地概述了我的代码中的单个子例程,以发现每行执行了多少次。 包含要"覆盖"的子例程的文件必须编译
gfortran -c -fprofile-arcs -ftest-coverage -g subr.F90
要链接程序,我必须添加-lgcov
作为最后一个库.
运行程序后,我可以使用
gcov subr.F90
创建文件subr.F90.gcov
包含子例程中每行执行次数的信息。 这应该可以发现子例程中的瓶颈。 这是对gprof
的一个很好的补充,它给出了每个子例程的时间,但由于我的程序有超过 50000 行代码,因此能够只选择几个子例程进行此"逐行"调查是很好的。