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