超标量处理器设计读书笔记-BP篇
第四章 分支预测
4.1 概述
分支预测越靠前越好。快速解码电路放在cache当中。由L2-cache到L1-cache之前就解码。
4.2 方向预测
PHT=2bit饱和计数器。对某一种pattern的taken历史做记录。
BHR=分支历史寄存器,对2^n种pattern分别做记录,对每个地址都做记录,称为局部历史的方向预测。
GHR=全局历史寄存器,对2^n种pattern分别做记录,但是不对每个地址都做记录,而是只维护一个寄存器,称为全局历史的方向预测。
为了解决直接映射PC的情况下,不同分支指令的训练冲突的情况,可以先对PC和HR做拼接或异或,作为index来对PHT寻址。这种做法可能会降低冲突,可能也会提高冲突。
竞争的分支预测,暂时不提。
分支预测的更新有三个来源,取指,执行,提交阶段。另外,根据大佬提及,在中断处理程序当中可以更新。
其中,执行阶段的更新仅仅是推测,为了修复推测错误带来的损失,要么在执行阶段统一修复,代价比较大(尤其是修复load指令时),要么在执行阶段设置若干checkpoint,选择其中一个回复。
4.3 地址预测
BTB,即更新PHT的时候统计记录target。BTB本身也可以是一个Cache。
BTB缺失时的处理方式,包括顺序执行和暂停流水(等待执行级产生正确地址)。
4.3.2 绝对跳转的地址预测
使用RAS来保存递归调用的return跳转地址。(call指令用btb)
RAS不够用的时候,push加入新的entry,同时pop最旧的entry。
带计数器的RAS可以很好地应对自我递归函数。
对case指令的分支预测,可以使用target-cache。
4.4 分支预测失败时的恢复
在取指阶段,通过预译码进行检测和恢复。
在译码阶段,通过比较正确分支地址进行检测和恢复。
在执行阶段,现代处理器采用基于ROB的方式或基于check point的方式进行恢复。
基于check point的方式在超标量处理器当中实现时,需要对每一个分支及其之后的预测指令做分组编号,以便于识别错误路径。这只是一种思路。
维护编号列表时,出于对性能的考量,可能出现多端口fifo,不利于功耗面积,由此可以约束,N-way的处理器在译码阶段最多吃入一条分支指令。
PTAB是译码阶段保存预测地址的cache,用于执行阶段检查分支预测是否正确。
4.5 超标量处理器的分支预测
PC+4还是+12?都需要进行预测,但是BTB不能实现真正的多端口。
可以等方向预测完毕以后再进行地址预测,损失性能,降低硬件付出。但是还是要用交叠方式来实现BTB,模拟一个多端口BTB。