TAGE分支预测

1. 什么是TAGE分支预测

   TAGE分支预测是综合O-GEHL分支预测和PPM-like分支预测所设计的分支预测算法。由base predictor T 0 T_{0} T0,和一序列(partially)tagged predictor components T i T_{i} Ti组成,tagged predictor components T i T_{i} Ti所采用索引历史长度是不同的,成几何长度关系。
   一般的分支预测器将所有的分支共同使用同一个表进行预测,而TAGE分支预测器将分支分成两类,与历史相关的分支和与历史不相关的分支,分别使用基础预测表和标记预测表进行预测,这使得分支预测准确率有着显著的提高。

  1. TA(Taged)
       目前分支预测的索引一般为PC或者PC和global history的xor,出于存储效率考虑,只有一部分会用于索引,会有aliasing。这个时候如果把多余的PC存起来做tag,就能更好地比对出哪些是真match,哪些是aliasing,有助于选取到真正对应的entry。
  2. GE(Geometrical)
       一般认为global history match的长度越多,预测就越准确。所以TAGE选取了几何增长的history长度,如32,64,128,256。原则上,每次优先选取最长的match做预测。当然也有一些简单地branch可能不需要那么长,短的就好。TAGE的userful counter 就发挥了作用。如果短的history predict的效果就很好,就会通过userful counter 反映出来。

2. TAGE预测器结构

   TAGE由一个提供基本预测的T0预测器和一系列tagged预测器组件 T i T_{i} Ti 组成(i介于1到M之间,包括0但不包括M)。这些tagged预测器组件使用不同长度的分支历史进行索引,形成一个几何级数,即 L ( i ) = ( i n t ) ( a i − 1 ∗ L ( 1 ) + 0.5 ) L(i) = (int)(a^{i-1}*L(1)+0.5) L(i)=(int)(ai1L(1)+0.5)。其中,

  • T 0 T_{0} T0:base predictor,2bit饱和计数器ctr组成的基础预测表,采用指令PC索引。
  • T i T_{i} Ti:tagged predictor components,一个entry包含一个3bit的有符号计数器ctr,符号位(sign)用来提供预测信息,分支指令的标签tag,以及2bit的无符号useful计数器 u 。
    • pred:ctrl项,用来预测是否进行跳转。
    • tag:保存pc和跳转历史哈希之后的结果,以便预测时判断是否命中。一般在7-14可以取得好的效果,使用10或许是一个很好的权衡,同时,标签的宽度应该(稍微)随着历史长度的增加而增加:在使用最长历史的表上,错误的匹配更有害。
    • u:表示这个组件的置信度。
      在这里插入图片描述

3. TAGE预测原理

   在预测时,同时访问基本预测器和tagged预测器组件,即同时访问 T 0 T_{0} T0 T i T_{i} Ti 表。基本预测器提供一个默认预测,而tagged预测器组件只有在tag匹配的情况下才提供预测。
   最终的预测结果是tag匹配的所有tagged组件中使用最长分支历史的组件提供的,而在所有tagged预测器组件没有tag匹配的情况下,才会使用基本预测器提供的结果。

  • provider组件:最后提供预测结果的预测器组件,tag命中则取其中历史长度最长的组件,若无,即基本预测器。
  • altpred组件: provider组件发生miss时所采用的替代结果的组件,次一级tag命中的组件,若无,即基本预测器。
    例如,如果在 T 2 T_{2} T2 T 4 T_{4} T4上tag匹配,而 T 1 T_{1} T1 T 4 T_{4} T4上tag不匹配,则 T 4 T_{4} T4是provider组件 T 2 T_{2} T2是altpred组件。如果没有tagged组件tag 匹配,则altpred就是基本预测器。

4. TAGE更新算法

  1. 更新的基本原理
       首先,更新策略的设计目的是最大限度地减少一次分支出现所引起的扰动。为了最小化单个(分支,历史信息)对的占用空间,在错误预测的情况下,最多分配一个tagged entry。要分配的entry的选择是通过useful计数器来管理的,管理useful计数器有两个目标:
       1> 只有当自上次分配entry以来有正收益时,u的值才能为正:保证最近有用的entry不会被重新分配。
       2> 通过在所有 T j T_{j} Tj组件(j大于i小于M)都不能进行entry分配时减小useful计数器,以及交替性地周期重置useful计数器,来模拟一个伪最近最少有用策略(Pseudo Least Recently Useful policy)。当useful计数器被设置为strong not useful(0)时,在该entry有效地提供一个正确的预测之前,它将是下一个被替换的目标。
       从上来看,useful计数器是用来辅助entry分配的。
  2. 更新useful计数器
       当altpred与最终的预测结果pred不同时,provider组件的useful计数器会被更新。更新规则为,当实际的预测结果pred正确时,useful计数器+1,错误时-1(useful计数器是什么stage后更新——推测commit时更新,实际应该是在执行后更新)。
       因为当altpred 和 provider 预测相同时,说明没有必要用历史更长的provider,用前者预测就足够,因此不增加其有用计数器;当二者不同且后者正确时,说明provider是有用且必要的,因此增加其计数器,否则说明后者无用,减小其计数器 。
       此外,useful计数器也被当做年龄计数器(age counter),并且按照下述规则来reset:
       useful计数器是一个2bit计数器,并且其最高位会被周期性地整列复位(重置为0),然后,最低有效位也会被整列重置。在文中,这种交替重置的周期为256K个分支(也就是说最高位和最低位是按照这个周期来交替进行重置的)。而文献[20]中则没有对useful计数器的重置,从而导致一些条目几乎无限期地被标记为useful。
  3. 预测正确时的更新
       预测正确时,provider组件的预测计数器ctr会被更新。
       (ctr更新方式:若分支指令的实际方向为跳转,则 ctr 自加 1,反之,ctr 自减 1,就是饱和计数器的更新方式)
  4. 错误预测时的更新
       首先,更新provider组件的预测计数器ctr;其次,如果provider组件 T i T_{i} Ti不是最长历史项,即i<M,就尝试在比提供预测组件历史更长的组件 T k T_{k} Tk中分配entry,即(i < k < M)。这样,最多只会给一个组件分配entry。首先需要读取 T i + 1 T_{i+1} Ti+1 T M − 1 T_{M-1} TM1的对应项(M-i-1个)的 u值,具体分配规则如下:
    1. 优先分配
      • 如果存在 T k T_{k} Tk,其u = 0,则给 T k T_{k} Tk分配entry;
      • 否则,不分配新的entry,所有这些组件对应的u值都-1。
    2. 避免ping-phenomenon
         如果有两个组件 T j T_{j} Tj T k T_{k} Tk(j < k)都可被分配,即 u j = u k = 0 u_j = u_k = 0 uj=uk=0,则选择 T j T_{j} Tj的概率高于选择 T k T_{k} Tk的概率,文献仿真中选择 T j T_{j} Tj的概率是选择 T k T_{k} Tk的概率的两倍。这可以通过使用一个简单的线性反馈寄存器在硬件上实现。
    3. 初始化已经分配的entry
         将被选中的要分配的entry初始化,将预测计数器ctr设置为weak correct。useful计数器初始化为0,即strong not useful。
  5. 对新分配条目的简单优化
       在组件Ci( T i T_{i} Ti)中第一次分配一个新entry后,这个新entry自动就提供对相同(分支历史和PC相同)的后续预测结果。然而,在一些程序上,这些新分配的entry上的错误预测率是非常高的。当最长历史索引命中的是一个新分配的entry时,altpred的结果可能比最长历史索引命中的entry提供的预测信息更有效。
       实验表明,这个特征对应用程序来说是全局的,并且可以通过一个4bit的计数器来动态监控。这里不需要特殊的存储结构去记录新分配的entry,可以简单近似认为:如果entry的useful计数器为0/null并且其预测计数器的值为weak(weak not taken或者weak taken)时,那它就是新分配的entry。
  6. 其他更新信息
    • 历史寄存器h:需要根据分支指令的实际方向和 PC 地址进行更新,对于不同类型的分支指令,更新的宽度是不同的,对于条件分支指令,更新 h 的低 2 位,而对于间接分支指令,更新 h 的低 3 位。
    • u 的周期性复位计数器 TICK:在 TAGE 需要为分支指令分配新的表项时,若 T 1 T_{1} T1 ~ T M T_{M} TM
      对应项的 u 均为 0 时,则 TICK 自减 1,反之,TICK 自加 1。
  • 饱和计数器 ctr:若 tagged 部件未命中,则仅需更新基础部件 T 0 的 ctr;反之,需要更新 Provider 的 ctr,在 Alternator 预测错误时,还需要更新 Alternator 的 ctr(原文中未提及)。以上 ctr的更新方式为:若分支指令的实际方向为跳转,则 ctr 自加 1,反之,ctr 自减 1。

5. TAGE预测器的优势

  1. TAGE 采用了部分标签匹配的方法,能够很好地定位分支指令的对应表项,且其分支预测表的索引 index 和匹配标签 tag 均采用了指令 PC 与分支历史的散列运算,很好地改善了分支别名问题。
  2. 对于那些比较难预测的分支指令,TAGE 采用多个不同历史长度的部件进行记录,并根据不同的历史状态对其进行预测,从而能够适应更加复杂的分支环境。
  3. TAGE 不仅考虑了最长历史匹配的预测,而且还对新分配条目优化(根据元预测器的情况考虑?),使用第二历史长度匹配的预测,从而能够根据不同应用程序的预测情况进行自适应调整。
  4. TAGE 预测器为每个表项配置了一个useful计数器 u,很好地缓冲了长历史分支预测表的有效表项的填充时间,大大降低了不必要的预测预热时间。(如何理解?)

参考资料:
1.《A case for (partially) TAgged GEometric history length branch prediction—2006
2.《A PPM-like, tag-based predictor—2005》(文献[20])
3.《基于 RISC-V 处理器的分支预测研究与设计—2022

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值