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