TAGE predictor

参考文档:

分支预测算法(一):TAGE|SunnyChen的小窝

Tage预测器 - 知乎 (zhihu.com)

TAGE的基础概念

        TAGE是现今最经典的分支预测算法,TAGE及其后续的变体都是当今高性能微处理器的分支预测算法基础。因此,要聊分支预测算法的话题必定绕不开TAGE。

        TAGE的全称是 TAgged GEometric history length (predictor),也就是基于带标签的几何级数递增历史长度的分支预测算法,其核心主要是两个部份:

 TAGE的组成:

  • 一个直接索引预测表,T0, 双峰预测方式,用于在Tn表都miss的时候,提供基本的预测;
  • 若干个基于几何级数递增的分支历史长度进行匹配的索引表项Tn;
    • 索引方式:PC值和GHR的值,继续hash操作;
    • 标签的意义:索引到具体的entry后,需要再次进行pc和GHR的值的hash操作,与这个entry中的tag进行比较,才能决定是否hit;
    • 这就意味着,索引的计算方式,以及tag的计算方式,是不一样的,可以有多种方式;
    • 每个表使用分支指令的地址与不同长度的全局分支历史的哈希值进行索引,每个表Ti匹配的全局分支历史长度服从几何级数递增:L(i) = (int)(ai-1 * L(1))

TAGE预测器的特点:

  • 使用基于几何级数递增的分支历史长度允许预测器在允许捕捉超长全局分支历史模式的同时,将大部份的存储资源分配给使用较短的分支历史长度进行匹配的表项。
  • 因为能够匹配到很长的GHR的场景是非常少的,大部分都是集中在比较短的范围内,这样,既可以保证很长的规律能捕捉到,也能保证存储资源不会因为很少的场景而过度的浪费;

TAGE架构

一些基本的术语:

       

从上图中可以看出TAGE的特点:

  • T0表是使用PC直接索引的2位饱和计数器组成的bimodal表项;
  • TN表是使用PC与对应全局分支历史长度进行哈希索引的带标签表,其每个表项中:
    • pred:3位的有符号饱和计数器,符号位表示预测跳转与否,1表示预测跳转(taken),0表示预测不跳转(not-taken)
    • tag:PC与分支历史哈希得到的标签信息,不同TN表的tag长度可以相同,也可以不同。
    • u:2位useful计数器,表示当前表项“有用”的程度。

预测方式

根据pc值和GHR值,并行索引T0~Tn;

预测结果由 tag hit的最长的Tn表的pred计数器的符号位给出;如果都没有命中,则由T0表的2位饱和计数器给出;

信息更新

  • 对useful的更新
    • fpred的结果,与最终分支指令的结果相同,则pcpn.u + 1;
    • 不同,则pcpn.u - 1;
    • u满足饱和计数的规则;
    • 同时,useful计数器u还起到年龄计数器的作用,其MSB(bit-1)以及LSB(bit-0)会周期性的交替重置为0。原文中的周期设置为每256K个分支指令进行一次重置操作。
  • 对pred的更新
    • fpred与最终的分支指令跳转结果相同:
      • 最终结果为taken, 则pcpn.pred+1;
      • 最终结果为not-taken, 则pcpn.pred-1;
    • fpred与最终的分支指令跳转结果不同,更新方式与上面是一致的;
  • 错误预测的更新
  1. 更新pcpn.pred, 根据最终结果进行更新;
  2. 如果pcpn不是最长的全局分支历史信息表,也就是Ti(0<i<max), 则需要往使用更长的全局分支历史信息的表上分配一个新的entry;
    1. 根据PC值和GHR,计算出idex, 然后基于该index, 读取比i更大的所有的表中,对应idex位置的entry中的u位;
    2. 读出来的多个entry中的u位,如果都不是0,则所有比i更长的全局分支历史信息表项的u值都-1;
    3. 如果存在一个表k,索引到的u==0,则将该预测信息,分配到该entry中;
    4. 如果存在多个这样的表(0<i<j<k<max),优先分配第一个(j);
  3. 新分配的表项,需要进行如下的初始化步骤,此时需要根据该分支指令的指令结果进行处理:
    1. pred的初始化;
      1. 该分支指令的结果为taken, 则pred==3'b100,弱跳转;
      2. 该分支指令的结果为not-taken, 则pred==3'b011,弱不跳转;
    2. tag的初始化:pc值与GHR的哈希值;
    3. u初始化为0,strong not useful;

其他说明

  • 之所以每次错误预测,都只会分配一个且仅此一个表项,是为了最小化一些偶发性或者与分支历史不甚相关的分支指令占据过多的表项的现象。
  • useful计数器的作用机理:
    • 保证最近“有用”的表项不会被替换掉
    • 维护一种近似于伪LRU的替换策略
    • 初始化为0,是为了保证该表项在有效的提供准确的预测结果时才可以获得长时间逗留的资格;而为了防止发生乒乓替换的现象,分配的优先级仲裁可以防止该现象的发生。

改进方向

        某些时候,当最长命中表项的pred计数器表明,该预测结果信心不足时,altpred会拥有更准确的预测结果。

        当然,如何定义强信心以及弱信心也可以有多种不同的定义方式,比如可以定义仅3'b100以及3'b011为弱信心,其他都为强信心。当然,你也可以定义仅3'b111以及3'b000为强信心,其他都为弱信心。

静态策略

        如果最长命中表项pcpn的预测信心为强,则选择最长命中表项的预测结果;否则,选择altpred为最终预测结果。

动态策略

        使用一个有符号的USE_ALT_ON_NA计数器来作为一个动态的阈值,来决定当最长命中表项信心不足时,最终预测结果的选择方式。USE_ALT_ON_NA可以是单个计数器,也可以是一个计数器寄存器组,其使用分支指令的PC直接索引。当最长命中表项的预测信息不为弱且USE_ALT_ON_NA为负时,选择最长命中预测的结果,否则选择altpred。 当altpred与最终的分支结果相同时,USE_ALT_ON_NA递增,反之则递减。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值