A PPM-like, tag-based branch predictor

1. Introduction

  • 预测器主要由两部分预测表组成,分别为双峰值预测表和全局预测表。其中双峰值预测表由PC直接索引,每一项包含一个与branch指令相关的预测方向;全局表由几个bank组成,每一个bank由PC和一个不同长度的历史索引共同索引,全局表中的每一项包括一个用于确认该全局历史下的PC是否命中的tag以及一个该全局历史下的branch指令的跳转方向。
  • 预测器的方向由全局表中匹配成功的最长历史索引的bank提供,若果全局表都发生了miss,则预测方向由使用PC直接索引的双峰值表提供。
  • 下图为TAGE Predictor的结构图。图的最左侧为上面介绍的双峰值预测表记为bank0,它有4K项,使用PC低12位直接索引,每一项包含3bits的饱和计数器和1bit的m位;右边四个bank记为bank1~4,他们为上述介绍的全局预测表,分别使用10、20、40、80bits的全局历史和PC一起索引,当历史长度超出索引所需的位数时,将采用折叠的方法将历史转化为所需长度,再将其与PC进行异或后对相应的bank进行索引。bank1~4均有1K项,每一项包含一个8bits的tag,3bits的饱和计数器以及一个ubit。综上预测器的大小为64Kb。
  • A PPM-like, tag-based branch predictor_第1张图片

2. Obtaining a prediction

  • 使用该预测器进行预测时,同时访问5个bank。对于全局预测表,需要使用相应长度的历史和PC进行8bit的tag计算,计算tag的hash函数不同于计算index的hash函数,但是输入都是相同的历史和PC。当对bank的访问结束后,可以得到bank0~4的5bit预测信息以及bank1~4的4个8bits tag信息。最终的预测信息将从由最长历史计算tag匹配的bank给出。即如果bank4使用的80bits历史索引的项tag匹配成功了,则最后的预测方向由bank4给出,否则将观察bank3是否匹配成功,以此类推。如果bank1~4都没有tag匹配成功,则最终的预测结果将有双峰值预测表即bank0给出。

3. Predictor update

  • 当一条分支跳转指令提交后,需要对分支预测器进行更新。我们已知一条条件分支指令的预测结果来源于哪个bank,也知道预测结果是否正确。
  • 更新3bits饱和计数器:仅对提供预测信息bank中的那一项进行更新,更新方式采用传统的饱和计数器的更新方式,当最终结果为跳转时,使计数器加一;当最终结果为taken跳转时,计数器加一,当最终结果位Not-taken不跳转时,计数器减一。计数器在值为7时不进行加操作,在值为0时不进行减操作。
  • 分配新的一项预测信息:当某一条分支跳转指令由bankX(X<=3)提供预测信息,并且最后发现预测错误。则需要在bankn(n>3)中分配新的一项预测信息。实际分配的规则为:访问bankn(n>X)中的u位,如果这些bank对应项的u位都为1,则随机选择一个bankY,否则选择一个u位为0的bank,对其中的项进行替换。对于上述选择的bank,需要将对应项进行重新初始化操作,初始化tag为当前分支跳转指令与历史计算出的tag。u位初始化为0。3bits的饱和计数器初始化为011(弱不跳转)或者100(强跳转),具体选择哪一个需要根据bank0中的m位来区别,如果m位为1,则重新初始化饱和计数器根据分支指令的结果来决定,如果该分支结果为跳转,则初始化为100;如果该分支结果为不跳转,则初始化为011;如果m位为0,则重新初始化饱和计数器的值由bank0的值提供,如果bank0的方向为跳转,则初始化为100,如果bank0的方向为不跳转,则初始化为011。
  • 更新双峰值预测表的m位和全局历史表的u位:如果最终的预测结果显示双峰值预测方向与全局预测表方向不同则需要对u位和m位进行更新。如果最终的预测结果正确,则将u和m位都设为1,否则都设为0。这样做的原因是:
    • 如果双峰值预测表是错的,则表示全局预测表是正确的,将u位设为1有助于防止该项被预测表的更新替换掉,将m位设为1有助于在更新饱和计数器的时候不用双峰值的结果,而使用分支跳转指令的实际结果来更新;
    • 如果双峰值预测表是对的,则表示全局预测表是错误的,将u位设置为0表示该项可以被预测器的更新替换掉。将m位设置为0表示在更新饱和计数器的时候根据双峰值表的结果来更新即可。

4. Folded global history

  • 通常情况下进行折叠操作可以采用XORS树进行操作,例如对于40bits的历史如果需要折叠成10bits就需要两级XORS树(XORS操作默认为两输入),对于80bits的历史就需要三级的XORS树进行折叠了。但是,考虑到预测器中不是对一个随机数进行折叠,新的历史与旧的历史存在着一定的关系。所以对于全局历史的折叠可以采用循环移位寄存器CSRs根据下图所示的方法实现,在本处理器中对于bank2~4采用了10bits的CSR进行index的计算。折叠的历史将会与PC的低10位以及10-19位进行异或运算,之后将结果作为bank的索引值。对于bank1将直接只用历史的低10bits即可。
  • A PPM-like, tag-based branch predictor_第2张图片
  • 全局历史的折叠还将用于bank1~4中的tag的计算。对于bank1~4中的每一个bank,我们使用两个CSR寄存器CSR1和CSR2分别位8bits和7bits。tag的计算使用公式:PC[7:0] xor CSR1 xor (CSR2 << 1).之所以使用两个CSR寄存器是因为单个循环移位寄存器经常周期性的产生相同的结果

你可能感兴趣的:(计算机体系结构,处理器设计,Tage,Predictor,branch,predicotr)