1

我在 Linux 上使用 Intel Fortran Compiler (v. 12.0.3)。我想执行分析gprof并获得一个基本块计数,所有行都标有自己的运行计数,但我设法获得的只是程序/子例程/函数级别的计数。我的结论是我的编译器标志错误,但是尽管在网上查看并阅读了ifort手册页,但我无法弄清楚我应该做什么而不是我在做什么......

我在编译时使用了以下标志:

-w -O0 -g -pg 

这就是我调用的方式gprof

gprof -l -A -x path/to/exe gmon.out > OUT

起初看起来好像所有行都标有运行频率,但事实证明,每个块/行只是获取过程计数(在下面的简短示例中,该函数被调用 43679 次,'if' 和例如,“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,其输出 - 原则上 - 似乎正是我所需要的。

谢谢你的帮助!

4

2 回答 2

1

要获取行执行计数,请使用gcov,而不是gprof。Gprof 是统计分析(它将检查您的程序每秒运行 100 次的位置),而 Gcov 是具有每个基本块粒度的覆盖实用程序(正是您需要的)。

不能说,是否可以直接将gcov与intel fortran编译器一起使用。但是您可以将它与 gfortran/g95 一起使用 - 每行计数执行应该是相同的。

于 2012-10-29T19:56:13.057 回答
1

据我从测试中了解到,ifort 仅支持使用 gprof 进行功能级分析,因此 gprof 标志 -l 在您的情况下是无用的。另一方面,在最近的版本中,gcc/gfortran 也不再支持使用 gprof 进行行分析,并且如前所述,在这种情况下使用的工具是 gcov(有关更多信息,请参见 man gcc)。但是,据说 gcov 可能与 gcc(当然还有 gfortran)以外的编译器不兼容,因此您可能必须使用 Intel 专有工具进行 ifort 分析。

于 2013-08-22T10:23:51.223 回答