Computer Architectrure: Quantitative Approch 第三章第三节

Reducing Branch Costs With Advanced Branch Prediction

因为分支的延迟会增加控制依赖性,所以分支会降低流水线的性能。解循环是一个减少分支延迟的方法;除此外我们还可以通过预测跳转的操作来减少跳转带来的性能损失。我们测量了依赖于编译时间信息或者依赖于可观测的单个孤立分支动态行为的简单分支预测变量。随着需要处理指令数和每个时钟的issue指令数量随流水线深度增加而增加,精确预测跳转越来越重要。在本节我们测试了用来促进流水线预测精度的技术。本届对Appendix C第二节的简单两比特预测方法进行扩展,并且在处理前我们需要对预测的操作进行理解。

Correlating Branch Predictors

Appendix C中的2-bit跳转仅仅使用了目前分支近期的行为来预测该分支的未来行为。如果我们可以同时看到其他跳转的行为就可以将预测精度提高。考虑如下的一个小eqntott基准测试代码片段(早期SPEC基准测试套件的一部分),其分支预测性能很差:

在这里插入图片描述

以下是由以上代码片段生成的RISC-V的代码,假设aa和bb相应于寄存器x1和x2:

在这里插入图片描述

我们将跳转标记成b1, b2和b3.可以看到对b3起到决定性作用的关键点是b1和b2的结果。可以看出,如果b1和b2都不执行,那么b3将会执行,因为很明显aa和bb是相等的。在这种情况下仅仅使用一个跳转的结果来预测b3的结果是无法准确预测行为的。

利用其他跳转行为预测当前跳转的方式叫做相关预测或者两阶预测。现有的相关预测利用最近跳转行为的信息来预测给定的跳转。例如,一个(1,2)预测变量在预测特定分支时使用最后一个分支的行为从一对2位分支预测变量中进行选择。在一般情况下,(m,n)个预测变量使用最后m个分支的行为从2^m个分支预测变量中进行选择,每个预测变量都是单个分支的n位预测变量。 这种类型的相关分支预测器的优势在于,与2位方案相比,它可以产生更高的预测率,并且只需要少量的附加硬件即可。

硬件的设计可以通过观察:最近M个分支的全局历史可以记录在M位移寄存器中,其中每个位记录是否进行了跳转。然后可以使用来自分支地址的低阶位与m位全局历史的级联来索引分支预测缓冲区。例如,在(2,2)缓冲区中共有64个条目,分支的4个低位地址位(字地址)和两个最近执行的分支的行为的2个全局位形成一个6位索引,该索引可用于索引这64个计数器。通过串联(或简单的哈希函数)组合本地信息和全局信息,我们可以将预测结果表与结果建立索引,并尽可能快地获得标准2位预测结果的预测结果,这样我们可以非常快的的到结果。

与两笔特预测相比这种预测的性能会好多少呢?为了公平地比较,我们必须使用相同的状态比特来计算,一个(m,n)预测器需要的比特数是:

没有全局历史的2位预测是一个简单的(0,2)预测器。

在这里插入图片描述
在这里插入图片描述

Figure 3.3比较了早期4K条目(0,2)预测器和1K条目(2,2)预测器的错误率。可以看出,这种相关的预测器不仅在状态位数总数相同的情况下胜过简单的2位预测器,而且经常在条目数不受限制的情况下胜过2位预测器。

可能最广为人知的正确预测是McFarling’sgshare predictor. 在gshare中,索引是通过使用“异或”将分支的地址和最新的条件分支结果组合起来而形成的,该异或本质上是充当分支地址和分支历史的哈希列表。哈西列表的结果用于索引2位计数器的预测阵列,如Figure 3.4所示。在简单的预测场景中gshare非常有效,并且被用作和其他复杂跳转比较的基准。将本地预测历史和全局预测历史混合起来做预测经常被称为合金化预测变量或者混合预测变量。

在这里插入图片描述
Tournament Predictors: Adaptively Combining Local and Global Predictors

在这里插入图片描述

之所以关联分支预测变量是因为观察到以下问题:仅使用本地信息的标准2位预测变量在某些重要分支上均失败。增加全局历史可以帮助避免这种问题。如Figure 3.5所示,比赛预测器通过使用多个预测器(通常是全局预测器和本地预测器)并在它们之间进行选择,将这种方法提高到一个新的水平。全局预测变量使用最新的分支历史记录对预测变量进行索引,而局部预测变量使用分支的地址作为索引。 比赛预测器是混合预测器或合金预测器的另一种形式。

比赛预测器可以在中等大小(8K–32K位)下实现更高的准确性,并且可以有效地使用大量的预测位。现有的竞赛预测器在每个分支上使用2位饱和计数器,基于哪个预测器(本地,全局或时变混合)在最近的预测中最有效对两个不同的预测器进行选择。就像简单的2位预测一样,饱和计数器在更改首选预测变量之前需要进行两次错误预测。

竞赛预测的优势是可以为特定的分支选择正确的预测,这对整数基准非常重要。对于SPEC整数基准典型的竞赛预测40%的情况会选择全局变量,而浮点数基准只有少于15%的情况会用到全局变量。除了率先推出竞赛预测器的Alpha处理器外,还有数款AMD处理器使用了竞赛预测器。

在这里插入图片描述

Figure 3.6展示了以SPEC89为基准,不同位数三种预测器(局域2位预测器,相关预测器和锦标赛预测器)的性能。局域预测首先达到了预测极限。相关的预测变量的性能显著改进,竞赛预测变量具有更好的性能。对于新的SPEC版本,结果将是相似的,但无法达到渐进,直到预测尺寸达到很大。

局域预测包含了两位预测。最高级的局域预测是由1024个10位条目组成的本地历史表;每个10位条目对应于该条目的最新10个分支结果。也就是说,如果分支连续执行10次或更多次,则本地历史记录表中的条目将全部为1。如果分支是交替采用和不采用的,则历史记录条目由交替0和1。此10位历史记录允许覆盖多达10个分支的模式和预测。从本地历史记录表中选择的条目用于索引由3位饱和计数器组成的1K条目表,这些计数器提供本地预测。这种方法总共需要29K bits的大小,其实现了高精度的预测,同时比相同精度下的一位预测需要的资源更少。

Tagged Hybrid Predictors

截止到2017年最有效的预测器包含了混合多预测器,其可以追踪一个预测是否可能与当前分支相关。一类重要的预测变量是松弛地基于称为PPM(部分匹配的预测)的统计压缩算法。 PPM(参见Jim Enez和Lin,2001)类似于分支预测算法,根据历史预测未来行为。此类分支预测变量称为标记的混合预测变量(请参见Seznec和Michaud,2006年),它使用了一系列具有不同长度历史记录的全局预测变量。

在这里插入图片描述

例如Figure 3.7所示,五成分标记混合预测器具有五个预测表:P(0),P(1),… P(4),其中使用PC的哈希值和最近i个分支的历史记录来访问P(i)(保留在移位寄存器h中,就像在gshare中一样).使用多个历史长度来索引单独的预测变量是第一个关键差异。第二个关键区别是表P(1)至P(4)中标签的使用。因为不需要100%匹配,所以标签可以很短:预计4-8位的小标签获得了大部分优势。仅当标签与分支地址的哈希和全局分支历史记录匹配时才使用来自P(1)…P(4)的预测。P(0…n)中的每个预测变量都可以做成标准的2位预测器。实际上三位预测比两位预测效果要好。

给定分支的预测是具有最长分支的预测器,其历史也具有匹配的标签。 P(0)始终匹配,因为它不使用任何标记,并且如果P(1)到P(n)都不匹配,则它将成为默认预测。此预测变量的带标签混合版本在每个历史索引的预测变量中还包括一个2位使用字段,使用字段指示最近是否使用过预测,因此可能更准确; 使用字段可以在所有条目中定期重置,以便清除旧的预测。实现这种类型的预测器还涉及更多细节,尤其是如何处理错误预测。最佳预测变量的搜索空间也很大,因为预测变量的数量,用于索引的确切历史记录以及每个预测变量的大小都是可变的。

标签混合预测(TAGE,TAgged GEometic)和较早的基于PPM的预测器已成为最近的年度年度国际分支预测竞赛的获胜者。此类预测器的性能要优于gshare和具有合适内存量(32–64 KiB)的比赛预测器,此外,此类预测器似乎能够有效地使用较大的预测缓存来提高预测精度。

大型预测变量的另一个问题是如何初始化预测变量。 它可以随机初始化,在这种情况下,将花费大量执行时间才能将有用的预测填充到预测变量中。一些预测器(包括许多近期出现的预测器)包括一个有效位,指示该预测器中的条目是否已设置或处于“未使用状态”。在后一种情况下,我们可以使用某种方法来初始化该预测条目,而不是使用随机预测。例如,某些指令集包含一位用来指示是否希望采用关联分支。在动态分支预测之前的解决方案里,这样的提示位是预测; 在最近的处理器中,该提示位可用于设置初始预测。我们还可以根据分支方向设置初始预测:将前向分支初始化为未采用,而可能是循环分支的后向分支则按照已采用进行初始化。对于运行时间较短的程序和具有较大预测变量的处理器,此初始设置可能会对预测性能产生可观的影响。

在这里插入图片描述

Figure 3.8显示了混合标记的预测变量显着优于gshare,尤其是对于像SPECint和服务器应用程序这样的难以预测的程序。在此图中,性能是以每千条指令的错误预测来衡量的; 假设分支频率为20%–25%,则对于多媒体基准测试,gshare的错误预测率(每个分支)为2.7%–3.4%,然而标签混合预测有1.8%-2.2%的错误率,大约少了1/3的错误率。与gshare相比,加标签的混合预测变量的实现更为复杂,并且由于需要检查多个标签并选择预测结果而可能会稍慢一些。但是,对于流水线深度深的处理器,由于分支错误预测带来的损失较大,因此提高准确性要比这些缺点更为重要。因此,许多高端处理器的设计者选择在其最新实现中囊括标记混合预测器。

The Evolution of the Intel Core i7 Branch Predictor

如上一章所述,在2008年(使用Nehalem微体系结构的Core i7 920)和2016年(使用Skylake微体系结构的Core i7 6700)之间有六代Intel Core i7处理器。 由于深度流水线技术和每个时钟多个issue的结合,i7一次有许多处理中的指令(最多256条,通常至少30条)。这使得分支机构预测变得至关重要,而这一直是英特尔一直在不断改进的领域。 也许由于分支预测器的性能至关重要的性质,英特尔会将其分支预测器的细节保密。即使对于像2008年推出的Core i7 920之类的较旧的处理器,它们也只能发布有限的信息。 在本节中,我们将简要介绍已知的内容,并将Core i7 920的预测指标与最新的Core i7 6700的预测指标进行比较。

Core i7 920使用了两级预测器,该预测器具有较小的第一级预测器,旨在满足每个时钟周期预测分支的周期约束,并使用较大的第二级预测器作为备份。每个预测器组合了三个不同的预测器:(1)简单的2位预测器,在Appendix C中引入(并在先前的竞赛预测器中使用); (2)像我们刚刚看到的那样的全局历史预测指标; (3)回路退出预测器。循环退出预测器使用计数器来预测被检测为循环分支的分支的实际分支数(即循环迭代数)。对于每个分支,通过跟踪每个预测的准确性(就像锦标赛预测器),从三个预测器中选择最佳预测。除了此多级主预测器之外,一个单独的单元还可以预测间接分支的目标地址,并且还可以使用堆栈来预测返回地址。

尽管对最新i7处理器中的预测器知之甚少,但是有充分的理由相信英特尔正在采用带标签的混合预测器。这种预测器的一个优点是,它结合了早期i7中所有三个第二级预测器的功能。 具有不同历史长度的带标签的混合预测变量包含循环退出预测变量以及本地和全局历史预测变量。 仍然使用单独的返回地址预测变量。

在这里插入图片描述

与其他情况一样,推测会在评估预测变量时带来一些挑战,因为错误预测的分支很容易导致获取和错误预测另一个分支。为简单起见,我们计算了错误预测的数量占成功完成分支的数量(不是那些错误推测的结果)的百分比。Figure 3.9显示了SPECPUint2006基准测试的这些数据。这些基准比SPEC89或SPEC2000大得多,其结果是,即使使用更强大的预测器组合,错误预测率也高于Figure 3.6中的错误预测率。 因为分支错误预测会导致无效的推测,所以这会导致工作浪费,正如我们将在本章稍后看到的那样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值