特性说明
当前的PGO(Profile-Guided Optimization) profile不具备上下文敏感性:内联函数的分支概率对所有调用者(caller)均采用相同的值,而实际上这些概率在不同调用上下文中往往存在显著差异。此类次优的profile会严重影响多项下游优化的效果,尤其是机器级的基本块布局(basic block layout)和寄存器分配(register allocation)。
为解决该问题,CSPGO(Context-Sensitive PGO)引入了一个在内联之后执行的post-inline profiling阶段,专门用于收集内联展开后的运行时profile,从而实现上下文敏感的反馈信息,即“上下文敏感 PGO”(Context-Sensitive PGO, CSPGO)。
因此,在完整的优化流程中会生成两份 profile 文件:
- 原始PGO profile用于指导早期优化,如函数内联、间接调用提升(indirect call promotion)等。
- CSPGO profile则用于内联完成后的后续优化,例如基本块重排和寄存器分配,以获得更精确的性能收益。
父主题: CSPGO