为什么需要分支预测?
- 流水线产生的增益可以通过存在程序传输指令(例如JMP,CALL,RET等)来减少
- 它们更改了顺序,导致在程序传输指令无效后所有进入管线的指令
- 因此,在重新加载流水线阶段时,无需进行任何工作。
分支预测逻辑:
为避免此问题,奔腾采用了一种称为动态分支预测的方案。在该方案中,对流水线中当前的分支指令进行了预测。该预测将被采用或不被采用。如果预测为真,则不会刷新流水线,也不会丢失时钟周期。如果预测为假,则刷新流水线并从当前指令重新开始。
它使用具有256个条目的4种方式设置的关联缓存来实现。这称为分支目标缓冲区(BTB) 。每行的目录条目包括:
- 有效位:指示条目是否有效。
- 历史记录位:跟踪使用记录的频率。
源存储器地址是从获取分支指令的位置获取的。如果目录条目有效,则分支的目标地址将存储在BTB中的相应数据条目中。
分支预测的工作:
- BTB是一个后备缓存,位于2条管道的Decode Instruction(DI)阶段的一侧,并监视分支指令。
- 分支指令第一次进入流水线时,BTB使用其源内存在高速缓存中执行查找。
- 由于之前从未见过该指令,因此是BTB错过了。它预测即使是无条件跳转指令也不会采用该分支。
- 当指令到达EU(执行单元)时,将采用或不采用分支。如果采用,将从分支目标地址中提取下一条要执行的指令。如果不采取,将有顺序的指令获取。
- 当第一次进行分支时,执行单元将反馈提供给分支预测。分支目标地址被发送回,并记录在BTB中。
- 将创建一个包含源内存地址的目录条目,并且将历史记录位设置为强置。
下表说明了该图:
History Bits | Resulting Description | Prediction made | If branch taken | If branch not taken |
---|---|---|---|---|
11 | Strongly Taken | Branch Taken | Remains in same state | Downgraded to weakly taken |
10 | Weakly Taken | Branch Taken | Upgraded to strongly taken | Downgraded to weakly not taken |
01 | Weakly Not Taken | Branch Not Taken | Upgraded to weakly taken | Downgraded to strongly not taken |
00 | Strongly Not Taken | Branch Not Taken | Upgraded to weakly not taken | Remains in same state |