首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么分支目标缓冲区被设计为缓存?

问为什么分支目标缓冲区被设计为缓存?
EN

Stack Overflow用户
提问于 2018-10-30 13:55:12
回答 2查看 397关注 0票数 2

BHT不是缓存,也不需要缓存,因为如果在访问它时出错也没关系。然而,BTB被设计为缓存,因为它总是必须返回命中或未命中。为什么边防局就不能犯错呢?

EN

回答 2

Stack Overflow用户

发布于 2018-10-30 13:57:16

BTB可能会出错,并且当跳转指令实际执行(或解码,对于直接分支)时,将检测到误推测,从而导致在前端重新定向以从正确位置获取时出现气泡。

或者,对于间接分支的无序投机执行,内核可能必须回滚到最后一个已知良好的状态,就像从条件分支的错误分支方向恢复一样。

票数 4
EN

Stack Overflow用户

发布于 2018-10-31 09:40:55

BTB可以呈现错误命中,并且这当前被一些实现通过使用部分标签来利用。(类似地,每个集合可以有一个条目是完全未标记的;在直接映射的BTB中,不会标记任何条目。传统的集合关联设计对每条路都有(部分)标签,作为路选择的一部分,给出了“自由”未命中检测。)正如Peter Cordes' answer所指出的,这个错误可以在以后的管道中检测到并纠正。

认识到BTB未命中确实允许抑制投机。如果BTB用于预取指令高速缓存未命中之后的指令流,则避免高速缓存污染和带宽浪费误推测可能会对性能产生影响。当性能受到功率或散热因素的限制时,即使可以快速检测和纠正,也可以避免误猜测,从而节省一些电力/热量生成,从而潜在地提高性能。

对于两级分支总线,命中指示可能允许该分支无法访问L2分支总线。除了能源效率之外,L2分支缓冲器可能设计为提供较低的带宽,或者与另一个紧密耦合的获取引擎共享(因此一个获取引擎未使用的带宽可以由另一个获取引擎使用)。

此外,BTB未命中的指示可用于改进分支方向预测。未命中指示分支很可能在最近的历史中未被采用(无论是最近未执行还是在最近的执行期间未被采用);分支方向预测器可以选择覆盖被采用的预测(目标在解码时计算),或者可以选择将预测视为低置信度(例如,使用动态预测或给予从其他线程获取的优先级)。前者有效地从预测器中过滤出从未被采用的分支(允许具有预测被采用的破坏性别名);两种未命中指示的使用都利用了旧分支信息不太可能准确的可能性。

BTB还可以提供一种简单的分支识别方法。BTB未命中预测提取不包含可能采用的分支(过滤掉非分支和从未采用的分支)。这避免了分支方向预测器必须对非分支指令预测不采用(或者当分支方向预测器预测采用时,在BTB假命中时重定向指令解码后获取)。这会将非分支添加到过滤中,以避免破坏性混叠。(可以使用单独的分支标识符来过滤非分支指令,并区分非条件指令、间接指令和返回指令,这些指令可能使用不同的目标预测器,可能不需要方向预测。)

如果分支缓冲器提供每地址方向预测或用于方向预测的其它信息,则未命中指示可允许方向预测器使用其它方法来提供此类信息(例如,静态分支预测)。静态预测可能不是特别准确,但它可能比采用偏差的“随机”预测更准确(因为从未采用的分支可能永远不会进入BTB,并且替换可能基于最近最少采用);“静态”预测还可以利用BTB未命中的事实。如果使用一致预测器(其中静态偏置与预测异或以减少破坏性混叠,所采用的偏置采用的分支具有与未采用的偏置不采用的分支相同的预测器更新),则需要按地址偏置。

L1分支缓冲器也可以与L1指令高速缓冲存储器集成,特别是对于分支地址相关的目标,使得不仅没有未命中检测(存在用于所有路的标签),而且分支分支缓冲器提供的目标甚至可以不是预测(避免需要重新计算目标)。这将需要用于间接分支的额外预测资源(并且L2分支可用于支持指令高速缓存未命中下的预取),但是可以避免显著的冗余存储(因为这样的分支指令已经存储了偏移)。

即使BTB未命中确定不是必需的,它也是有用的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53058197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档