为什么需要分支预测?
- 产生的收益流水线可以通过存在程序传输指令(例如JMP, CALL, RET等)来减少
- 它们更改了顺序, 导致在程序传输指令无效之后所有进入管线的指令
- 因此, 在重新加载管道阶段时, 无需进行任何工作。
为避免此问题, 奔腾使用了一种称为动态分支预测的方案。在该方案中, 对流水线中当前的分支指令进行预测。该预测将被采用或不被采用。如果预测为真, 则不会刷新管道, 也不会丢失时钟周期。如果预测为假, 则刷新管道并从当前指令重新开始。
【奔腾中的分支预测详细指南】它是使用具有256个条目的4种方式设置的关联缓存来实现的。这就是所谓的分支目标缓冲区(BTB)。每行的目录条目包括:
- 有效位:指示条目是否有效。
- 历史记录位:跟踪多久采取一次。
分支预测的工作:
- BTB是一个后备缓存, 位于2条管道的Decode Instruction(DI)阶段的一侧, 并监视分支指令。
- 分支指令第一次进入管道时, BTB使用其源存储器在高速缓存中执行查找。
- 由于之前从未见过该指令, 因此是BTB错过了。它预测即使是无条件跳转指令也不会采用该分支。
- 当指令到达EU(执行单元)时, 将采用或不采用分支。如果采用, 将从分支目标地址中提取下一条要执行的指令。如果不采取, 将有顺序的指令获取。
- 当第一次进行分支时, 执行单元将反馈提供给分支预测。分支目标地址被发送回, 并记录在BTB中。
- 将创建一个包含源内存地址的目录条目, 并且将历史位设置为强置。
文章图片
下表说明了该图:
历史位 | 结果描述 | 做出预测 | 如果采取分支 | 如果没有采取分支 |
---|---|---|---|---|
11 | 强烈推荐 | 采取的分支 | 保持相同状态 | 降级为弱势 |
10 | 弱摄 | 采取的分支 | 升级为强烈推荐 | 降级为弱未采取 |
01 | 弱不服用 | 没有分支 | 升级为弱摄 | 降级为强烈不参加 |
00 | 强烈不采取 | 没有分支 | 升级为弱未采取 | 保持相同状态 |
推荐阅读
- 算法题(计算字符串的子字符串的数字是否能被11整除)
- Linux怎么使用usermod命令(用法示例图解)
- 如何尝试和分析模拟CAT()
- android 自定义view+属性动画实现充电进度条
- Android实现远程控制PC(Android[客户端]+Qt[服务器端])
- android中的回调简单认识
- Android 外置SDCard读写权限总结
- Glow Android 优化实践
- Android中使用Notification实现宽通知栏(Notification示例二)