编译器工具链(四)——配置文件引导优化(PGO)

配置文件引导优化(PGO)

如果编译器可以了解不同程序点的执行频率,就可以在编译过程中做出更好的优化决策。许多编译优化都是基于程序静态分析得到的。然而,这些分析对于不同的程序点可能并不理想,且容易导致性能的损失。编译器可以通过读取“配置文件”的方式来整合程序的运行时行为。配置文件本质上是不同程序点执行频率的直方图。为生成配置文件,这里介绍两种方法:

1. 使用编译器插桩

编译器可以在一些特殊的程序点上插入计数器来收集运行时配置文件。通过-profile-generate选项,告诉编译器对源代码进行插桩:

$ gcc -O2 -fprofile-generate=/path/to/outputfile test.c -o a.out

由于插桩,应用程序本身会为编译器的后续编译记录一些有效的事件或计时。程序退出后,将在/path/to/outputfile/目录中创建一个扩展名为.gcda的文件。然后使用-fprofile-use=/path/to/outputfile重新编译应用程序,从而将得到一个优化的程序。

$ gcc -O2 -fprofile-use=/path/to/outputfile test.c -o b.out

b.out会使用配置信息进行优化。编通常使用概要信息来进行代码布局优化、函数内联和循环。使用配置文件引导优化(PGO)通常会看到超过10%的性能提升。

2. 使用采样分析器

例如Linux perf的采样分析器会在程序执行时使用基于硬件的计数器来记录某些特殊事件。程序可以从一开始就进行分析,也在运行时才进行分析。这使得采样分析器更加易于用在连续分析上。与传统的PGO相比,采样分析器的开销非常小,因此这种方法可以扩展到大量系统上。简单介绍一个典型的使用场景:

$ perf record -b ./a.out 
$ create_gcov --binary=./a. out --profile=perf. data --gcov=a.gcov -gcov_version=1 
$ gcc -O3 -fauto-profile=a. gcov test.c -o b.out

b.out通过采样f分析信息进行优化。create_gcov是一个转换工具可以将perf.data转换到gcov格式。perf工具包含了多种选项可以记录不同的硬件事件。需要注意的是,并不是所有的硬件都支持所有的事件,也不是所有的Linux perf功能都支持RISC-V。

使用PGO的注意点

虽然基于插桩的配置文件引导优化(PGO)通常很容易使用,但也有一些缺点:

  • 程序中的编译器插桩可能会影响某些优化。
  • 被插桩的程序通常运行较慢,因此不能部署在大量系统上。正因为如此,收集的配置文件可能质量不高。

这些缺点可能不会影响到所有的系统,所以对于哪些情况应该使用配置文件引导优化(PGO)优化也需要进行一些评估。配置文件引导优化(PGO)的质量取决于程序在收集配置文件时运行的测试向量。但即使在有限的测试场景下,配置文件引导优化(PGO)仍然在某些情况下是有益的,例如,即使是完全不同的测试用例,程序的启动顺序依旧不会发生很大的变化。

References:

https://perf.wiki.kernel.org/index.php/Main_Page
https://github.com/google/autofdo
https://perf.wiki.kernel.org/

若文章中有出错或者不清楚的地方欢迎大家讨论指教!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值