summaryrefslogtreecommitdiff
path: root/src/cpu/pred/BranchPredictor.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/pred/BranchPredictor.py')
-rw-r--r--src/cpu/pred/BranchPredictor.py265
1 files changed, 264 insertions, 1 deletions
diff --git a/src/cpu/pred/BranchPredictor.py b/src/cpu/pred/BranchPredictor.py
index 1d5fd5eec..85b225c3b 100644
--- a/src/cpu/pred/BranchPredictor.py
+++ b/src/cpu/pred/BranchPredictor.py
@@ -118,7 +118,7 @@ class TAGEBase(SimObject):
logUResetPeriod = Param.Unsigned(18,
"Log period in number of branches to reset TAGE useful counters")
numUseAltOnNa = Param.Unsigned(1, "Number of USE_ALT_ON_NA counters")
- useAltOnNaBits = Param.Unsigned(4, "Size of the USE_ALT_ON_NA counter")
+ useAltOnNaBits = Param.Unsigned(4, "Size of the USE_ALT_ON_NA counter(s)")
maxNumAlloc = Param.Unsigned(1,
"Max number of TAGE entries allocted on mispredict")
@@ -185,6 +185,96 @@ class LoopPredictor(SimObject):
optionalAgeReset = Param.Bool(True,
"Reset age bits optionally in some cases")
+class TAGE_SC_L_TAGE(TAGEBase):
+ type = 'TAGE_SC_L_TAGE'
+ cxx_class = 'TAGE_SC_L_TAGE'
+ cxx_header = "cpu/pred/tage_sc_l.hh"
+ abstract = True
+ tagTableTagWidths = [0]
+ numUseAltOnNa = 16
+ pathHistBits = 27
+ maxNumAlloc = 2
+ logUResetPeriod = 10
+ useAltOnNaBits = 5
+ # TODO No speculation implemented as of now
+ speculativeHistUpdate = False
+
+ # This size does not set the final sizes of the tables (it is just used
+ # for some calculations)
+ # Instead, the number of TAGE entries comes from shortTagsTageEntries and
+ # longTagsTageEntries
+ logTagTableSize = Param.Unsigned("Log size of each tag table")
+
+ shortTagsTageFactor = Param.Unsigned(
+ "Factor for calculating the total number of short tags TAGE entries")
+
+ longTagsTageFactor = Param.Unsigned(
+ "Factor for calculating the total number of long tags TAGE entries")
+
+ shortTagsSize = Param.Unsigned(8, "Size of the short tags")
+
+ longTagsSize = Param.Unsigned("Size of the long tags")
+
+ firstLongTagTable = Param.Unsigned("First table with long tags")
+
+ truncatePathHist = Param.Bool(True,
+ "Truncate the path history to its configured size")
+
+
+class TAGE_SC_L_TAGE_64KB(TAGE_SC_L_TAGE):
+ type = 'TAGE_SC_L_TAGE_64KB'
+ cxx_class = 'TAGE_SC_L_TAGE_64KB'
+ cxx_header = "cpu/pred/tage_sc_l_64KB.hh"
+ nHistoryTables = 36
+
+ minHist = 6
+ maxHist = 3000
+
+ tagTableUBits = 1
+
+ logTagTableSizes = [13]
+
+ # This is used to handle the 2-way associativity
+ # (all odd entries are set to one, and if the corresponding even entry
+ # is set to one, then there is a 2-way associativity for this pair)
+ # Entry 0 is for the bimodal and it is ignored
+ # Note: For this implementation, some odd entries are also set to 0 to save
+ # some bits
+ noSkip = [0,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,0,1,0,1,0,1,0,0,0,1,0,0,0,1]
+
+ logTagTableSize = 10
+ shortTagsTageFactor = 10
+ longTagsTageFactor = 20
+
+ longTagsSize = 12
+
+ firstLongTagTable = 13
+
+class TAGE_SC_L_TAGE_8KB(TAGE_SC_L_TAGE):
+ type = 'TAGE_SC_L_TAGE_8KB'
+ cxx_class = 'TAGE_SC_L_TAGE_8KB'
+ cxx_header = "cpu/pred/tage_sc_l_8KB.hh"
+
+ nHistoryTables = 30
+
+ minHist = 4
+ maxHist = 1000
+
+ logTagTableSize = 7
+ shortTagsTageFactor = 9
+ longTagsTageFactor = 17
+ longTagsSize = 12
+
+ logTagTableSizes = [12]
+
+ firstLongTagTable = 11
+
+ truncatePathHist = False
+
+ noSkip = [0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1]
+
+ tagTableUBits = 2
# LTAGE branch predictor as described in
# https://www.irisa.fr/caps/people/seznec/L-TAGE.pdf
@@ -196,4 +286,177 @@ class LTAGE(TAGE):
cxx_header = "cpu/pred/ltage.hh"
tage = LTAGE_TAGE()
+
loop_predictor = Param.LoopPredictor(LoopPredictor(), "Loop predictor")
+
+class TAGE_SC_L_LoopPredictor(LoopPredictor):
+ type = 'TAGE_SC_L_LoopPredictor'
+ cxx_class = 'TAGE_SC_L_LoopPredictor'
+ cxx_header = "cpu/pred/tage_sc_l.hh"
+ loopTableAgeBits = 4
+ loopTableConfidenceBits = 4
+ loopTableTagBits = 10
+ loopTableIterBits = 10
+ useSpeculation = False
+ useHashing = True
+ useDirectionBit = True
+ restrictAllocation = True
+ initialLoopIter = 0
+ initialLoopAge = 7
+ optionalAgeReset = False
+
+class StatisticalCorrector(SimObject):
+ type = 'StatisticalCorrector'
+ cxx_class = 'StatisticalCorrector'
+ cxx_header = "cpu/pred/statistical_corrector.hh"
+ abstract = True
+
+ # Statistical corrector parameters
+
+ numEntriesFirstLocalHistories = Param.Unsigned(
+ "Number of entries for first local histories")
+
+ bwnb = Param.Unsigned("Num global backward branch GEHL lengths")
+ bwm = VectorParam.Int("Global backward branch GEHL lengths")
+ logBwnb = Param.Unsigned("Log num of global backward branch GEHL entries")
+
+ lnb = Param.Unsigned("Num first local history GEHL lenghts")
+ lm = VectorParam.Int("First local history GEHL lengths")
+ logLnb = Param.Unsigned("Log number of first local history GEHL entries")
+
+ inb = Param.Unsigned(1, "Num IMLI GEHL lenghts")
+ im = VectorParam.Int([8], "IMLI history GEHL lengths")
+ logInb = Param.Unsigned("Log number of IMLI GEHL entries")
+
+ logBias = Param.Unsigned("Log size of Bias tables")
+
+ logSizeUp = Param.Unsigned(6,
+ "Log size of update threshold counters tables")
+
+ chooserConfWidth = Param.Unsigned(7,
+ "Number of bits for the chooser counters")
+
+ updateThresholdWidth = Param.Unsigned(12,
+ "Number of bits for the update threshold counter")
+
+ pUpdateThresholdWidth = Param.Unsigned(8,
+ "Number of bits for the pUpdate threshold counters")
+
+ extraWeightsWidth = Param.Unsigned(6,
+ "Number of bits for the extra weights")
+
+ scCountersWidth = Param.Unsigned(6, "Statistical corrector counters width")
+
+# TAGE-SC-L branch predictor as desribed in
+# https://www.jilp.org/cbp2016/paper/AndreSeznecLimited.pdf
+# It is a modified LTAGE predictor plus a statistical corrector predictor
+# The TAGE modifications include bank interleaving and partial associativity
+# Two different sizes are proposed in the paper:
+# 8KB => See TAGE_SC_L_8KB below
+# 64KB => See TAGE_SC_L_64KB below
+# The TAGE_SC_L_8KB and TAGE_SC_L_64KB classes differ not only on the values
+# of some parameters, but also in some implementation details
+# Given this, the TAGE_SC_L class is left abstract
+# Note that as it is now, this branch predictor does not handle any type
+# of speculation: All the structures/histories are updated at commit time
+class TAGE_SC_L(LTAGE):
+ type = 'TAGE_SC_L'
+ cxx_class = 'TAGE_SC_L'
+ cxx_header = "cpu/pred/tage_sc_l.hh"
+ abstract = True
+
+ statistical_corrector = Param.StatisticalCorrector(
+ "Statistical Corrector")
+
+class TAGE_SC_L_64KB_LoopPredictor(TAGE_SC_L_LoopPredictor):
+ logSizeLoopPred = 5
+
+class TAGE_SC_L_8KB_LoopPredictor(TAGE_SC_L_LoopPredictor):
+ logSizeLoopPred = 3
+
+class TAGE_SC_L_64KB_StatisticalCorrector(StatisticalCorrector):
+ type = 'TAGE_SC_L_64KB_StatisticalCorrector'
+ cxx_class = 'TAGE_SC_L_64KB_StatisticalCorrector'
+ cxx_header = "cpu/pred/tage_sc_l_64KB.hh"
+
+ pnb = Param.Unsigned(3, "Num variation global branch GEHL lengths")
+ pm = VectorParam.Int([25, 16, 9], "Variation global branch GEHL lengths")
+ logPnb = Param.Unsigned(9,
+ "Log number of variation global branch GEHL entries")
+
+ snb = Param.Unsigned(3, "Num second local history GEHL lenghts")
+ sm = VectorParam.Int([16, 11, 6], "Second local history GEHL lengths")
+ logSnb = Param.Unsigned(9,
+ "Log number of second local history GEHL entries")
+
+ tnb = Param.Unsigned(2, "Num third local history GEHL lenghts")
+ tm = VectorParam.Int([9, 4], "Third local history GEHL lengths")
+ logTnb = Param.Unsigned(10,
+ "Log number of third local history GEHL entries")
+
+ imnb = Param.Unsigned(2, "Num second IMLI GEHL lenghts")
+ imm = VectorParam.Int([10, 4], "Second IMLI history GEHL lengths")
+ logImnb = Param.Unsigned(9, "Log number of second IMLI GEHL entries")
+
+ numEntriesSecondLocalHistories = Param.Unsigned(16,
+ "Number of entries for second local histories")
+ numEntriesThirdLocalHistories = Param.Unsigned(16,
+ "Number of entries for second local histories")
+
+ numEntriesFirstLocalHistories = 256
+
+ logBias = 8
+
+ bwnb = 3
+ bwm = [40, 24, 10]
+ logBwnb = 10
+
+ lnb = 3
+ lm = [11, 6, 3]
+ logLnb = 10
+
+ logInb = 8
+
+class TAGE_SC_L_8KB_StatisticalCorrector(StatisticalCorrector):
+ type = 'TAGE_SC_L_8KB_StatisticalCorrector'
+ cxx_class = 'TAGE_SC_L_8KB_StatisticalCorrector'
+ cxx_header = "cpu/pred/tage_sc_l_8KB.hh"
+ gnb = Param.Unsigned(2, "Num global branch GEHL lengths")
+ gm = VectorParam.Int([6, 3], "Global branch GEHL lengths")
+ logGnb = Param.Unsigned(7, "Log number of global branch GEHL entries")
+
+ numEntriesFirstLocalHistories = 64
+
+ logBias = 7
+
+ bwnb = 2
+ logBwnb = 7
+ bwm = [16, 8]
+
+ lnb = 2
+ logLnb = 7
+ lm = [6, 3]
+
+ logInb = 7
+
+# 64KB TAGE-SC-L branch predictor as described in
+# http://www.jilp.org/cbp2016/paper/AndreSeznecLimited.pdf
+class TAGE_SC_L_64KB(TAGE_SC_L):
+ type = 'TAGE_SC_L_64KB'
+ cxx_class = 'TAGE_SC_L_64KB'
+ cxx_header = "cpu/pred/tage_sc_l_64KB.hh"
+
+ tage = TAGE_SC_L_TAGE_64KB()
+ loop_predictor = TAGE_SC_L_64KB_LoopPredictor()
+ statistical_corrector = TAGE_SC_L_64KB_StatisticalCorrector()
+
+# 8KB TAGE-SC-L branch predictor as described in
+# http://www.jilp.org/cbp2016/paper/AndreSeznecLimited.pdf
+class TAGE_SC_L_8KB(TAGE_SC_L):
+ type = 'TAGE_SC_L_8KB'
+ cxx_class = 'TAGE_SC_L_8KB'
+ cxx_header = "cpu/pred/tage_sc_l_8KB.hh"
+
+ tage = TAGE_SC_L_TAGE_8KB()
+ loop_predictor = TAGE_SC_L_8KB_LoopPredictor()
+ statistical_corrector = TAGE_SC_L_8KB_StatisticalCorrector()