我在Linux上使用英特尔Fortran编译器(v.12.0.3)。我想用gprof
执行分析,并使用所有标记为的行来获取基本的块数,并使用自己的运行计数,但我设法获得的是对程序的计数/子程序/功能级别。我的结论是我的编译器标志错了,但是尽管在网上查看并阅读ifort
手册页,但我无法弄清楚我应该做什么而不是我在做什么... < / p>
我在编译时使用了标志:
-w -O0 -g -pg
以下是我如何调用gprof
:
gprof -l -A -x path/to/exe gmon.out > OUT
首先看起来好像所有行都标记了它们的运行频率,但事实证明每个块/行只是获得了程序计数(在下面的简短示例中,该函数被称为43679次,并且两者都是'如果'和'else',例如,标有43679,这没有意义):
43679 -> function variance_from_index (indices,array)
! declarations
43679 -> if (ubound(indices,1).eq.2) then
43679 -> variance_from_index = array(indices(1),indices(2))
else
43679 -> do i=1,ubound(indices,1)-1
43679 -> do j=i+1,ubound(indices,1)
43679 -> items(1:2) = (/indices(i),indices(j)/)
我已经在英特尔论坛上发布了我的问题,到目前为止我收到了一条回复,其中指出了英特尔的codecov
工具。尽管这是一个非常有用的应用程序,但它似乎不符合我当前的需求,因为似乎没有为每行代码输出运行计数的选项。我更喜欢使用gprof
,其输出 - 原则 - 似乎正是我需要的。
感谢您的帮助!
答案 0 :(得分:1)
要获取行执行次数,请使用gcov
,而不是gprof
。 Gprof是统计分析(它将检查您的程序在每秒运行100次的位置)和Gcov是覆盖实用程序,具有每个基本的块粒度(正是您需要的)。
不能说,是否可以直接使用带有intel fortran编译器的gcov。 但是您可以将它与gfortran / g95一起使用 - 每行计数执行应该是相同的。
答案 1 :(得分:1)
据我所知,ifort只支持使用gprof进行功能级别的分析,因此gprof标志-l在你的情况下是无用的。另一方面,gcc / gfortran在最近的版本中也不支持使用gprof进行行分析,并且如前所述,在这种情况下使用的工具是gcov(有关详细信息,请参阅man gcc)。然而,据说gcov可能与gcc(当然还有gfortran)之外的编译器不兼容,因此您可能必须使用英特尔专有工具进行ifort分析。