1:编译选项:-fprofile-arcs(首次编译) -fprofile-use(二次编译)
2:确认PGO是否使能,
a)在首次编译的时候确认代码是否插桩
b) 运行后确认是否生成gcda文件
c) 确认二进制文件中是否有_gcov**函数,且函数内非空实现
可能的问题 增加-Dinhibit_libc
3)性能优化
引入PGO可能性能不升反降,总结原因
a) 训练次数太少,未能体现出真实的场景,导致编译器判断错误
b) 部分优化可能引入负向作用,比如:pgo后引入peel loop,结果导致不再做sms,效果反而不如前
c) 编译器缺省的概率阈值不够精准,原静态分支预审结果优化更好,需要调整概率阈值
正向效果:
a) 更合适的inline
b) 正向影响的ebb优化,比如判断某个分支高概率,决策是否需要拷贝一份减少跳转同时,扩大调度去讲
c) 循环内冷热分支外移