源码链接:https://github.com/sjdesai16/tage
【摘要】:CBP2004上实现的简单TAGE分支预测器。TAGE集成了PPM和OGHEL两类分支预测的优势。使用PPM中的partial tage,OGHEL中的几何级数增长的全局历史长度。
- OGEHL
利用了跨度在100-200bits的全局历史信息,GEHL的预测表由独立的输入为global history和branch address的函数来索引,即index=func(global history,branch address)。最后的预测值基于各个表的预测位的和。索引各个预测表的历史长度成几何级数序列。
- PPM like Tag based Predictor
非常接近TAGE预测器,两者区别在于update policy(更新预测表的策略)、TAGE周期性的重置useful bit,以及新entry的分配策略。
- TAGE
【缩略词】
Bank:独立的预测表,一个历史长度索引一个预测表,就是索引一个Bank。
‘Right’ direction:”右边“的预测跳转方向,越右边,历史长度越长。
Prime Bank:tag命中,并提供最终预测的bank。
AltBank:替补Bank,也是tag命中,但是不提供最终预测值的Bank。
PrimePred:Prime Bank提供的预测值。
AltPred:AltBank提供的预测值。
NumTagTables:Bank数量,源码中式4个。
GHR:全局历史信息寄存器。
PHR:路径历史信息寄存器。
【Geometric History Length】
TAGE预测器有5个预测表,一个base(bimodal table),4个taged table。历史长度满足公式L(i)=pow(alpha,NumTagTables-1-i)L(NumTagtable-1).源码中,alpha为2,索引各tage表的历史长度分别L(0)~L(3)为:131,44,15,5.此处的设计是为找prime和alt方便,从table 0开始,找到第一个tage hit为prime,然后再在后面的table中找alt。
【GHR&PHR】
GHR长度=L(0)=131 bits,PHR长度16 bits
压缩历史信息和历史信息折叠(Compressed History and history folding)
当历史信息的位数超过了索引项的位数就需要对历史信息进行折叠操作。40位的历史信息,而索引只需要10位,折叠操作:h[0 : 9] ^ h[10 : 19] ^ h[20 : 29] ^h[30 : 39]
【表信息】
--Bimodal Table
在tage表中没命中的情况下,提供基本的预测保障。如果tage表中有hit,这个表的预测值被忽略。
--Tagged Predictor Banks
和cache结构很接近。每一个entry有三个数据段:tag(索引,9bits)、ctr(pred,计数器,3bits,提供预测值,1XX表示taken)、u(useful,2 bits,该entry是否有用,0表示将要被换出)
【给pc,做预测】
用pc%numBimodalEntries 找出Bimodal表中预测值basepred=bimodalCounter>1.5?1:0;bimodalCounter是1X就taken;
用hash(pc,h(L(i)))来索引第i个tage表。第一个hit的bank为primeBank,往后找,再有hit的为altBank
if primeBank<NUMTAGTABLES//tage 有hit,primeBank初始值为NUMTAGTABLES
if altBank=base//只有一个tage hit,alt为基础表
altpred=basePrediction;
else//tage表中有多个hit,alt取最短历史长度的hit
altPred=.ctr>3.5?1:0//ctr的值为1XX为taken
if prime.ctr!=3 ||prime.ctr!=4||prime.usefulbits,!=0|| altbetterCount<8//prime的预测值不是100,011, usefulbit不为0,alt更好标志位小于8。按prime,返回预测值。
else//否则,按alt,返回预测值。
else //tage 表中没hit
返回baseprediction;
【update policy(更新策略)】影响miss prediction per kinstruction性能指标的关键因素。
--更新useful counter:
prime和alt预测值不一致才更新useful bit,prime和实际结果resolve 一致,则增加,不一致就自减。每隔256k个branch 需要重置usefulbit。
先MSB,后LSB,即u=u&1,然后u=u&2
--更新counter value(ctr|pred)
if resolve//结果taken
prime的ctr自增,否则,自减。
if 由base提供的预测值,同样,taken,base对应的ctr自增,否则自减。
--检测当前给出预测值得entry是否非新分配。
if prime.u==0&&(prime.ctr==3||prime.ctr==4)//ctr==100||011 并且u=0,则为新分配的entry
new_entry=true
if primepred!=altpred
if altpred==resolve//备选预测正确
altbetterCount++
else //备选预测失败
alterbetterCount--
--处理新分配的entry
if !new_entry||(new_entry&&(primepred!=resolve))//非新entry或者预测失败的新entry
if predDir!=resolve & 不是base提供的预测
如果primebank 的useful bit为0,strong_old_present=true.
if strong_old_present==false
prime bank 以前的usefulbit 自减。
else
生成随机数randNo=rand()%100;
统计primebank以前usefulbit为0的bank数;
bank_store数组{-1,-1,-1}存储第i个bank是否usefulbit为0;
matchbank,匹配bank,将要分配新entry的bank;
if count==1 matchbank=0;
else if count>1
if randNo在(33,99]之间,matchbank=bank_store[count-1];
else matchbank=bank_store[count-2];
对matchbank之前的bank
if bank[i]对应的usefulbit==0
if taken .ctr置为4;else .ctr置为3;
置tag和usefull bit
【why-tage-is-the-best】
http://comparch.net/2013/06/30/why-tage-is-the-best/