BHT不是高速缓存,也不需要是高速缓存,因为如果在访问BHT时犯了错误,它是可以的。但是,BTB被设计为缓存,因为它总是必须返回命中或未命中。 BTB为什么不能弄错?
答案 0 :(得分:3)
BTB 可以出错,并且在实际执行跳转指令(或对直接分支进行解码)时,将检测到错误推测,从而在前端重新引导时产生气泡从正确的位置获取。
或者对于间接分支使用乱序的推测性执行,潜在的核心可能不得不回滚到最后一个已知的良好状态,就像从条件分支的错误分支方向恢复一样。
答案 1 :(得分:3)
BTB可能会出现错误命中,目前,某些实现通过使用部分标签来利用此错误命中。 (类似地,每个集合可能有一个条目完全未加标签;在直接映射的BTB中,没有条目会被加标签。一种传统的集关联设计,每种方法都具有(部分)标签,可以“免费”检测未命中如Peter Cordes' answer所述,此错误可以在以后的管道中检测到并纠正。
认识到BTB遗漏确实会限制投机活动。如果BTB用于通过指令高速缓存未命中来预取指令流,则避免高速缓存污染和带宽浪费错误推测会影响性能。当性能受到功率或热因素的限制时,即使误报被迅速发现并纠正,也可以避免错误推测,这样可以节省一些电能/热量,从而有可能改善性能。
对于两级BTB,命中指示可能会导致该分支无法访问L2 BTB。除了能效之外,L2 BTB可能被设计为提供较低的带宽或与另一个紧密耦合的获取引擎共享(因此,一个获取引擎未使用的带宽可以由另一个获取引擎使用)。
此外,BTB未命中的指示可用于改善分支方向预测。未命中表明该分支很可能不在最近的历史记录中(无论最近执行还是在最近执行期间未执行);分支方向预测器可以选择覆盖所采用的预测(在解码时计算目标),或者可以选择将预测视为低置信度(例如,使用动态谓词或优先从其他线程进行提取)。前者有效地从预测变量中过滤出了从未采取过的分支(允许使用具有破坏性的别名来预测已采取的分支);遗漏指示的两种使用都利用了旧分支信息不太可能准确的可能性。
BTB还可以提供一种简单的分支机构识别方法。 BTB未命中预测,获取操作不包含潜在采用的分支(过滤出非分支且从未采用的分支)。这避免了分支方向预测器必须预测非分支指令不采取指令(或在分支方向预测器预测采取指令时对BTB错误命中的指令解码后重定向取回)。这将非分支添加到过滤以避免破坏性混叠。 (一个单独的分支标识符可用于过滤非分支指令,并区分非条件,间接和返回指令,这些指令可能使用不同的目标预测变量,而可能不需要方向预测。)
如果BTB提供每个地址的方向预测或用于方向预测的其他信息,则未命中指示可以允许方向预测器使用其他方法来提供此类信息(例如,静态分支预测)。静态预测可能不是特别准确,但它可能比带有偏差的“随机”预测更准确(因为从未采用的分支可能永远不会进入BTB,并且替换可能基于最近采用的方法); “静态”预测变量还可以利用BTB未命中这一事实。如果使用一致的预测变量(将静态偏见与预测异化以减少破坏性混叠,则偏向的已采取分支与不偏向的未采取分支具有相同的预测变量更新),则按地址偏差为需要。
L1 BTB也可能与L1指令高速缓存集成在一起,特别是对于分支地址相关的目标,这样不仅没有遗漏检测(存在所有方式的标记),而且BTB提供的目标甚至可能不是目标。预测(避免需要重新计算目标)。这将需要用于间接分支的额外预测资源(并且L2 BTB可能用于支持在指令高速缓存未命中情况下的预取),但可以避免大量的冗余存储(因为这样的分支指令已经存储了偏移量)。
即使不需要确定BTB未命中,它也很有用。