什么是AutoFDO?
AutoFDO是指基于程序性能分析工具的反馈式编译优化。不同于传统的基于程序插桩的反馈式编译优化,AutoFDO可以对以优化过的程序进行性能分析,并利用程序的性能信息指导编译器对程序进行再次优化。这意味着AutoFDO可以部署在真实的产品线上,利用程序在生产环境的性能信息对程序进行更精准的优化。
AutoFDO利用如`perf`这样的工具来收集程序的性能信息。然后使用一个独立的工具将perf.data数据转换为gcov格式。gcc通过读取并理解‘’gcov‘’格式的性能信息为程序的基本块标记一个计数值并估计分枝的概率。
AutoFDO的主要步骤
AutoFDO主要可以分为三个步骤:
步骤1:读取程序性能信息
在这个步骤中主要从gcov文件中读取以下信息:
- 函数名和文件名。
- 源文件级的性能信息,主要是建立内联栈到采样计数间的映射。
- 模块级的性能信息,主要是建立模块到辅助模块间的映射。
在步骤1中仅仅只是读取数据而不会处理它。并且这一步必须在树解析之前完成,因为后续的LIPO需要使用到模块性能信息。
步骤2:处理性能信息以建立内部数据结构(哈希映射)
这一步将在树解析之后完成,因为处理过程需要用到函数名到它的调试名的映射。以下的哈希映射被用来存储相关的性能信息。
- function_htab:从function_name到它的入口块entry_bb计数的映射。
- stack_htab:内联栈到它的采样技术间的映射。
- module_htab:模块名到它的辅助模块名之间的映射。
步骤3:标记控制流图
<