所以我了解流水线处理器分支预测中使用的基本技术 - 如 2 位饱和计数器、两级自适应预测器等。
以下是我的问题:
1)分支目标预测:为什么这很重要,这里使用了哪些机制?当我想到一个分支时,我想到"bne r2,r3,LABEL",它说如果r2 != r3然后分支到LABEL,这意味着做PC(程序计数器)= PC + LABEL。在这里预测目标有什么神秘之处?你知道它将基于LABEL的编译值是什么。我不知何故错过了这里的重点。
2)为什么程序计数器值本身(例如0x4001000C),或者至少是它的最后几个位,被用作分支预测方案的一部分?我看到了一个方案,其中PC的最后4位连接到(4位)分支历史寄存器,并且8位值用于访问模式历史记录表。我认为PC非常随意!
感谢您帮助理解这些问题
在这里预测目标有什么神秘之处?你知道它将基于LABEL的编译值是什么。
由于 CPU 管道深度和缓存延迟,在获取指令、完全解码指令以识别分支目标和能够获取该指令之间需要许多周期。 因此,您预测目标以便先发制人地获取下一条指令。
为什么程序计数器值本身(例如0x4001000C),或者至少是它的最后几个位,被用作分支预测方案的一部分?
因为PC唯一地标识特定的分支指令! 您还将如何为分支预测表编制索引?
添加更多颜色
1)分支目标预测对于您给出的示例来说并不重要。 对于虚函数和计算分支之类的东西(对于 switch 语句等),它更为重要。 在这两种情况下,分支目标在编译时都是未知的。 在虚函数的情况下,它必须从内存位置(虚函数表)加载,而在switch语句的情况下,我们通常通过在表中查找分支偏移量来完成。 即使虚函数情况是无条件的,它仍然大量使用 BTB。
2)基本上有两类一般的预测因子,一类是全局的,一类是按地址的。 全局预测器的好处是能够处理更长的模式历史(已采取/未采取的历史记录)。 每个地址预测变量的优点是能够特定于某些分支位置,但通常具有较短的历史记录(因为它们是每个地址的,因此占用大量空间)。 许多处理器使用通常称为锦标赛分支预测器的东西,其中既有全局预测器又有每个地址的预测器,然后有一个预测器(置信度估计器)来选择预期会给出更好答案的预测器。