由于需要通过分支危险和停顿来强制控制依赖,分支会损害管道性能。 循环展开是减少分支危险数量的一种方法; 我们还可以通过预测分支的行为来减少分支的性能损失。
分支预测是一种计算机技术,它的目的是在执行分支指令之前,预测分支的方向和目标地址,从而减少流水线的停顿和冲突,提高处理器的性能。
使用分支预测的原因是因为分支指令会中断指令流,导致处理器无法连续地取指和执行。如果处理器不做任何预测,就要等待分支指令执行完毕后才能确定下一条指令的地址,这样会造成很大的时间开销。
分支预测的方法有很多种,可以分为静态预测和动态预测。静态预测是在编译时或者硬件设计时就确定好的预测策略,比如总是预测跳转或者不跳转,或者根据分支指令的方向来预测。动态预测是根据运行时的历史信息来进行预测,比如根据最后一次分支结果来预测,或者使用两位饱和计数器来记录分支的状态。
分支预测的准确率对处理器性能有很大影响,如果预测错误,就要撤销错误的指令,并重新从正确的地址取指,这样会造成流水线的延迟和资源的浪费。因此,分支预测需要尽可能地提高准确率,同时也要考虑硬件复杂度和存储开销。
一、关联分支预测器
关联分支预测器是一种动态分支预测器,它可以根据前面的分支行为来选择不同的预测器。
关联分支预测器的一种形式是(m,n)预测器,它表示使用最近m个分支行为,从2^m个分支预测中进行选择,每一个预测是对应于单个分支的n位预测器。
例如,一个(2,2)预测器使用最近两个分支行为,从00、01、10、11四种可能的结果组合中选择一个,每一个结果对应一个2位饱和计数器。
关联分支预测器的优点是可以根据不同的分支模式来调整预测策略,提高准确率。
关联分支预测器的缺点是需要更多的硬件资源和存储空间,以及更复杂的索引和比较逻辑。
如果我们还查看其他分支的最近行为而不仅仅是我们试图预测的分支,则可能会提高预测准确性。 考虑 eqntott 基准测试中的一个小代码片段,该基准测试是早期 SPEC 基准测试套件的成员,它显示出特别糟糕的分支预测行为:
以下是我们通常为此代码片段生成的 RISC-V 代码,假设将 aa 和 bb 分配给寄存器 x1 和 x2:
我们将这些分支标记为 b1、b2 和 b3。 关键的观察结果是分支 b3 的行为与分支 b1 和 b2 的行为相关。 显然,如果分支 b1 和 b2 都不被采用(即,如果条件都计算为 true 并且 aa 和 bb 都被赋值为 0),则将采用 b3,因为 aa 和 bb 显然相等。
使用其他分支的行为进行预测的分支预测器称为相关预测器或两级预测器。 现有的相关预测器添加有关最新分支行为的信息,以决定如何预测给定分支。
最近m个分支的全局历史可以用一个m位的移位寄存器来记录,每一位记录分支是跳转还是不跳转。分支预测缓冲区可以用分支地址的低位和m位全局历史的拼接来索引。例如,在一个(2,2)缓冲区中,有64个总条目,分支的4个低位地址(字地址)和2个全局位表示最近执行的两个分支的行为,形成一个6位的索引,可以用来索引64个计数器。通过拼接(或者一个简单的哈希函数)来结合局部和全局信息,我们可以用结果来索引预测器表,并且得到一个预测,这个预测和标准的2位预测器一样快。
二、锦标赛预测器
锦标赛预测器是一种动态分支预测器,它的基本原理是将两个或以上的分支预测方法进行结合,充分发挥各预测方法的优势,以进一步提高分支预测的准确度。
锦标赛预测器通常包含一个全局预测器、一个局部预测器和一个选择器。全局预测器使用全局历史寄存器来记录所有分支指令的历史行为,局部预测器使用局部历史表来记录每个分支指令的历史行为,选择器使用选择历史表来记录哪个预测器的结果更准确。
预测时,全局预测器和局部预测器同时进行预测,并将结果传递给选择器。选择器根据选择历史表中的状态来选择其中一个预测结果作为最终的预测结果。
更新时,全局预测器和局部预测器根据分支指令的实际跳转行为和自身的更新策略进行更新。选择器根据全局预测器和局部预测器的正确性来更新选择历史表中的状态。
锦标赛预测器的优点是可以根据不同的分支模式和关联性来动态调整预测策略,提高准确率和适应性。
锦标赛预测器的缺点是需要更多的硬件资源和存储空间,以及更复杂的逻辑和控制。
关联分支预测器的主要动机来自于观察到仅使用局部信息的标准 2 位预测器在一些重要分支上失败。 添加全球历史可能有助于纠正这种情况。 锦标赛预测器将这种洞察力提升到了一个新的水平,通过使用多个预测器(通常是全局预测器和局部预测器),并使用选择器在它们之间进行选择,
锦标赛预测器使用分支地址来索引一组 2 位选择计数器,该计数器在本地预测器和全局预测器之间进行选择。 在这种情况下,选择器表的索引是当前分支地址。 这两个表也是 2 位预测器,分别由全局历史记录和分支地址索引。 选择器的作用类似于 2 位预测器,当连续发生两个错误预测时,更改分支地址的首选预测器。 用于索引选择器表和局部预测器表的分支地址的位数等于用于索引全局预测表的全局分支历史的长度。
SPEC89 上三种不同预测器的错误预测率与预测器大小(以千位为单位)的关系。 预测器是一个局部 2 位预测器、一个在图中每个点使用全局和局部信息进行优化构造的相关预测器以及一个锦标赛预测器。 尽管这些数据适用于旧版本的 SPEC,但最新 SPEC 基准测试的数据显示出类似的行为,可能会在预测变量大小稍大的情况下收敛到渐近极限。