迟滞位的提出则是基于以下思考:
一直以来在大多数分支预测器的设计中默认使用 2-bit 饱和计数器进行预测。之所以选取2-bit,是因为使用2-bit预测效果比一位更好,而使用超过2-bit也并不能获得可观的改进效果。
是否存在一个k-bit 的计数器,其中1<k<2,其预测效果不逊于2-bit计数器,例如,一个1.4-bit的计数器。当然,不可能实现一个1.4位的计数器,但如果几个计数器共享某些位,从开销上来讲二者是一致的。
2-bit 计数器的每一位在预测中扮演着不同的角色。高位称之为方向位,即跟踪分支的方向,由该位判定预测方向;低位则提供一个迟滞,以防止发生错误预测时方向位立即改变预测方向,称该位为“迟滞位”。
迟滞位作用原理:
如果一条分支指令偏向于跳转,使用一个单个的bit作为预测位时,在一次预测不跳转时就会造成两次错误预测:第一次是由于预测位预测跳转,但实际不跳转;第二次是由于上次预测错误后预测位变化为预测不跳转,而下次很大概率是跳转,则又预测错误。使用2-bit进行预测则可以有效避免这种错误预测。只有发生两次两次连续的错误预测时才会改变预测方向。
2-bit 饱和计数器的两种FSM:
在图(a)中,高位表示预测位,低位则没有特定含义,当低位与高位相同时表示是强预测。
在图(b)中,高位表示预测位,低位反映了预测强度,当低位为1时表示是强预测。称这种状态机为split counter,因为即使当迟滞位与方向位分开时,状态的强度仍然可以直接从迟滞位反映。如果2-bit计数器中倾向于偏向强状态,则迟滞位可能可以由其他不同的分支共享。
实验表明,分支预测计数器在超过90%的预测中保持在某个强预测状态。由此表明,使用2-bit计数器进行预测实际是过度的。文献【1】中测定了每个计数器使用0.44-bit迟滞位时可获得使用2-bit迟滞位时相同的效果。
共享的分裂计数器(SSC)
传统的2-bit计数器方向位和迟滞位存储在同一SRAM中,在SSC中,方向位和迟滞位分别存储在不同的SRAM中,如图4所示。而当二者分开存储时,其项数就不必完全相等了。例如,当2个计数器共享一个迟滞位时,迟滞位的项数就是方向位项数的一半。
这样做的弊端则是会产生分支别名效应。
参考文献
【1】Exploiting Bias in the Hysteresis Bit of 2-bit Saturating Counters in Branch Predictors.