LLVM基本块频率术语

简介

基本块频率是一个用于估算不同基本块之间相对频率的度量标准。此文档描述了BlockFrequencyInfoMachineBlockFrequencyInfo 两个分析趟(analysis pass)中使用的术语。

分支概率

对于有多个后继的基本块来说,它的每条出边对应着相应的概率,称作分支概率(branch probability)。对某一给定的基本块来说,其出边的分支概率之和为1.0。

分支权重

LLVM 在每条边上分配了整数权重,而不是分数权重。每条边的权重与该边前驱基本块的其他出边有关。某条边的分支概率就是用该边的权重除以其前驱基本块各条出边的权重之和。

例如,考虑下述IR:

define void @foo() {
    ; ...
    A:
        br i1 %cond, label %B, label %C, !prof !0
    ; ...
}
!0 = metadata !{metadata !"branch_weights", i32 7, i32 8}

以及下面简单的图表示:

A -> B  (edge-weight: 7)
A -> C  (edge-weight: 8)

从基本块A到基本块B的分支概率是7/15,从基本块A到基本块C的分支概率是8/15。可以查看 LLVM Branch Weight Metadata 深入了解分支权重的IR表示细节。

基本块频率

基本块频率(block frequency)是用于表示一个基本块执行次数的相对度量标准。某基本块频率与入口基本块频率的比值表示在函数中入口基本块每执行一次,该基本块预计会执行多少次。基本块频率是 BlockFrequencyInfoMachineBlockFrequencyInfo 两个分析趟的主要输出。

实现方式:一系列DAG

计算基本块频率是通过自底向上地分析每个循环实现的。在该过程中,要忽视循环的回边(backedge)。也就是说,循环是被当作 DAG 处理的。在每个循环处理完毕后,该循环被打包成伪结点(pseudo-node)继续参与其父循环或者父函数的 DAG 分析。

块质量

对每个循环的 DAG 而言,入口结点被分配了 UINT64_MAX(即0xFFFFFFFFFFFFFFFF)的质量(mass)。同时,质量又按照分支概率分配给不同的后继结点。块质量使用了一种定点表示法(fixed-point representation),在这种表示法里,UINT64_MAX 表示 1.0,而 0 则代表一个稍大于 0.0 的数字。

注释:这种表示法在 LLVM 里的具体表现可以参考 ScaledNumber 类,质量是用该类表示的介于 0.0 和 1.0 之间的数字。

当质量分配完毕后,在 DAG 里每一个把出口结点和入口结点隔开的截断(cut)中,截断边的所有后继结点块质量应当等于 UINT64_MAX。换句话说,质量在 DAG 图中“下降”时是守恒的。

如果某函数基本块图是 DAG 形式,那么块质量其实就是基本块频率。然而,实际上不能这么做,因为本分析趟下游的用户需要满足把各个基本块频率相加后不会达到最大值 UINT64_MAX。

循环规模

循环规模(loop scale)是用于表示当入口结点执行一次,循还会迭代多少次的度量标准。当质量沿着循环的 DAG 分配时,回边(虽然被忽视了)也会分配质量用于计算出口的频率,进而得到循环规模。

注释:在 LLVM 里,循环规模的计算方式如下: LoopScale = 1 / ExitMass; 其中,ExitMass = HeadMass - BackedgeMass;

实现方式:从质量和规模中获取频率

在分析完所有的 DAG 后,每个基本块都有了质量(注意:若基本块在循环里,该质量是相对此循环而言的),每个循环的伪结点也有了它自己的循环规模,并从包含它的 DAG 中分配到质量。

通过把这些质量和循环规模相乘,我们可以得到初始的频率分配(把入口基本块的频率设为1.0)。一个基本块的频率是下述三个因素的乘积:该基本块的质量、包含该基本块的循环伪结点的质量,以及该循环的规模。

由于下游用户需要整数形式的频率(非浮点形式),上面初始的频率分配必须转换成 uint64_t 形式的无符号整数。

最后附上原文链接:LLVM Block Frequency

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值