源碼鏈接: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/