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
ちょっとミスの回数が増えてしまった。