Linux C/C++ PGO优化说明

11 篇文章 8 订阅

PGO (Profile Guided Optimization)

是指利用程序运行过程中采集到的 profile 数据,来重新编译程序以达到优化效果的 post-link 优化技术。其原理认为,对于特征相似的 input,程序运行的特征也相似,因此,我们可以把运行期的 profile 特征数据先采集一遍,再用来指导编译过程进行优化。

方案实施

方案一:

  1. 添加编译参数:-fprofile-instr-generate完整编译项目
  2. 启动项目进程,像平常一样运行程序,尽可能多覆盖常用的功能点。会自动在当前目录生成default.profraw文件
  3. 执行命令llvm-profdata merge -output=profile.profdata default.profraw将采样文件转化成llvm编译认识的指导文件。程序每次运行都会生成新的profraw文件,如果不指定名称会覆盖上次的default.profraw,可以使用环境变量LLVM_PROFILE_FILE=${WOKR_DIR}/${PROGRAM_NAME}.profraw来指定生成的文件名,然后执行llvm-profdata merge -output=profile.profdata *.profraw来生成profdata文件
  4. 移除参数-fprofile-instr-generate,添加参数-fprofile-instr-use=${WORK_DIR}/profile.profdata重新编译项目源码
  5. 运行程序执行相同的操作,验证效率优化的结果。

方案二:

此方案需要CPU支持IBS

  1. 添加编译参数:-funique-internal-linkage-names -fdebug-info-for-profiling,添加链接参数-Wl,--no-rosegment编译项目源码(-funique-internal-linkage-names clang9不支持,这里升级到了clang15)
  2. 启动项目进程。
  3. 利用perf工具对程序进行采样,运行perf record -p <pid> -e cycles:up -j any,u -a -- sleep 60,在此期间点击程序常用操作和功能。生成perf.data文件
  4. 执行create_llvm_prof --profile perf.data --binary <运行的可执行程序> --out=llvm.prof生成llvm.prof编译指导文件
  5. 去掉之前的编译参数,加上编译参数-fprofile-sample-use=llvm.prof重新编译项目源码
  6. 运行程序执行相同的操作,验证效率优化的结果。

参考资料

  • https://blog.csdn.net/ByteDanceTech/article/details/124030419
  • https://source.android.google.cn/docs/core/perf/pgo?hl=zh-cn
  • https://www.xujun.org/note-157156.html
  • https://blog.csdn.net/Rong_Toa/article/details/124604534
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值