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

计算机组织-“预测执行”(总是执行)分支预测是如何工作的?

慕宏儒
2023-03-14

我可以理解“预测未执行”是如何工作的。它只是继续获取PC 4指令。直到分支被解决,如果分支被占用,则刷新之前获取的所有指令。

但我不明白“预测”是如何起作用的。我认为分支指令需要在解码阶段(分支目标地址计算需要完成),然后处理器才能预测它将被html" target="_blank">执行,对吗?

那么“预测采取”如何在MIPS 5级流水线等机器上实现?(分支目标地址计算和分支是否采取是在ID(指令解码)阶段决定的)

如果分支可以在ID阶段解析,这是否意味着预测是在If(指令获取)阶段完成的?

我很困惑,因为有人说“预测执行”或“预测未执行”称为“静态分支预测”,编译器将执行所有操作。因此,在“预测执行”的情况下,编译器将把分支目标指令插入分支指令之后的位置。

我的想法正确吗?还是他的话是正确的?

共有1个答案

商振
2023-03-14

MIPS具有分支延迟槽,可以隐藏简单的5级管道的分支延迟,对于无条件分支(在ID中检测到,提取后的阶段),甚至对于有条件分支,可以通过在EX的前半部分评估它们来及时转发到IF的后半部分。(MIPS I R2000做到了这一点)。

但是,完全避免提取泡沫需要在解码之前预测分支的存在,以及它们的目标地址。(包括无条件直接分支机构)。真正的预测者会这样做。有关现代x86上的示例,请参见慢速jmp指令。

但这与经典的5级RISC相差甚远。

如果您将这样一个动态预测器放入一个没有分支延迟槽的5级RISC中,例如一个简单的RISC-V,您可能会让它在fetch当前获取的位置之前进行检查,这样您就可以预测下一个周期中要获取的内容。

您只能对条件分支使用静态总是执行预测。(并且通常只有向后位移,因为那些通常是循环分支;预测前向分支不被采用在实践中效果很好,尤其是当编译器/程序员相应地布置他们的代码时,因此< code>if()类型分支的常见情况是不被采用)。当你发现有一个分支的时候,你已经知道它是否是无条件的,在这种情况下不需要任何预测。

如果您还没有使用MIPS I分支条件早期评估之类的技巧,您的分支延迟将是条件分支的2个周期(IF到EX)。静态总是采取的预测会将其缩短到1个周期(IF到ID)。不是0,如你所说,因为在分支指令本身被解码时,未采取的路径仍在被获取。

也就是说,您可以设计ID阶段,以便在看到条件分支时为下一个周期重新定向fetch。(可能是在检查向前/向后的位移之后,即仅检查2补码值的高位。)

因此,您可以针对前向分支的跌落和循环向后分支进行优化,因为它们相对常见。为了做得更好,您需要使用动态预测的缓存,按地址或以各种复杂方式(例如,TAGE使用最近的分支历史记录作为索引的一部分,并查看 https://danluu.com/branch-prediction/,了解从非常简单到不太简单的预测器的历史进度)。

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

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

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

  • 问题内容: 是什么使线程的执行顺序不可预测?调度程序是在某个时候使用随机数还是检查系统资源,还是查看哪个线程已经等待了足够长的时间或…? 问题答案: 调度程序通常是OS的调度程序。它受许多因素的影响,包括计算机上的其他进程正在执行的操作,硬件在执行的操作(中断)等。根据操作系统的不同,我想有时可能涉及随机数,但我通常怀疑不是。多个可变时间间隔可能会重叠,这只是一种不可预测的方式。

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

  • 我目前正在编写一个Intel 8042驱动程序,并编写了两个循环来等待一些缓冲区准备就绪: 如您所见,我在循环中插入了指令。我最近才知道它,很自然地想尝试一下。 由于 的内容是不可预测的,因为它是 I/O 读取,因此分支预测器将使用循环指令填充管道:经过一些迭代后,它会注意到总是采用一个分支,类似于这里的情况。 如果分支预测器真的在其预测中包含I/O指令,那么上述是正确的,我不确定。 那么分支预测