根据我的说法,我运行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程序上运行gprof时,它表示我的程序没有累积时间,并显示所有函数调用的0时间.但它会计算函数调用.
如何修改我的程序,以便gprof能够计算运行所需的时间?
是否可以更改文件gmon.out的默认名称,该文件是在使用gcc编译时设置了配置文件标志(-pg)时创建的,例如,[可执行文件名] .gmon.out?
我需要这个,因为我有多个可执行文件,它们位于同一目录中,并且必须并行运行.
我有一些使用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中找不到有关此条款的有用信息.
我正在尝试分析一些 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在调用次数和函数中花费的时间上似乎都被忽略了? …
这两个工具都是 Linux 性能和分析探测工具。我发现“perf”看起来更强大,因为它可以追溯到内核调用级别。所以我的问题是,有了“perf”,是否还需要学习和保留“gprof”/
我的意思是,有没有什么工作只能用 gprof 才能完成,而 perf 却不能很好地工作?
我正在寻找一个简单的操作/例程,如果连续重复,可以"浪费"时间.
我正在研究如何将gprof配置文件应用程序,因此这个"浪费时间"需要在用户空间中浪费时间,并且不需要外部库.IE,调用sleep(20)将"浪费"20秒的时间,但gprof不会记录这次,因为它发生在另一个库中.
对于可以重复浪费时间的简单任务的任何建议?
我正在尝试对支持不佳的原型嵌入式平台进行一些性能分析.
我注意到GCC的-pg标志导致__gnu_mcount_nc在每个函数的入口处插入thunk .没有__gnu_mcount_nc可用的实现(并且供应商对协助不感兴趣),但是因为编写一个简单记录堆栈帧和当前循环计数的操作是微不足道的,所以我已经这样做了; 这工作正常,并且在调用者/被调用者图和最常被称为函数方面产生有用的结果.
我真的想获得有关在函数体中花费的时间的信息,但是我很难理解如何只使用条目而不是退出来解决这个问题,每个函数都被钩住了:你可以确切地知道每个函数的确切时间输入,但没有挂钩退出点,你不知道多少时间,直到你收到下一条信息属于被叫者和呼叫者多少.
尽管如此,GNU概要分析工具实际上可以在许多平台上收集函数的运行时信息,因此可能开发人员在实现这一目标时需要考虑一些方案.
我已经看到一些现有的实现,它们执行诸如维护阴影调用堆栈并将入口处的返回地址旋转到__gnu_mcount_nc,以便在被调用者返回时再次调用__gnu_mcount_nc; 然后,它可以将调用者/被调用者/ sp三元组与影子调用堆栈的顶部进行匹配,从而将此案例与条目调用区分开来,记录退出时间并正确返回调用者.
这种方法还有很多不足之处:
是否有一些明显更好的方法来实现__gnu_mcount_nc,以便-pg构建能够捕获函数退出以及我缺少的入口时间?
我正在优化 MPI 代码并且正在使用 Gprof。问题是我得到的结果完全不合理。我的工作流程如下:
编译代码添加-pg为编译标志。
运行代码mpirun -np Nproc EXEC.exe arg1 ... argN。
在可执行文件上运行 gprof gprof EXEC.exe
这有什么问题?
我正在尝试使用 gprof 分析 C++ 函数,我对所花费的 %时间感兴趣。我跑了不止一次,由于某种原因,结果有很大差异。我不知道是什么原因造成的,我假设采样率或者我在其他帖子中读到 I/O 与此有关。那么有没有一种方法可以使其更加准确并以某种方式产生几乎恒定的结果呢?
我在想以下几点:
等待您的输入
问候
gprof ×10
profiling ×6
c++ ×4
c ×2
gcc ×2
linux ×2
mpi ×2
benchmarking ×1
comparison ×1
fortran ×1
hpc ×1
optimization ×1
perf ×1
performance ×1
profiler ×1