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

分支目标预测与分支预测

慕容成和
2023-03-14

分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。

BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢?

我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?

共有1个答案

林俭
2023-03-14

分支目标并不总是在代码中编码,您可以具有间接分支或调用和返回,这取决于寄存器或内存读取的值。在这些情况下,在实际到达分支之前预测地址是非常困难的。还要记住,CPU通常是管道化的,这意味着即使前端到达分支(并且需要决定跳转到哪里),其结果可能与分支目标相关的先前指令仍未处于执行或内存读取阶段,因此如果存在此类依赖关系,则可能需要停止。

至于预测 - 我不会说它是完全不相关的,但是存在巨大的差异,分支分辨率(采取/不采取)是一个位,目标要大得多,并且在程序生命周期中可能有许多不同的值。例如,可能需要一个x86 ret跳转到调用其函数的任何地方(我给出这个例子,因为一些CPU对这种情况进行了html" target="_blank">优化 - 查找返回堆栈缓冲区)。学习机制也可能非常不同,这取决于你实现的预测因子,但更重要的是 - 模式可能不同 - 你可以有一个分支,在99%的情况下被采取,但每次都有不同的目的地,或者一个分支采取了50%的时间,但几乎总是跳到同一个地方。

然而,您可以使用相同的试探法跟踪这两种类型的预测,通常是对分支历史模式的一些操作,因此大多数CPU可能在预测器之间保持密切的关系。

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

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

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

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

  • 我正在读一本关于计算机体系结构的书,我在这一章讨论分支预测。有一个小练习,我很难把我的头缠绕在它周围。 考虑以下内部for循环 ------>内循环: b)1位分支预测缓冲器会改善性能吗(与a相比)?假设第一个预测是“未采取”,并且没有其他分支映射到该条目。 ----假设第一个预测是“不采取”,如果预测错误,则1位预测器反转该位。所以它将是NT/T/T。这是否使它具有与问题a)相同的性能?有1个未

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