当前位置: 首页 > 知识库问答 >
问题:

2位分支预测器的状态

王季萌
2023-03-14

我正在阅读Patterson和Hennessy的《计算机组织与设计:硬件/软件接口第5版》第5章中的动态分支预测部分,这时我看到了以下2位预测器状态的图表:

在预测错误两次后,2位预测器应该改变它的预测。但是根据这个图,当我们从左下方的状态开始时,如果机器在分支应该被“采取”时预测“未采取”两次,则到达右上方的预测采取状态。然而,此时机器会将状态更改为右下角的“预测未执行”,即使它错误地预测了分支应该“未执行”一次。

这难道不是错误的行为吗,这是否意味着状态机是错误的,或者我遗漏了什么?

当分支被采取两次时,在底部的 NOT TAKEN 深色状态,您可以看到达到的状态是浅色的“不确定”状态,而根据我的说法,它应该是深色的“确定”状态,因为分支连续两次执行相同的操作。

共有1个答案

池砚文
2023-03-14

当分支被采取两次时,在底部的 NOT TAKEN 深色状态,您可以看到达到的状态是浅色的“不确定”状态,而根据我的说法,它应该是深色的“确定”状态,因为分支连续两次执行相同的操作。

浅蓝色状态预测在连续两个分支后按您希望的方式进行。如果从那时开始采取分支,就不会有进一步的错误预测。我不认为你的“应该”是合理的。

它是一个2位饱和计数器;从00到11需要3个步骤,对应于图中的3个步骤。

您的想法可以使用状态的2位来记录最后2个分支的每一条路。但是,您将如何区分一次未采取的循环分支(退出前一个循环)和/或再次采取一次后(下一个循环的第一次迭代)与一次很少采取的分支之间的区别?如图所示,实际方式是每个循环错误预测一次循环分支,只有在最后一次迭代中,当它失败时。下次进入循环时的第一次迭代预测正确,将其返回为强烈采取。

您可以在Raffzahn关于68060分支预测器如何工作的回答中找到这种预测器的详细示例?在retrocomputing.SE上,包括当您获得BPB未命中时的静态预测(向后获取,向前未获取)(此分支没有预测条目)。

2位预测器远非完美;更高级的预测者还考虑全球历史是否比本地历史更好地预测这一分支。https://danluu.com/branch-prediction/

 类似资料:
  • 如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么

  • 分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?

  • 编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B

  • 我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要

  • 我有一个与相关预测因子相关的练习,它指出以下几点: 答:贝兹·R1,D … D:贝兹·R1,F … F:不是R1的R1 预测工作如下 > 获取当前指令 如果是分支,则确定预测器的当前状态并预测分支: a.row 由分支地址确定(在本例中为 A 或 D) b. 列由当前全局移位寄存器确定 c.使用单元格中的值确定来自状态机的预测(当前状态保存在单元格中) 执行分支,并确定实际决策(已采取:1,未采取

  • 我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但是只有这么远的时间才能带我,这让我想知道不同类型的分支。 在 c 中,固定目标的条件分支: 并且(如果我正确理解这个问题),无条件分支到变量目标: 是否存在性能差异?在我看来,如果这两种方法中的一种明显快于另一种,编译器只需将代码转换为匹配即可。 对于那些分支预测非常