Store-Load-Branch (SLB) Predictor:A Compiler Assisted Branch Prediction for Data Dependent Branches

本文(2013 HPCA)的工作基于如下观察:H2P分支通常与一些程序数据结构如数组、链表、树有关,且遵循类似于清单1中所示的 store-load-branch 执行顺序,即当新建或更新数据结构时,一系列存储空间被些(store),遍历数据结构时,这些位置被访问(load),然后被用于判断条件分支(branch)。

Critical Tips 

1. 不依赖于分支历史信息预测,而是直接根据数据计算一个分支跳转方向标志。

2. load指令的数据在分支指令取指前不可获取,因此直接用store指令的数据。

基于此,本文提出了 Store-Load-Branch(SLB)预测器,是针对数据依赖分支的一种编译器辅助的动态分支预测机制。 其中编译器负责识别与H2P数据相关分支相关联的数据结构被引用和修改的所有程序点。执行时,硬件跟踪标记的修改数据结构的 store 指令,使用存储的数据值提前计算条件分支标志,并将它们缓冲在存储地址的结构中。之后,在遍历数据结构时,使用预测的 load 地址读取预计算的标志,并用其预测分支结果。

实现

A. 编译器支持

从分支指令开始,编译器识别分支所依赖的 load 指令。然后识别供给 load 指令的 store 指令。 使用特殊 load_hint (HLD) 和 store_hint (HST) 指令对分支的 ST-LD-BR 序列进行编码并向下传递到硬件,编译器为每个与该分支相关的 load/store插入一条 HLD/HST 指令,指令格式如图 3 所示。

8:0 bit:表示 load/store 指令 pc 到HLD/HST 指令的偏移量;

20:9 bit:HLD 中表示分支 pc 到HLD 指令的偏移量,看到 HLD/HST 指令时,硬件使用 pc 偏移值来计算与分支指令关联的 load 或 store 指令的绝对地址;

24:1 bit:HLD 中指定load 步幅值;HST中指定在 store 时用于评估分支结果的条件代码;

B. 硬件支持

为了在运行时识别 ST-LD-BR 序列,硬件提供三个主要的表: 

Load Table:每执行一条HLD指令,在该表中创建一个新项。表中“tag”域用load 指令地址的低12位填充,load指令地址由HLD指令中的“ld pc offset”计算而得;“Br pc”域用分支指令地址的12位填充,分支指令地址由“br pc offset”计算而得。其余位

Store Table:每执行一条HST指令,在该表中创建一个新项。表中“tag”域用 store 指令地址的低12位填充,store 指令地址由HST指令中的“st pc offset”计算而得;“Br cond”域由HST指令中指定的4-bit分支条件代码填充。

Branch Table“tag”域用分支地址的低12位填充,分支地址用HLD指令中“br pc offset”计算得到。

store 时计算分支 flag:在代码生成时,编译器在store指令前插入比较指令,用于比较存储的值和分支条件。这条比较指令会对标志寄存器置位,当store 指令执行且与store table tag 匹配时,通过标志寄存器的值和相关分支条件代码计算得到分支 flag。计算得到的分支flag 存储在store指令指定的存储地址的(store address) T/NT prediction table 中 [2]。

取指时使用分支 flag:在遍历数据结构时,当一个数据依赖分支与branch table tag 匹配时,使用“predicted load address”查预测表(prediction table)生成taken/not-taken预测。“predicted load address”是使用在程序顺序中比分支指令更早出现的加载指令生成的。

生成 Predicted Load Address:使用两级load address predictor生成。[1]第一级是 load table,第二级是 link table。

Q1:T/NT prediction table,执行store 指令写入的时候用的是存储的目标地址作为索引,执行分支指令查表的时候用的是预测的 load 指令目标地址作为索引?

Q2:load table 中的分支目标地址偏移项(br pc offset)有什么作用?

A2:将两级load addresspredictor 生成的结果存入 branch table 中时作为索引。

上图表示的过程是:

当取到一条load指令,pc低12位作为索引查 load table,得到的结果作为索引查 link table,最终得到该指令对应的 predicted load address,同时以 load table 中指出的分支地址作为索引将结果存入 branch table 中。

当取到一条store指令,pc作为索引查 store table,得到的结果与要存储的数据比较得到分支标志,以 store address 作为索引将结果存入 T/NT prediction table 中。

当取到一条分支指令,将指令pc低12位作为tag查 Branch Table,得到 predicted load address,使用该地址作为索引查 T/NT prediction table ,得到预测结果。

C. 对间接分支的支持

间接分支可能有多个目标地址,因此预测间接分支需要预测其分支目标地址。SLB 间接分支预测方案使用传统的 BTB 来存储同一间接分支的多个目标(不同目标地址索引不同)。如图5所示。

Store Data Array:执行一条 store 指令时,如果命中 store table 中的 tag,则以store address为索引,将存储数据的低12位缓存到 store data array中。

预测分支目标地址:当取到一条间接分支指令,使用 predicted load address 作为索引读取 store data array 得到存储的数据值,将该数据值与分支地址散列索引BTB,得到分之目标地址。因为同一间接分支的不同的存储数据值与不同的分支目标地址相关。

更新BTB:如果一个间接分支指令预测错误,或者因为第一次看到目标地址,或者它被另一个分支目标替换,则更新BTB。在 BTB 查找时计算的相同索引,用于更新 BTB。

使用TAGE+SLB。

结果分析

存储开销

全部存储大约63.8Kbits,实现SLB间接分支预测器还需额外的21Kbits。

误预测率(MPKI):On average, combined TAGE+SLB predictor reduces MPKI for EEMBC suite from 4.48 to 2.21,a reduction of 51%. Similarly, for SPECint suite, MPKI is reduced from 9.56 to 7.50, a reduction of 21%.

只和单独的TAGE做了比较,没有和TAGE-SC-L比较。

性能:For SPECint suite, combined TAGE+SLB predictor shows performance improvement of 11% over baseline Bi-Mode predictor. This is almost double the speedup of standalone TAGE predictor over the same baseline. Perfect predictor shows a potential for 29% performance improvement.

参考文献

[1] M. Bekerman, S. Jourdan, R. Ronen, G. Kirshenboim, L. Rappoport, A. Yoaz, and U. Weiser. Correlated Load-Address Predictors. In Proceedings of the 26th annual international symposium on Computer architecture, ISCA ’99, pages 54–63, Washington, DC,USA, 1999. IEEE Computer Society.

[2] ARM. ARM Architecture Reference Manual. infocenter.arm.com.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值