提问者:小点点

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


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

以下是我的问题:

1)分支目标预测:为什么这很重要,这里使用了什么机制?当我想到一个分支时,我想到了“bne r2, r3,LABEL”,它说如果r2!=r3然后分支到LABEL,这意味着PC(程序计数器)=PCLABEL。这里预测目标有什么神秘的?你知道它将基于LABEL的编译值。不知何故,我可能忽略了这一点。

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

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


共2个答案

匿名用户

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

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

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

因为PC唯一地标识了一个特定的分支指令!否则你将如何索引分支预测表?

匿名用户

增加一点颜色

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

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