【发布时间】:2014-04-25 20:04:44
【问题描述】:
分支目标谓词(BTP)与分支谓词(BP)不同。我知道 BTP 会找到分支将跳转到的位置,而 BP 只是决定可能会采用哪个分支。
BTP 是否依赖于 BP,如果 BTP 不使用 BP 来预测采用哪个分支,它怎么可能知道分支的目标?
我不明白为什么会有如此巨大的差异?一旦分支被预测为被采用,是不是找到目标不是像读取指令中的地址那样简单?
【问题讨论】:
分支目标谓词(BTP)与分支谓词(BP)不同。我知道 BTP 会找到分支将跳转到的位置,而 BP 只是决定可能会采用哪个分支。
BTP 是否依赖于 BP,如果 BTP 不使用 BP 来预测采用哪个分支,它怎么可能知道分支的目标?
我不明白为什么会有如此巨大的差异?一旦分支被预测为被采用,是不是找到目标不是像读取指令中的地址那样简单?
【问题讨论】:
分支目标并不总是在代码中编码,您可以根据寄存器或内存读取的值进行间接分支或调用和返回。在这些情况下,在实际到达分支之前预测地址是非常困难的。还要记住,CPU 通常是流水线的,这意味着即使前端到达分支(并且需要决定跳转到哪里),其结果可能与分支目标相关的先前指令仍然没有进入执行或内存读取阶段,因此如果存在这种依赖关系,您可能需要停止。
至于预测 - 我不会说它完全不相关,但存在巨大差异,分支分辨率(采用/未采用)是一个位,目标要大得多,并且可能在期间有许多不同的值程序生命周期。一个 x86 ret,例如可能需要跳转到调用其函数的任何地方(我给出这个例子是因为一些 CPU 对这种情况进行了优化 - 查找返回堆栈缓冲区)。学习机制也可能非常不同,具体取决于您实施的预测器,但更重要的是 - 模式可能不同 - 您可能有一个分支在 99% 的情况下采用,但每次都有不同的目的地,或者占了 50% 的时间但几乎总是跳到同一个地方的分支。
但是,您可以使用相同的启发式方法来跟踪这两种类型的预测,通常是对分支历史模式进行一些操作,因此大多数 CPU 可能确实在预测器之间保持密切关系。
【讨论】: