Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐行分析Fortran子例程_Fortran_Code Profiling - Fatal编程技术网

逐行分析Fortran子例程

逐行分析Fortran子例程,fortran,code-profiling,Fortran,Code Profiling,我已经编写了一个大型Fortran程序(使用新标准),目前正在努力使其运行更快。我已经设法使用gprof简化了大多数例程,但是我有一个非常大的子例程来组织计算,现在几乎占用了50%的CPU时间。我确信在这个例程中有几个瓶颈,但我还没有设置编译或运行程序的任何参数,这样我就可以看到在这个例程中花费的时间。我想至少一个简单的计数多少时间,每行计算或多少CPU时间是花在执行每一行。也许valgrind是一个更好的工具?消除内存泄漏非常有用。GCC中的“gcov”工具提供了代码中单个子例程的良好概述,以

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

GCC中的“gcov”工具提供了代码中单个子例程的良好概述,以发现每行执行了多少次。必须使用
gfortran-c-fprofile arcs-ftest覆盖率-g subr.F90 为了链接程序,我必须添加-lgcov作为最后一个库。
运行程序后,我可以使用 gcov“子R.F90” 创建文件“subr.F90.gcov”
包含子例程中每行已执行次数的信息。这将使发现子例程中的瓶颈成为可能。这是对gprof的一个很好的补充,它给出了每个子例程中的时间,但由于我的程序有50000多行代码,因此能够为这一“逐行”调查选择几个子例程是很好的。

我不知道您称之为“新标准”是什么,但您使用了标记。请注意,1990年几乎是30年前,Fortran 90之后出现了几次新的标准修订。请对所有Fortran问题使用标记,并仅在需要指定时添加特定版本标记-这里不是这种情况,评测或调试工具不关心是旧Fortran 90、2003还是2018,更多的人使用Fortran标记。工具建议在本网站上不是真正的主题,但我在使用Oracle Performance Analyzer时取得了一些不错的效果,即使与gfortran或其他编译器一起使用也是如此。Gprof可以提供一些有价值的见解,但实际上是每行记录,只记录每个函数。您没有量化50%的含义。如果你想把毫秒缩短几微秒,那你是在浪费时间。如果是数小时或数天,那么请阅读您关于
cpu\u时间
的文档,并在整个子例程中为各个部分记录时间。我认为不鼓励询问工具建议的原因之一是搜索引擎非常擅长于此。试着用你最喜欢的搜索引擎搜索术语profilingfortran代码,你会很快发现很多有趣的东西。如果你在Linux上,试试Linux“perf”统计分析器。看见基本用法非常简单,基本上是“perf record./a.out”,然后使用“perf report”查看报告。