背景:

数据中心应用程序通常非常庞大和复杂,因此代码布局成为提高性能的重要优化手段。BOLT是一个链接后优化工具,它可以对已经编译和链接的二进制文件进行重新代码布局和优化,以提高程序的性能。文章证明了,虽然在早期注入配置文件可以通过更多的优化使用,但稍后注入可以更准确的使用信息,以获得更好的代码布局。

主要贡献:

  • 描述了基于LLVM架构的优化
  • 后链接优化可更好的利用分析数据
  • 编译时、链接时、后链接 FDO 之间互补而非互相替代。

BOLT工具介绍:

BOLT是一个后链接二进制优化工具,通过重新布局应用程序的二进制代码,从而减少指令缓存(ICache)不命中率。因为ICache不命中会对性能产生重大影响,特别是对于那些指令密集型的应用程序。

执行流程:

1.BOLT首先分析程序的执行,收集关于分支和基于性能的信息。
2.它利用这些信息来重新布局二进制文件的函数和基本块,以减少ICache的不命中。
3.通过调整代码以利用现代硬件上的其他特性。

优点:

与其他优化技术相比,BOLT具有更好的性能提升,尤其是对于大型、长时间运行的应用程序。BOLT不需要源代码进行优化,可以直接在二进制文件上操作。

工作机制

profile-guided的反馈:

BOLT首先运行应用程序以收集其执行profile。这通常使用Linux的perf工具来完成。通过这种方式,BOLT能够了解哪些代码块和函数被频繁地执行和访问。

二进制解析和转换:

BOLT解析输入的二进制文件,创建内部的中间表示。
这允许BOLT修改和优化二进制代码,而不必担心具体的汇编语法和细节。

代码重新布局:

根据前面收集的性能数据,BOLT会重新布局函数和基本块。
在函数内部,BOLT可以重新布局基本块,频繁执行的路径)在ICache中连续。

输出优化后的二进制:

经过所有这些转换和优化后,BOLT会生成一个新的、优化过的二进制文件。这个新的二进制文件可以替代原始文件,通常会有更好的性能表现。