现代处理器设计——动态转移预测
1. 动态转移预测技术介绍
- 1997年,Calder在论文中表明静态转移预测技术对于分支指令的准确率能够达到70%-80%。但是如果剖视得到的信息不能够代表出运行时的行为特点,那么准确率将会更低。动态转移预测则能够利用运行时信息对不同的分支模式进行预测。
- 静态技术无法应对某些分支,但是他们仍旧是非常可预测的
- 一条分支在程序的前一半时间内发生跳转,而剩余的时间内不跳转。(静态预测只能够的达到50%的准确率)
- 一条使用了程序输入的分支,在输入确定后,分支的结果也是确定的(例如是判断数组长度)。但是在静态预测中,无法确定输入数据,因此也无法判断出不同输入的情况下如何跳转
- 动态转移预测需要硬件资源的支持,对于一些资源紧缺的用于嵌入式系统的处理器中可能不太合适,但是对于一些性能要求较高的处理器,则这些硬件资源将更值得考虑使用动态转移预测
- 动态技术不需要在编译时剖视分析所有程序,也不需要重新编译程序就可以减少转移指令的损失
2. 大部分转移预测技术背后的思想:处理器每次发现分支指令的执行结果后,都会记录某种形式的上下文,以便在下次遇到相同的上下文时,对该分支做出相同的预测。
3. Smith预测器(1981年):
-
包括一个2^m个计数器的表,计数器的位数为k位
-
使用转移指令地址的低m位索引,使用计数器的最高位给出预测结果
-
主要思想:记录每条分支在上一次执行时是否发生了跳转。
-
k=1时,意味着仅记录该分支的上次执行结果,本次执行预测使用一样的结果
-
分支的异常决定:循环的分支指令大多数情况发生跳转,除了退出情况。退出情况就是一次异常的决定。
- 当k=1时,该异常决定将会导致下一次的预测结果发生变化,很可能导致新的预测错误
- 当k>1时,计数器中记录的该分支的最近几次的执行结果,因此计数器不会因为一次异常的决定而导致出现重大的变化。相对于1位的情况,额外的位给预测器的状态增加了一下滞后性,Smith称为惯性。
-
从两位增加到更多位带来的性能提升和硬件开销比不是很划算
4. 在GAg的两级预测器设计中,PC和BHR的部分内容会组合在一起索引PHT预测表,和gselect策略一样。这种设计中,存在着一种权衡,即考虑在固定的索引位数情况下,PC和BHR占据位数的不同。使用更多的PC内容能够减少冲突问题,而使用更多的BHR内容能够预测更复杂的分支历史模式
5. 使用全局分支历史的原因:一条分支指令的行为应该和之前其它不同的分支之间有相关.(branch B对于Branch C而言就是不相关分支,会增加预测器的训练时间来忽略BHR中不相关的历史位)
6. 局部历史预测器:通过单独跟踪每个分支的行为,预测器能够检测到特定分支的局部模式。例如一个具有较短循环次数的闭环(loop-closing)分支,并且跳转模式位111011101110,那么局部历史预测器能够很快的学习到该分支的模式,并给出正确的预测。(对于这种模式固定的分支来说,PHT的资源浪费很大)
7. Per-set branch history, per-set branch history table (SBHT):使用任意的哈希函数将分支指令划分到不同的集合,每个集合内的分支指令共享同一个BHR和PHT
8. Gshare:使用亦或的方式组合PC和分支历史信息,以包括更多的信息,因为两者的分布并不均匀,这种设计就称为 index sharing.
9. 发生转移预测错误的原因
- 根本无法预测的分支:
- 第一次遇到