2

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

以下是我的问题:

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

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

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

4

2 回答 2

6

在这里预测目标有什么神秘之处?根据 LABEL 的编译值,您知道它将是什么。

由于 CPU 流水线深度和缓存延迟,在获取指令、完全解码以识别分支目标和能够获取该指令之间需要许多周期。因此,您可以预测目标以便抢先获取下一条指令。

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

因为 PC 唯一标识了一个特定的分支指令!您还打算如何索引分支预测表?

于 2012-06-23T23:55:13.797 回答
4

添加更多颜色

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

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

于 2012-06-25T22:08:07.820 回答