cpu: remove local/globalHistoryBits params from branch pred
authorAnthony Gutierrez <atgutier@umich.edu>
Tue, 14 May 2013 22:39:47 +0000 (18:39 -0400)
committerAnthony Gutierrez <atgutier@umich.edu>
Tue, 14 May 2013 22:39:47 +0000 (18:39 -0400)
having separate params for the local/globalHistoryBits and the
local/globalPredictorSize can lead to inconsistencies if they
are not carefully set. this patch dervies the number of bits
necessary to index into the local/global predictors based on
their size.

the value of the localHistoryTableSize for the ARM O3 CPU has been
increased to 1024 from 64, which is more accurate for an A15 based
on some correlation against A15 hardware.

configs/common/O3_ARM_v7a.py
src/cpu/pred/BranchPredictor.py
src/cpu/pred/tournament.cc

index c85ba2c6cfdee30eb5d5695ca36349d35c43c6e8..f5cd3bbc8371de90c7a00918adac04ea73d60134 100644 (file)
@@ -90,12 +90,11 @@ class O3_ARM_v7a_FUP(FUPool):
 # Tournament Branch Predictor
 class O3_ARM_v7a_BP(BranchPredictor):
     predType = "tournament"
+    localPredictorSize = 2048
     localCtrBits = 2
-    localHistoryTableSize = 64
-    localHistoryBits = 6
+    localHistoryTableSize = 1024
     globalPredictorSize = 8192
     globalCtrBits = 2
-    globalHistoryBits = 13
     choicePredictorSize = 8192
     choiceCtrBits = 2
     BTBEntries = 2048
index 21001b360d290ce3b0e1d750459a00f8c5a014fa..07fc840b887e57408244edd6800878c3253b5276 100644 (file)
@@ -40,10 +40,8 @@ class BranchPredictor(SimObject):
     localPredictorSize = Param.Unsigned(2048, "Size of local predictor")
     localCtrBits = Param.Unsigned(2, "Bits per counter")
     localHistoryTableSize = Param.Unsigned(2048, "Size of local history table")
-    localHistoryBits = Param.Unsigned(11, "Bits for the local history")
     globalPredictorSize = Param.Unsigned(8192, "Size of global predictor")
     globalCtrBits = Param.Unsigned(2, "Bits per counter")
-    globalHistoryBits = Param.Unsigned(13, "Bits of history")
     choicePredictorSize = Param.Unsigned(8192, "Size of choice predictor")
     choiceCtrBits = Param.Unsigned(2, "Bits of choice counters")
 
index 52a05960fa373cb0c94931718a71aeb0e2e7d904..e471d08f58b73f3abcdf0ca6426f780259edba29 100644 (file)
 
 TournamentBP::TournamentBP(const Params *params)
     : BPredUnit(params),
+      localPredictorSize(params->localPredictorSize),
       localCtrBits(params->localCtrBits),
       localHistoryTableSize(params->localHistoryTableSize),
-      localHistoryBits(params->localHistoryBits),
+      localHistoryBits(ceilLog2(params->localPredictorSize)),
       globalPredictorSize(params->globalPredictorSize),
       globalCtrBits(params->globalCtrBits),
-      globalHistoryBits(params->globalHistoryBits),
+      globalHistoryBits(
+          ceilLog2(params->globalPredictorSize) >
+          ceilLog2(params->choicePredictorSize) ?
+          ceilLog2(params->globalPredictorSize) :
+          ceilLog2(params->choicePredictorSize)),
       choicePredictorSize(params->choicePredictorSize),
       choiceCtrBits(params->choiceCtrBits),
       instShiftAmt(params->instShiftAmt)
 {
-    localPredictorSize = ULL(1) << localHistoryBits;
+    if (!isPowerOf2(localPredictorSize)) {
+        fatal("Invalid local predictor size!\n");
+    }
+
+    if (!isPowerOf2(globalPredictorSize)) {
+        fatal("Invalid global predictor size!\n");
+    }
 
     //Set up the array of counters for the local predictor
     localCtrs.resize(localPredictorSize);
@@ -76,10 +87,6 @@ TournamentBP::TournamentBP(const Params *params)
     for (int i = 0; i < localHistoryTableSize; ++i)
         localHistoryTable[i] = 0;
 
-    if (!isPowerOf2(globalPredictorSize)) {
-        fatal("Invalid global predictor size!\n");
-    }
-
     //Setup the array of counters for the global predictor
     globalCtrs.resize(globalPredictorSize);