标签: gprof

令人困惑的gprof输出

根据我的说法,我运行gprof了一个C++程序,我得到了第一行输出:16.637stime()

%   cumulative   self              self     total           
time   seconds   seconds    calls   s/call   s/call  name    
31.07      0.32     0.32  5498021     0.00     0.00  [whatever]
Run Code Online (Sandbox Code Playgroud)

为什么31.07%它只花了.32几秒钟的时间列表?这是一次通话时间吗?(这不是自我/电话吗?)

这是我第一次使用gprof,所以请善待:)

编辑:通过向下滚动,似乎gprof认为我的程序需要1.03秒.为什么会这么错呢?

c++ optimization profiling gprof

4
推荐指数
2
解决办法
9882
查看次数

如何修改C程序以便gprof可以对其进行分析?

当我在我的C程序上运行gprof时,它表示我的程序没有累积时间,并显示所有函数调用的0时间.但它会计算函数调用.

如何修改我的程序,以便gprof能够计算运行所需的时间?

c linux profiler profiling gprof

4
推荐指数
1
解决办法
7414
查看次数

使用-pg编译时更改gmon.out文件的名称

是否可以更改文件gmon.out的默认名称,该文件是在使用gcc编译时设置了配置文件标志(-pg)时创建的,例如,[可执行文件名] .gmon.out?

我需要这个,因为我有多个可执行文件,它们位于同一目录中,并且必须并行运行.

gcc profiling gprof

4
推荐指数
1
解决办法
4052
查看次数

在fortran代码的gprof输出上_IO_wfile是什么?

我有一些使用intel fortran编译器ifort编译的fortran代码.当我使用gprof进行配置文件测试时,我得到的大部分时间用于IO操作,我想找到文件的结尾,但我找不到更多关于此的文档:

index % time    self  children    called     name
                                                 <spontaneous>
[1]     20.6    0.07    0.00                 _IO_wfile_seekoff [1]
-----------------------------------------------
                                                 <spontaneous>
[2]     20.6    0.07    0.00                 sforcepf_ [2]
-----------------------------------------------
                                                 <spontaneous>
[3]     20.6    0.02    0.05                 _IO_wfile_underflow [3]
                0.01    0.04  258716/258717      strncmp [4]
-----------------------------------------------
                0.00    0.00       1/258717      _IO_wdefault_doallocate [15]
                0.01    0.04  258716/258717      _IO_wfile_underflow [3]
[4]     14.7    0.01    0.04  258717         strncmp [4]
                0.04    0.00 3104592/3109256     strerror_r [5]
-----------------------------------------------
                0.00    0.00    4664/3109256     __strcmp_sse42 [14]
                0.04    0.00 3104592/3109256     strncmp [4]
[5]     11.8    0.04    0.00 3109256         strerror_r [5]
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)

那么,问题是,这个IO是针对Linux,还是针对ifort,还是针对fortran?我正在尝试优化此代码,并且在google中找不到有关此条款的有用信息.

fortran gprof intel-fortran

4
推荐指数
1
解决办法
511
查看次数

GProf 输出中缺少函数

我正在尝试分析一些 C 代码,但最直观地成本最高的函数之一并未出现在 GProf 输出中。

int main() {
    initialise...
    haloSwap();

    for(...) {
        functions...

        propagate();

        functions...
    }
}

void propagate() {
    for (x)
        for (y)
            for (z)
                grid[xNew][yNew][zNew] = grid[x][y][z];

    haloSwap();
}

void haloSwap() {
    // Horizontal swap
    create buffers...
    MPI_Sendrecv(buffers);
    recreate grid from buffers...

    // Vertical swap
    create buffers...
    MPI_Sendrecv(buffers);
    recreate grid from buffers...
}
Run Code Online (Sandbox Code Playgroud)

希望伪代码能够以某种方式解释设置。haloSwap()涉及线程之间的大量通信,我觉得这是算法中昂贵的部分。它在初始化期间被调用,然后在算法循环期间被重复调用。

GProf 仅显示 1 次调用haloSwap(在 init 期间),尽管我知道它从内部被调用了 1000 多次propagate()

propagate()显示为代码中最昂贵的部分,但我想知道它是 xyz 循环还是 MPI 通信。

haloSwap有谁知道为什么对from的调用propagate在调用次数和函数中花费的时间上似乎都被忽略了? …

c mpi gprof

4
推荐指数
1
解决办法
3989
查看次数

linux:有什么工作是“gprof”可以做而“perf”不能做的吗?需要澄清

这两个工具都是 Linux 性能和分析探测工具。我发现“perf”看起来更强大,因为它可以追溯到内核调用级别。所以我的问题是,有了“perf”,是否还需要学习和保留“gprof”/

我的意思是,有没有什么工作只能用 gprof 才能完成,而 perf 却不能很好地工作?

linux comparison performance gprof perf

4
推荐指数
1
解决办法
4542
查看次数

简单的操作浪费时间?

我正在寻找一个简单的操作/例程,如果连续重复,可以"浪费"时间.

我正在研究如何将gprof配置文件应用程序,因此这个"浪费时间"需要在用户空间中浪费时间,并且不需要外部库.IE,调用sleep(20)将"浪费"20秒的时间,但gprof不会记录这次,因为它发生在另一个库中.

对于可以重复浪费时间的简单任务的任何建议?

c++ benchmarking profiling gprof

3
推荐指数
2
解决办法
1723
查看次数

使用__gnu_mcount_nc捕获函数退出时间

我正在尝试对支持不佳的原型嵌入式平台进行一些性能分析.

我注意到GCC的-pg标志导致__gnu_mcount_nc在每个函数的入口处插入thunk .没有__gnu_mcount_nc可用的实现(并且供应商对协助不感兴趣),但是因为编写一个简单记录堆栈帧和当前循环计数的操作是微不足道的,所以我已经这样做了; 这工作正常,并且在调用者/被调用者图和最常被称为函数方面产生有用的结果.

我真的想获得有关在函数体中花费的时间的信息,但是我很难理解如何只使用条目而不是退出来解决这个问题,每个函数都被钩住了:你可以确切地知道每个函数的确切时间输入,但没有挂钩退出点,你不知道多少时间,直到你收到下一条信息属于被叫者和呼叫者多少.

尽管如此,GNU概要分析工具实际上可以在许多平台上收集函数的运行时信息,因此可能开发人员在实现这一目标时需要考虑一些方案.

我已经看到一些现有的实现,它们执行诸如维护阴影调用堆栈并将入口处的返回地址旋转到__gnu_mcount_nc,以便在被调用者返回时再次调用__gnu_mcount_nc; 然后,它可以将调用者/被调用者/ sp三元组与影子调用堆栈的顶部进行匹配,从而将此案例与条目调用区分开来,记录退出时间并正确返回调用者.

这种方法还有很多不足之处:

  • 在没有-pg标志的情况下,在递归和库编译的情况下,它似乎很脆弱
  • 在没有工具链TLS支持且当前线程ID可能昂贵/复杂的嵌入式多线程/多核环境中,似乎难以实现低开销或完全实现

是否有一些明显更好的方法来实现__gnu_mcount_nc,以便-pg构建能够捕获函数退出以及我缺少的入口时间?

c++ gcc profiling gprof

3
推荐指数
1
解决办法
2836
查看次数

如何在 MPI 代码上从 gprof 获得有意义的结果?

我正在优化 MPI 代码并且正在使用 Gprof。问题是我得到的结果完全不合理。我的工作流程如下:

  • 编译代码添加-pg为编译标志。

  • 运行代码mpirun -np Nproc EXEC.exe arg1 ... argN

  • 在可执行文件上运行 gprof gprof EXEC.exe

这有什么问题?

hpc mpi gprof

3
推荐指数
1
解决办法
1064
查看次数

gprof 输出不准确

我正在尝试使用 gprof 分析 C++ 函数,我对所花费的 %时间感兴趣。我跑了不止一次,由于某种原因,结果有很大差异。我不知道是什么原因造成的,我假设采样率或者我在其他帖子中读到 I/O 与此有关。那么有没有一种方法可以使其更加准确并以某种方式产生几乎恒定的结果呢?

我在想以下几点:

  1. 提高采样率
  2. 在执行任何操作之前刷新缓存
  3. 使用另一个探查器,但我希望它以与 grof 类似的格式生成结果,作为函数时间%函数名称,我尝试了 Valgrind,但它给了我一个巨大的文件大小。所以也许我使用错误的命令生成文件。

等待您的输入

问候

c++ profiling gprof

2
推荐指数
1
解决办法
4566
查看次数