“时间久了,日子似乎变成了一种很单调的东西,就在这每天的日出与日落里,我可以清楚地听到我的生命在渐渐枯萎”
简介
TAGE 是连续几届分支预测器比赛的冠军,本文将针对TAGE预测器进行介绍,重点涉及TAGE的原理,TAGE的结构以及TAGE中重要的行为模型。
分支历史
History length计算
Tage的分支历史可以使用如下公式进行计算
选$\alpha = 2$,$L(1)=2$,$M=7$,可以得到分支历史的几何级数为${2,4,8,16,32,64,128}$
Folded history计算
TAGE结构
Storage components
本文设计的Tage预测器storage components如下表所示:
base predictor | T1 | T2 | T3 | T4 | T5 | T6 | T7 | |
---|---|---|---|---|---|---|---|---|
History Length | 0 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
Entry number | 1K | 1K | 1K | 2K | 2K | 1K | 1K | 0.5K |
index length | 10 | 10 | 10 | 11 | 11 | 10 | 10 | 9 |
Width | 3bits | 12 | 12 | 13 | 13 | 14 | 14 | 15 |
Tag width | 7 | 7 | 8 | 8 | 9 | 9 | 10 | |
useful count | 2 | 2 | 2 | 2 | 2 | 2 | 2 | |
predict count | 3 | 3 | 3 | 3 | 3 | 3 | 3 | |
Total bits | 1K*3 bits | 1K*12 bits | 1K*12 bits | 2K*13 bits | 2K * 13 bits | 1K * 14 bits | 1K * 14 bits | 0.5K * 15 bits |
TAGE更新策略
TAGE表项更新策略
TAGE在retire阶段进行更新,以避免错误路径造成的污染(由于乱序执行,因此不能认为从BJU中执行的分支一定是正确的path,有可能会存在分支抢跑的情况,即错误地执行了可能完全不会走到的分支),关于路径污染,可以参考下面的例子:
1 | if (cond1) |
有两条分支语句cond1和cond2,由于乱序执行机制,完全可能存在先执行cond2再执行cond1的情况,如果cond2在执行后对表进行更新,而后续执行时发现cond1根本执行不到,那么对于cond2则进行了一个虚假的更新,产生了污染。
但是从retire阶段进行更新就引入了另外一个问题,更新延迟,一条指令虽然已经执行,但是直到retire才会被更新,TAGE中使用了IUM(Immediate update mimicker),来解决这个问题,后面会重点讲到。
Useful bit更新
Boom TAGE与BHT信号映射
Xuantie Signal | Boom signal | 备注 |
---|---|---|
pcgen_bht_ifpc | io_f0_pc | 目前BHT只用到了PC一部分 |
pcgen_bht_pcindex | ||
vghr | io_f1_ghist | 关于history,xuantie在BHT中自己维护,可能需要将History这一段逻辑拆分出来 |
iu_ifu_chk_idx | update_bits_meta | 关于meta信号的具体内容再看下 |
iu_ifu_bht_condbr_taken | cfi_taken | |
iu_ifu_chgflw_vld | cfi_mispredicted | |
TAGE设计
本节将给出一个完整的TAGE设计,用于替换玄铁中的BHT。
Signal List
Direction | Width | Name | Function |
---|---|---|---|
input | 1 | cp0_ifu_tage_en | tage enable |
input | 1 | cp0_ifu_icg_en | inner clk gate? |
input | 1 | cp0_yy_clk_en | clk enable |
input | 1 | cpurst_b | cpu reset |
input | 1 | forever_cpuclk | cpu clk |
input | 1 | ifctrl_tage_inv | invalidate singal |
input | 1 | ifctrl_tage_pipedown | 流水线推进 |
input | 1 | ifctrl_tage_stall | 流水线stall |
input | 1 | ipctrl_tage_con_br_gateclk_en | gate clk enable |
input | 1 | ipctrl_tage_con_br_taken | bht预测的结果,用作history 更新 |
input | 1 | ipctrl_tage_con_br_vld | 分支有效 |
input | 1 | ipctrl_tage_more_br | 分支中存在多条语句(在第一条不跳转的情况下处理) |
ipctrl_tage_vld | tage是否有效 | ||
ipdp_bht_h0_con_br | 上一条block中是否存在分支 | ||