作用
PGO是LLVM编译器的一种优化技术,它通过运行程序以收集性能数据(主要是基本块的执行频率),利用这些数据来指导编译器进行更有效的优化。
方法
简单来说就是三步:
第一步,在编译时加上-fprofile-generate
编译选项进行第一次编译。
第二步,运行第一次编译的程序得到性能数据。
第三步,使用性能数据指导编译器进行第二次编译获得优化后的程序。
本次采用的编译器是LLVM 17.0.0。
第一次编译
clang -fprofile-generate test.c -o test
运行第一次编译的程序
#生成binary并执行,会生成*.profraw文件 ./test
这一步将会生成*.profraw的文件,其中包含了test程序的性能数据,根据不同的输入可以生成多个性能数据文件
使用性能数据进行第二次编译
在编译之前首先要把得到的性能数据文件做合并(单个文件也要做转化)
#将*.profraw文件转为*.profdata文件 llvm-profdata merge -sparse *.profraw -o code.profdata
进行第二次编译
clang -fprofile-use=code.profdata test.c -o test_pro
此时生成的binary相比于不加此优化的binary应该有更好的性能
在spec cpu2006的基准测试429.mcf上的测试结果
binary | 第一次(runtime) | 第二次(runtime) | 第三次(runtime) |
---|---|---|---|
mcf_base | 116.03 | 115.97 | 116.28 |
mcf_profdata | 111.68 | 111.94 | 111.93 |
加速比 | 1.040 | 1.036 | 1.039 |