Fortran分析:获取行执行计数

时间:2012-10-25 11:32:42

标签: profiling fortran intel gprof

我在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,其输出 - 原则 - 似乎正是我需要的。

感谢您的帮助!

2 个答案:

答案 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分析。