分支预测 - 关于目标预测和使用PC的问题

时间:2012-06-23 23:46:03

标签: x86 hardware computer-architecture branch-prediction

所以我理解流水线处理器分支预测中使用的基本技术 - 比如2位饱和计数器,两级自适应预测器等。

以下是我的问题:

1)分支目标预测:为什么这很重要,这里使用了哪些机制?当我想到一个分支时,我认为“bne r2,r3,LABEL”表示如果r2!= r3然后分支到LABEL,这意味着做PC(程序计数器)= PC + LABEL。在这里预测目标有什么神秘之处?你知道它将基于LABEL的编译值。 我可能在某种程度上忽略了这一点。

2)为什么程序计数器值本身(例如0x4001000C)或至少其最后几位用作分支预测方案的一部分?我看到了一种方案,其中PC的最后4位连接到(4位)分支历史寄存器,并且该8位值用于访问模式历史表。 我认为PC很随意!

感谢您了解这些问题的任何帮助

2 个答案:

答案 0 :(得分:6)

  

在这里预测目标有什么神秘之处?你知道它基于LABEL的编译值会是什么。

由于CPU流水线深度和缓存延迟,在获取指令,完全解码以识别分支目标以及能够获取该指令之间需要很多周期。所以你预测目标是为了先发制人地获取下一条指令。

  

为什么程序计数器值本身(例如0x4001000C)或至少其最后几位用作分支预测方案的一部分?

因此,PC唯一地标识特定的分支指令!您还要如何为分支预测表编制索引?

答案 1 :(得分:4)

添加更多颜色

1)对于您给出的示例,分支目标预测并非如此。对于虚函数和计算分支(对于switch语句等)而言,它更为重要。在这两种情况下,分支目标在编译时都是未知的。在虚函数的情况下,它必须从内存位置(虚函数表)加载,在switch语句中,我们通常通过在表中查找分支偏移来完成。即使虚函数案例是无条件的,它仍然会大量使用BTB。

2)基本上有两类通用预测器,即全局预测器和每地址预测器。全局预测器的好处是能够处理更长的模式历史(采取/不采用的历史)。每个地址预测器具有能够特定于某些分支位置的优点,但通常具有较短的历史(因为它们是每个地址并且因此占用大量空间)。许多处理器使用通常称为锦标赛分支预测器,其中既有全局预测器又有每地址预测器,然后有预测器(置信度估计器)来选择预期会给出更好答案的预测器。