【问题标题】:Branch target prediction vs branch prediction分支目标预测与分支预测
【发布时间】:2014-04-25 20:04:44
【问题描述】:

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

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

我不明白为什么会有如此巨大的差异?一旦分支被预测为被采用,是不是找到目标不是像读取指令中的地址那样简单?

【问题讨论】:

    标签: branch-prediction


    【解决方案1】:

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

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

    但是,您可以使用相同的启发式方法来跟踪这两种类型的预测,通常是对分支历史模式进行一些操作,因此大多数 CPU 可能确实在预测器之间保持密切关系。

    【讨论】:

    • "之前的指令,其结果可能与分支目标有关,但尚未处于执行或内存读取阶段",在分支到达执行时,之前的指令已经执行舞台虽然.??
    • @Jonathan。好吧,由于分支依赖于它们,它会在它们被执行之前停止,但这可能需要很长时间才能发生(例如,如果它们依赖于内存访问数据),所以它可能会导致分支执行。但是前端需要从预测的路径中获取新的指令,所以分支执行不是有趣的点,而是什么时候到达获取阶段(因为接下来要获取的东西取决于预测)。跨度>
    猜你喜欢
    • 2014-03-03
    • 2015-11-24
    • 2015-09-20
    • 2016-07-01
    • 2011-02-01
    • 2012-07-02
    • 2015-09-25
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多