FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

分岐予測の評価キット Branch Prediction Championship Kit を試す (5. GShareの動きを読んでみる)

Branch Prediction Championship Simulatorの続きを試す。

Gshareの動きを読む

これはpredictor_gshare.hにのみ実装されていて、かなり短いため読みやすい。

  • 構成

PHTが必要数分だけ確保されている。HIST_LENがGShareの記録する分岐命令の数のため、それを確保できるだけの容量を搭載している。

PREDICTOR::PREDICTOR(void){

   historyLength    = HIST_LEN;
   ghr              = 0;
   numPhtEntries    = (1<< HIST_LEN);

   pht = new UINT32[numPhtEntries];

   for(UINT32 ii=0; ii< numPhtEntries; ii++){
     pht[ii]=PHT_CTR_INIT;
   }

 }
  • 予測

現在のPCとGHRのXORを取り、インデックスを作成する。これに基づいてPHTを読み出す。

bool   PREDICTOR::GetPrediction(UINT64 PC){

   UINT32 phtIndex   = (PC^ghr) % (numPhtEntries);
   UINT32 phtCounter = pht[phtIndex];

   if(phtCounter > (PHT_CTR_MAX/2)){
     return TAKEN;
   }
   else{
     return NOT_TAKEN;
   }
 }
  • 予測の更新

予測の結果に従って、PHTを更新する。インデックスの作成も全く同じ。

void  PREDICTOR::UpdatePredictor(UINT64 PC, OpType opType, bool resolveDir, bool predDir, UINT64 branchTarget){

   UINT32 phtIndex   = (PC^ghr) % (numPhtEntries);
   UINT32 phtCounter = pht[phtIndex];

   if(resolveDir == TAKEN){
     pht[phtIndex] = SatIncrement(phtCounter, PHT_CTR_MAX);
   }else{
     pht[phtIndex] = SatDecrement(phtCounter);
   }

   // update the GHR
   ghr = (ghr << 1);

   if(resolveDir == TAKEN){
     ghr++;
   }
 }
  • 実行結果

これまでと同様にテストケースを走らせる。

   MPKBr_1K           :   243.0000
   MPKBr_10K              :    45.1000
   MPKBr_100K             :    18.9500
   MPKBr_1M           :    15.8420
   MPKBr_10M              :    15.6460
   MPKBr_30M              :    15.8233
   TRACE      : ../traces/SHORT_MOBILE-24.bt9.trace.gz
   NUM_INSTRUCTIONS               : 1000000000
   NUM_BR                         :   38684342
   NUM_UNCOND_BR                  :    2221649
   NUM_CONDITIONAL_BR             :   36462693
   NUM_MISPREDICTIONS             :     618781
   MISPRED_PER_1K_INST            :     0.6188

Local Predictionだけよりもかなり良くなったな。

次に、試しにGShareに対してPCアドレスのオフセットを効かせる方法を試してみる。インデックスの計算を以下のように変更する。

UINT32 phtIndex   = ((PC >> pc_offset) ^ ghr) % (1 << HIST_LEN);
  phtIndex = (phtIndex << pc_offset) + (PC & pc_offset_mask);
  UINT32 phtCounter = pht[phtIndex];
   MPKBr_1K           :   244.0000
   MPKBr_10K              :    44.7000
   MPKBr_100K             :    18.9700
   MPKBr_1M           :    15.9100
   MPKBr_10M              :    15.7185
   MPKBr_30M              :    15.8946
   TRACE      : ../traces/SHORT_MOBILE-24.bt9.trace.gz
   NUM_INSTRUCTIONS               : 1000000000
   NUM_BR                         :   38684342
   NUM_UNCOND_BR                  :    2221649
   NUM_CONDITIONAL_BR             :   36462693
   NUM_MISPREDICTIONS             :     621544
   MISPRED_PER_1K_INST            :     0.6215

ちょっとミスの回数が増えてしまった。