结构特点
- 使用几何级数的历史长度和部分标记。
- T0是基础预测器,2-bit 计数器表,Ti由3-bit计数器(pred)、2-bit u、tag-bit组成。
- USE_ALT_ON_NA:在部分程序中,对新分配的项使用altpred预测更有效,使用该4-bit计数器在全局上动态监测这一特性。
- 若一项的预测计数器是弱的则认为它是新分配的。
预测
- 如果预测计数器不是弱的或者USE_ALT_ON_NA是无效的,则采用正常最长匹配的组件进行预测,否则使用altpred。
预测器更新
- Provider component:历史最长的匹配组件;
- Alternate predictor(altpred):例如如果T2和T4的tag都匹配,则T2为altpred。
- 更新u-bit:当altpred不同于最终预测时,更新provider component的u-bit,实际预测正确时递增否则递减(即最终预测采用的是provider的预测,因此要更新provider的u-bit )。此外,需周期性重置u-bit(作为age counter),以避免一些项被一直标记为有效,最高位列全部置为0,一段时间后,最低位列全部置为0(文中周期是每256K个分支)。
- USE_ALT_ON_NA:部分程序中使用altpred预测更为有效。
- 周期性重置u-bit:先重置整列最高位,经过一段时间再重置最低位,以防止使用率不高的项一直保存再预测器中。
- 更新预测计数器:提供预测的组件的预测计数器被更新。
- 分配新项:预测错误时需分配新项;如果provider component Ti不是使用最长历史长度的,则选择在一个Tk(k>M)上分配新项。读取所有Tj(i<j<M)的u-bit,如果存在某个Tk的u-bit=0,则分配新项给组件Tk,否则将Tj的u-bit全部递减,不分配新项。新项初始化为预测计数器为弱相关,u-bit 初始化为0。
分支历史管理:TAGE依赖于使用非常长的全局分支历史(几百位),全局分支历史和路径历史是推测性更新的,因此在错误预测时需要恢复。通过循环缓冲区(circular buffer)存储分支历史来实现。恢复分支历史和路径历史包括恢复头指针。
具体实现中的问题
A. 预测响应时间:正常需要3个周期
预测响应时间 = 索引计算时间 + 查表时间 + 预测计算逻辑时间
- 索引计算:使用单级 3 项异或门的非常简单的索引函数可用于索引预测器组件,而不会显着影响预测精度。(VS 全散列函数)
- 读预测表:延迟取决于表的大小,tag 计算可以在索引计算和读表取期间执行而不影响整体预测计算时间。
- 预测计算逻辑:标签匹配,预测选择,标签匹配计算是对从标签组件流出的标签并行执行的。
B. 解决预测响应时间大于一个周期的问题:提前流水线
在周期 T0-X 处,使用 X 块提前程序计数器和 X 块提前全局历史读取预测表。同时计算得到个预测结果,最后X块用于选择最后的预测。
预测计算:假设预测计算过程需要 X-1 个周期,预测计算需如下两步。
- T0-X 周期:预测计算用 T0-X 周期时可用的信息初始化,即 此时的地址和历史h。除此之外还需要从 T0-X 到 T0 的路径上的信息。 X 位的向量 V 包含路径上的信息,在T0-X时向量V的值还不知道,因此有
种可能,同时计算
个预测。
- T0 周期:在T0-1周期结束的时候,
个预测都已经得到,且在T0时,向量V的实际值已经知道,用实际的V去选择对应的预测结果。
性能评估
8-组件的预测器,一个64 Kbits的O-GEHL预测器是2.83MPKI,TAGE是2.61;1Mbit 8-组件的O-GEHL是2.27,1 Mbit 8-组件的TAGE是2.05。
一个128 Kbits 8-组件的TAGE(2.36)和一个512 Kbits 8-组件的O-GEHL(2.34)的准组起来差不多。
历史长度和TAG宽度的影响: