【程序性能调优】使用gprof 统计函数时间占比

为了更好的优化程序性能,我们必须找到性能瓶颈点,也就是热点函数。在Linux系统中可以使用vtune和gprof两种方式来统计函数占总执行时间的比例。此次先记录一下使用gprof的方法。

gprof是GNU工具之一,默认情况下linux系统当中都带有这个工具。它在编译的时候在每个函数的出入口加入了profiling的代码,运行时统计程序在用户态的 执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,对于很多时间都在内核态执行的程序,gprof不适合。

调试环境:

1、centos7、fortran程序、MPI+OpenMP、使用8进程单线程结构

使用makefile文件编译,其中编译选项:mpifort  -mp -cpp -O3 -g -pg -c xxx.f90

执行语句:mpirun -np 8 ./xxx

2、centos7、C程序、串行

编译语句:gcc -o gprof-test -pg gprof-test.c

执行语句:./gprof-test

示例图片均显示第二个C程序的结果,第一个fortran的结果类似

证明linux下c程序和fortran程序、串行还是多进程都可以使用gprof测试程序

1、添加 -pg 选项来编译

使用gprof时要添加-pg选项来编译文件,如果要得到带注释的源码清单,则需要增加 -g 选项。单句运行:mpifort  -mp -cpp -O3 -g -pg -c xxx.f90,我的编译是直接make。这个时候当前文件夹下是没有gmon.out文件的,结果如下图所示。

==>> 生成可执行文件xxx

==>> 生成可执行文件gprof-test

注:如果是程序包中含有多个.c或.f90文件,要保证每一个文件编译时均有-pg选项,没有-pg选项的文件中涉及到的函数不会被统计进去,不会影响程序执行。

2、运行可执行文件

[user0@localhost test]$mpirun -np 8 ./xxx

[user0@localhost test]$./gprof-test

执行完之后在当前文件夹下会生成一个gmon.out文件,gprof所有是统计信息均保存在gmon.out文件中,不管是.c还是.f90生成的均是gmon.out

3、使用gprof查看统计信息

使用gprof来分析 gmon.out文件,需要把它和产生它的应用程序关联起来

  • gprof gprof-test gmon.out -b 得到每个函数是时间占比和call graph(相当于-p加-q的结果)
  • gprof gprof-test gmon.out -p 得到每个函数占用的执行时间
  • gprof gprof-test gmon.out -q 得到call graph,包含了每个函数的调用关系,调用次数,执行时间等信息。
  • gprof gprof-test gmon.out -A 得到一个带注释的“源代码清单”,它会注释源码,指出每个函数的执行次数。这需要在编译的时候增加 -g选项

结果截图如下图所示,执行了一个简单的串行程序,只有一个gprof-test.c文件。上述编译执行测试的多进程fortran程序也有相应结果,和此类似。

注:程序正常运行结束后,会产生gmon.out. 但在某些情况下,因为程序不能正常退出,gmon.out是不能生成的

网络资源

  1. gprof 用户手册 http://sourceware.org/binutils/docs-2.17/gprof/index.html
  2. 使用 GNU profiler 来提高代码运行速度 http://www-128.ibm.com/developerworks/cn/linux/l-gnuprof.html
  3. 参考博客:https://www.cnblogs.com/StitchSun/articles/4286428.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值