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个非常有效果的优化项:

PassName Description
strip-rep-retStrip repz from repz retq instructions used for legacy AMD processors
icfIdentical code folding
icpIndirect call promotion
peepholesSimple peephole optimizations
simplify-ro-loadsFetch constant data in .rodata whose address is known statically and mutate a load into a mov
icfIdentical code folding (second run)
pltRemove indirection from PLT calls
reorder-bbsReorder basic blocks and split hot/cold blocks into separate sections (layout optimization)
peepholesSimple peephole optimizations (second run)
uceEliminate unreachable basic blocks
fixup-branchesFix basic block terminator instructions to match the CFG and the current layout (redone by reorder-bbs)
reorder-functionsApply HFSort [3] to reorder functions (layout optimization)
sctcSimplify conditional tail calls
frame-optsRemoves unnecessary caller-saved register spilling
shrink-wrappingMoves callee-saved register spills closer to where they are needed, if profiling data shows it is better to do so

五、采样技术

LBR 不仅为关键边提供了准确计数(完美使用BB计数也没法做到),还使块布局算法对不良采样率更有弹性。

总之多方面说明 LBR 最好。

六、 EVALUATION

测量几款应用,性能有提升,原因主要从下面几项指标找:

    1. CPU Time
    1. Branch
    1. I-Cache
    1. I-TLB
    1. D-Cache
    1. D-TLB
    1. LLC

7、相关工作

8、结论

主要为了缓解 缓存、TLB 和分支预测起的压力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值