TAGE-SC分支预测器
此文为学习昆明湖SC分支预测器的整理版本;
SC分支预测器
SC(Statistics counter)分支预测器是一种基于历史统计信息的分支预测器。
- 与TAGE类似,在SC中通常有多个表Tn,他们对应了不同历史长度的跳转统计;
- 同点在于,在预测按PC检索时,每个表Tn都会命中,然后SC把每个命中的表项进行求和;
- 然后计算总的“饱和计数器”跳转信息,最后根据总的跳转信息判断是否跳转。
- 一般情况下,SC采用“有符号饱和计数器”。
- 计数器值大于0时表示跳转,小于0时表示不跳转。
- 计数器的绝对值越大,表示其预测置信度越高。
在SC预测器中,SC也由多个表组成(例如T1,T2,T3,T4),但相对TAGE预测器少了基础预测表T0。SC中Tn表有6 bit的有符号饱和计数器。
上述的流程,可以总结成如下两个步骤:
SC分支预测流程
1. 获取对应的entry内容
SC表的索引方式如下:
2. 得到总的统计结果
其中:
- ctr_sc表示每个表的有符号饱和计数器。
- 对其进行左移加一是进行权重调整。
- 累加后的scCtrSum就是SC的最终预测结果。
3. 根据统计结果,决定是否跳转
如果scCtrSum大于零,则预测跳转,小于零则预测不跳转。其绝对值越大,表示预测置信度越高;
典型数据转换结果如下(在计算时为了不溢出,扩展到了9位):
- 均为 6b100000(强不跳转) ,求得 9b100000100,值为 -252
- 均为 6b011111(强跳转),求得 9b011111100,值为 252
- 均为 6b000000(弱跳转),求得 9b000000100,值为 4
- 均为 6b111111(弱不跳转),求得 9b111111100,值为 -4
SC训练过程
在update阶段进行饱和计数器的更新。
- 如果PC对应的真实指令跳转,这所有表中对应的饱和计数器+1
- 如果PC对应的真实指令不跳转,这所有表中对应的饱和计数器-1
TAGE-SC分支预测器
有了TAGE为何还需要SC
一些应用上,一些分支行为与分支历史或路径相关性较弱,表现出一个统计上的预测偏向性。对于这些分支,相比基于历史的分支预测,使用计数器捕捉统计偏向的方法更为有效。
TAGE在预测与历史非常相关的分支时非常有效,但对有统计偏向的分支则支持不佳。例如只对一个方向有小偏差,但与历史路径没有强相关性的分支。
为了避免该问题,可以在传统TAGE预测器上增加SC预测器。
TAGE-SC功能介绍
在昆明湖 TAGE-SC 预测器中,会同时得到 TAGE 和 SC 的预测结果 P1 和 P2,然后对他们的结果进行累加 P = P1+P2 :
- 如果 P 的绝对值大于 8bit 的阈值 sc_bank_thres,则采用预测器结果 P;
- 否则则采用 P1 作为最终预测结果。
为了进行动态自适应,阈值sc_thres是需要是动态变化的。为此在实现上TAGE-SC使用了一个5bit的sc_bank_ctr计数器对阈值sc_bank_thres进行调整。
另外,由于昆明湖支持同时预测2条分支指令,因此阈值寄存器和对应的控制计数器也是两份。
预测过程
在TAGE-SC预测时,TAGE的预测结果P1用tage_ctr表示,SC的预测结果P2用scCtrSum表示。在预测时,分为如下四步。
执行SC预测器,得到预测结果scCtrSum
并行得到TAGE预测器的预测结果 tage_ctr。
由于TAGE的预测结果是无符号饱和计数器,而SC的预测结果是有符号饱和计数器,如果对他们进行相加,需要进行数据转换。
昆明湖在实现上,采用了对TAGE的结果进行转换。转换后的结果用 tageCtrCentered 表示,具体转换过程如下:
比特的无符号饱和计数器转换为8比特的有符号饱和计数器结果举例如下所示:
对TAGE和SC的预测结果进行相加得到最终预测结果P,在实现上用totalSum进行表示。
根据 totalSum 以及 sc_bank_thres 决定最终预测方向:
totalSum > 0 且绝对值超过阈值则跳转: 如果 scCtrSum > sc_bank_thres - tageCtrCentered 也可以理解成 totalSum > sc_bank_thres 上面的写法可以降低最大位宽(把保证不溢出需要10bit变成9bit);
totalSum < 0 且绝对值超过阈值则不跳转: 如果 scCtrSum < -sc_bank_thres - tageCtrCentered 也可以理解成 |totalSum| > sc_bank_thres;
训练过程
在对 TAGE 和 SC 进行组合后,TAGE-SC 添加了 sc_bank_ctr 计数器用来控制阈值sc_bank_thres。因此在训练时,除了 TAGE 和 SC 本身的训练外,还需要对新增加的计数器进行更新。
在update阶段,其具体更新流程如下:
- TAGE-SC采用了预测结果P(即TAGE+SC后的预测结果),如果 |totalSum| 在 [sc_bank_thres -4, sc_bank_thres -2] 的范围内,则对阈值相关寄存器组进行更新
- 更新 sc_bank_ctr,饱和计数
- 若预测正确,则 sc_bank_ctr +=1
- 若预测错误,则 sc_bank_ctr -=1
- 更新 sc_bank_thres ,受限制的饱和运算,
- 若 sc_bank_ctr 更新后的值已达 0b11111 且 sc_bank_thres <= 31,则 sc_bank_thres +=2
- 若 sc_bank_ctr 更新后的值为 0 且 sc_bank_thres >=6,则 sc_bank_thres -=2 其余情况thres不变。
- sc_bank_thres 更新判断结束后,会对 sc_bank_ctr 再做一次判断 若更新后的sc_bank_ctr若为0b11111或0,则thres_ctr会被置回初始值0b10000。
- TAGE-SC采用了预测结果P1(即TAGE的预测结果)不进行任何操作;