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