BOLT: 一个实用的二进制优化器 - 笔记
BOLT: 一个实用的二进制优化器
一、导言
虽然在早期注入配置文件可以通过更多的优化使用,但稍后注入可以更准确的使用信息,以获得更好的代码布局。
提供的例子 BOLT 对大型程序在 FDO/PGO 基础上性能提供 20.4%,来源主要是代码布局的改进。
总结来讲,论文做了下面几点贡献:
- 1、描述了基于LLVM架构的链路优化
- 2、证明 后链接优化可更好的利用分析数据
- 3、表明 编译时、链接时、后链接 FDO 之间互补而非互相替代。
二、MOTIVATION
A、为什么基于采样
FDO 被证明有用,插桩有两个缺点:
- 1、构建过程复杂
- 2、通常有CPU和内存开销
利用现代 CPU 的最后分支记录硬件 LBR 收集开销几乎可忽略
B、为什么是二进制优化器
FDO 都面临两个权衡:更早注入配置数据允许沿管道进行更多优化,映射级别越接近记录级别,结果越准确。链接后二进制优化允许perf采样以最高精度使用配置文件。
IR 级别的数据映射常见问题是 函数在两个 caller 都内联
C、为啥是静态二进制优化器
什么是动静态没看懂?
三、 ARCHITECTURE
A、初步设计
最开始通过增量增加二进制代码覆盖率来开发 BOLT, 完全依赖 ELF 符号表。
代码大小可能增加,原因可能是冷路径上分支数增加,其次是X86条件分支指令的一些特点(没懂)。
B、重定位模式
这能允许我们改变二进制文件中所以函数的位置。BFD 和 Gold 等都提供了 --emit-relocs
, 不过还是有一些缺失如连接器删除 PIC 跳转表的相对偏移和其他一些连接器也不可见的重定位(如单编译单元的 local func 的 func 引用由编译器内部处理)
选择其他连接器变化太多,所以编写了一个独立的后链接优化器。
C、Rewriting Pipeline
分析任意二进制文件并定位代码和数据绝非易事。分析时 bolt 会同时使用符号表和帧信息。
重写流程图略
LLVM 架构非常棒
重写的下个流程是为每个函数构建控制流图CFG, 使用 MCInst 结构构建…
D. C++异常和调试信息
支持
四、优化
15个非常有效果的优化项:
Pass | Name Description |
---|---|
strip-rep-ret | Strip repz from repz retq instructions used for legacy AMD processors |
icf | Identical code folding |
icp | Indirect call promotion |
peepholes | Simple peephole optimizations |
simplify-ro-loads | Fetch constant data in .rodata whose address is known statically and mutate a load into a mov |
icf | Identical code folding (second run) |
plt | Remove indirection from PLT calls |
reorder-bbs | Reorder basic blocks and split hot/cold blocks into separate sections (layout optimization) |
peepholes | Simple peephole optimizations (second run) |
uce | Eliminate unreachable basic blocks |
fixup-branches | Fix basic block terminator instructions to match the CFG and the current layout (redone by reorder-bbs) |
reorder-functions | Apply HFSort [3] to reorder functions (layout optimization) |
sctc | Simplify conditional tail calls |
frame-opts | Removes unnecessary caller-saved register spilling |
shrink-wrapping | Moves callee-saved register spills closer to where they are needed, if profiling data shows it is better to do so |
五、采样技术
LBR 不仅为关键边提供了准确计数(完美使用BB计数也没法做到),还使块布局算法对不良采样率更有弹性。
总之多方面说明 LBR 最好。
六、 EVALUATION
测量几款应用,性能有提升,原因主要从下面几项指标找:
-
- CPU Time
-
- Branch
-
- I-Cache
-
- I-TLB
-
- D-Cache
-
- D-TLB
-
- LLC
7、相关工作
8、结论
主要为了缓解 缓存、TLB 和分支预测起的压力