gem5  v20.1.0.0
tage_sc_l_8KB.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Metempsy Technology Consulting
3  * All rights reserved.
4  *
5  * Copyright (c) 2006 INRIA (Institut National de Recherche en
6  * Informatique et en Automatique / French National Research Institute
7  * for Computer Science and Applied Mathematics)
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions are
13  * met: redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer;
15  * redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution;
18  * neither the name of the copyright holders nor the names of its
19  * contributors may be used to endorse or promote products derived from
20  * this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Author: AndrĂ© Seznec, Pau Cabre, Javier Bueno
35  *
36  */
37 
38 /*
39  * 8KB TAGE-SC-L branch predictor (devised by Andre Seznec)
40  */
41 
43 
44 #include "base/random.hh"
45 #include "debug/TageSCL.hh"
46 
48  TAGE_SC_L_8KB_StatisticalCorrectorParams *p)
50  gnb(p->gnb),
51  logGnb(p->logGnb),
52  gm(p->gm)
53 {
55 }
56 
59 {
61  sh->setNumOrdinalHistories(1);
62  sh->initLocalHistory(1, numEntriesFirstLocalHistories, 2);
63  return sh;
64 }
65 
66 unsigned
68  BranchInfo* bi, int hitBank, int altBank) const
69 {
70  return (bi->predBeforeSC + (((hitBank+1)/4)<<4) + (bi->highConf<<1) +
71  (bi->lowConf <<2) +((altBank!=0)<<3)) & ((1<<logBias) -1);
72 }
73 
74 int
76  ThreadID tid, Addr branch_pc, BranchInfo* bi, int & lsum, int64_t phist)
77 {
79  lsum += gPredict(
80  branch_pc, sh->globalHist, gm, ggehl, gnb, logGnb, wg);
81 
82  lsum += gPredict(
83  branch_pc, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw);
84 
85  // only 1 local history here
86  lsum += gPredict(
87  branch_pc, sh->getLocalHistory(1, branch_pc), lm,
88  lgehl, lnb, logLnb, wl);
89 
90  lsum += gPredict(
91  branch_pc, sh->imliCount, im, igehl, inb, logInb, wi);
92 
93  int thres = (updateThreshold>>3)+pUpdateThreshold[getIndUpd(branch_pc)];
94 
95  return thres;
96 }
97 
99 {
100  return 0;
101 }
102 
103 void
105  const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi,
106  Addr corrTarget)
107 {
108  int brtype = inst->isDirectCtrl() ? 0 : 2;
109  if (! inst->isUncondCtrl()) {
110  ++brtype;
111  }
112  // Non speculative SC histories update
113  if (brtype & 1) {
115  static_cast<SC_8KB_ThreadHistory *>(scHistory);
116  sh->globalHist = (sh->globalHist << 1) + taken;
117  }
118 
119  StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, tage_bi,
120  corrTarget);
121 }
122 
123 void
125  BranchInfo* bi, int64_t phist)
126 {
128  gUpdate(pc, taken, sh->globalHist, gm, ggehl, gnb, logGnb, wg, bi);
129  gUpdate(pc, taken, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw, bi);
130  gUpdate(pc, taken, sh->getLocalHistory(1, pc), lm, lgehl, lnb, logLnb, wl,
131  bi);
132  gUpdate(pc, taken, sh->imliCount, im, igehl, inb, logInb, wi, bi);
133 }
134 
136 TAGE_SC_L_8KB_StatisticalCorrectorParams::create()
137 {
138  return new TAGE_SC_L_8KB_StatisticalCorrector(this);
139 }
140 
141 TAGE_SC_L_8KB::TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams *params)
142  : TAGE_SC_L(params)
143 {
144 }
145 
146 void
148 {
149  // Some hardcoded values are used here
150  // (they do not seem to depend on any parameter)
151  for (int i = 1; i <= nHistoryTables; i++) {
152  history.computeIndices[i].init(
153  histLengths[i], 17 + (2 * ((i - 1) / 2) % 4));
154  history.computeTags[0][i].init(
155  history.computeIndices[i].origLength, 13);
156  history.computeTags[1][i].init(
157  history.computeIndices[i].origLength, 11);
158  DPRINTF(TageSCL, "HistLength:%d, TTSize:%d, TTTWidth:%d\n",
160  }
161 }
162 
163 int
165 {
166  return (index ^ (index >> logTagTableSizes[bank])
167  ^ (index >> 2 * logTagTableSizes[bank]));
168 }
169 
170 uint16_t
172 {
173  int tag = (threadHistory[tid].computeIndices[bank - 1].comp << 2) ^ pc ^
174  (pc >> instShiftAmt) ^
175  threadHistory[tid].computeIndices[bank].comp;
176  int hlen = (histLengths[bank] > pathHistBits) ? pathHistBits :
177  histLengths[bank];
178 
179  tag = (tag >> 1) ^ ((tag & 1) << 10) ^
180  F(threadHistory[tid].pathHist, hlen, bank);
181  tag ^= threadHistory[tid].computeTags[0][bank].comp ^
182  (threadHistory[tid].computeTags[1][bank].comp << 1);
183 
184  return ((tag ^ (tag >> tagTableTagWidths[bank]))
185  & ((ULL(1) << tagTableTagWidths[bank]) - 1));
186 }
187 
188 void
190  bool alloc, bool taken, TAGEBase::BranchInfo* bi, int nrand)
191 {
192  if (!alloc) {
193  return;
194  }
195 
196  int penalty = 0;
197  int truePen = 0;
198  int numAllocated = 0;
199  bool maxAllocReached = false;
200 
201  for (int I = calcDep(bi); I < nHistoryTables; I += 2) {
202  // Handle the 2-way associativity for allocation
203  for (int j = 0; j < 2; ++j) {
204  int i = ((j == 0) ? I : (I ^ 1)) + 1;
205  if (i > nHistoryTables) {
206  break;
207  }
208  if (noSkip[i]) {
209  if (gtable[i][bi->tableIndices[i]].u == 0) {
210  gtable[i][bi->tableIndices[i]].u =
211  ((random_mt.random<int>() & 31) == 0);
212  // protect randomly from fast replacement
213  gtable[i][bi->tableIndices[i]].tag = bi->tableTags[i];
214  gtable[i][bi->tableIndices[i]].ctr = taken ? 0 : -1;
215  numAllocated++;
216 
217  if (numAllocated == maxNumAlloc) {
218  maxAllocReached = true;
219  break;
220  }
221  I += 2;
222  } else {
223  int8_t ctr = gtable[i][bi->tableIndices[i]].ctr;
224  if ((gtable[i][bi->tableIndices[i]].u == 1) &
225  (abs (2 * ctr + 1) == 1)) {
226  if ((random_mt.random<int>() & 7) == 0) {
227  gtable[i][bi->tableIndices[i]].u = 0;
228  }
229  } else {
230  truePen++;
231  }
232  penalty++;
233  }
234  } else {
235  break;
236  }
237  }
238  if (maxAllocReached) {
239  break;
240  }
241  }
242 
243  tCounter += (truePen + penalty - 5 * numAllocated);
244 
245  handleUReset();
246 }
247 
248 void
250 {
251  // On real HW it should be u >>= 1 instead of if > 0 then u--
252  if (u > 0) {
253  u--;
254  }
255 }
256 
257 void
260 {
261  if (bi->hitBank > 0) {
262  if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
263  if (bi->longestMatchPred != taken) { // acts as a protection
264  if (bi->altBank > 0) {
265  int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
266  if (abs (2 * ctr + 1) == 1) {
267  gtable[bi->altBank][bi->altBankIndex].u = 0;
268  }
269 
270  //just mute from protected to unprotected
271  ctrUpdate(gtable[bi->altBank][bi->altBankIndex].ctr, taken,
273  ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
274  if (abs (2 * ctr + 1) == 1) {
275  gtable[bi->altBank][bi->altBankIndex].u = 0;
276  }
277  }
278  if (bi->altBank == 0) {
279  baseUpdate(branch_pc, taken, bi);
280  }
281  }
282  }
283 
284  //just mute from protected to unprotected
285  if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
286  gtable[bi->hitBank][bi->hitBankIndex].u = 0;
287  }
288 
289  ctrUpdate(gtable[bi->hitBank][bi->hitBankIndex].ctr, taken,
291 
292  //sign changes: no way it can have been useful
293  if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
294  gtable[bi->hitBank][bi->hitBankIndex].u = 0;
295  }
296 
297  if (bi->altTaken == taken) {
298  if (bi->altBank > 0) {
299  int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
300  if (abs (2*ctr + 1) == 7) {
301  if (gtable[bi->hitBank][bi->hitBankIndex].u == 1) {
302  if (bi->longestMatchPred == taken) {
303  gtable[bi->hitBank][bi->hitBankIndex].u = 0;
304  }
305  }
306  }
307  }
308  }
309  } else {
310  baseUpdate(branch_pc, taken, bi);
311  }
312 
313  if ((bi->longestMatchPred != bi->altTaken) &&
314  (bi->longestMatchPred == taken) &&
315  (gtable[bi->hitBank][bi->hitBankIndex].u < (1 << tagTableUBits) -1)) {
316  gtable[bi->hitBank][bi->hitBankIndex].u++;
317  }
318 }
319 
321 TAGE_SC_L_TAGE_8KBParams::create()
322 {
323  return new TAGE_SC_L_TAGE_8KB(this);
324 }
325 
327 TAGE_SC_L_8KBParams::create()
328 {
329  return new TAGE_SC_L_8KB(this);
330 }
TAGEBase::tagTableTagWidths
std::vector< unsigned > tagTableTagWidths
Definition: tage_base.hh:425
StaticInst::isDirectCtrl
bool isDirectCtrl() const
Definition: static_inst.hh:178
TAGE_SC_L_8KB_StatisticalCorrector::SC_8KB_ThreadHistory
Definition: tage_sc_l_8KB.hh:79
ArmISA::sh
Bitfield< 8, 7 > sh
Definition: miscregs_types.hh:654
TAGEBase::TageEntry::u
uint8_t u
Definition: tage_base.hh:72
TAGEBase::nHistoryTables
const unsigned nHistoryTables
Definition: tage_base.hh:417
MipsISA::index
Bitfield< 30, 0 > index
Definition: pra_constants.hh:44
TAGE_SC_L_8KB::TAGE_SC_L_8KB
TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams *params)
Definition: tage_sc_l_8KB.cc:141
TAGE_SC_L_TAGE_8KB::gindex_ext
int gindex_ext(int index, int bank) const override
Definition: tage_sc_l_8KB.cc:164
TAGEBase::histLengths
int * histLengths
Definition: tage_base.hh:462
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
ThreadID
int16_t ThreadID
Thread index/ID type.
Definition: types.hh:227
TAGE_SC_L_8KB_StatisticalCorrector::logGnb
const unsigned logGnb
Definition: tage_sc_l_8KB.hh:74
TAGE_SC_L_TAGE::calcDep
int calcDep(TAGEBase::BranchInfo *bi)
Definition: tage_sc_l.cc:305
random.hh
TAGEBase::ThreadHistory::computeTags
FoldedHistory * computeTags[2]
Definition: tage_base.hh:452
TAGE_SC_L_TAGE_8KB
Definition: tage_sc_l_8KB.hh:50
TAGEBase::BranchInfo
Definition: tage_base.hh:120
StatisticalCorrector::logInb
const unsigned logInb
Definition: statistical_corrector.hh:157
TAGEBase::maxNumAlloc
unsigned maxNumAlloc
Definition: tage_base.hh:472
TAGE_SC_L_8KB_StatisticalCorrector::scHistoryUpdate
void scHistoryUpdate(Addr branch_pc, const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi, Addr corrTarget) override
Definition: tage_sc_l_8KB.cc:104
StatisticalCorrector::lgehl
std::vector< int8_t > * lgehl
Definition: statistical_corrector.hh:152
TAGE_SC_L_8KB_StatisticalCorrector
Definition: tage_sc_l_8KB.hh:70
TAGE_SC_L_8KB_StatisticalCorrector::wg
std::vector< int8_t > wg
Definition: tage_sc_l_8KB.hh:77
StatisticalCorrector::pUpdateThreshold
std::vector< int > pUpdateThreshold
Definition: statistical_corrector.hh:169
TAGEBase::ThreadHistory
Definition: tage_base.hh:434
TAGEBase::noSkip
std::vector< bool > noSkip
Definition: tage_base.hh:477
StatisticalCorrector::numEntriesFirstLocalHistories
const unsigned numEntriesFirstLocalHistories
Definition: statistical_corrector.hh:139
TAGE_SC_L_8KB_StatisticalCorrector::ggehl
std::vector< int8_t > * ggehl
Definition: tage_sc_l_8KB.hh:76
StatisticalCorrector::getIndUpd
virtual unsigned getIndUpd(Addr branch_pc) const
Definition: statistical_corrector.cc:165
StatisticalCorrector::wi
std::vector< int8_t > wi
Definition: statistical_corrector.hh:160
StatisticalCorrector::SCThreadHistory
Definition: statistical_corrector.hh:69
StatisticalCorrector::logLnb
const unsigned logLnb
Definition: statistical_corrector.hh:150
random_mt
Random random_mt
Definition: random.cc:96
TAGE_SC_L_8KB_StatisticalCorrector::gPredictions
int gPredictions(ThreadID tid, Addr branch_pc, BranchInfo *bi, int &lsum, int64_t phist) override
Definition: tage_sc_l_8KB.cc:75
StatisticalCorrector::bwgehl
std::vector< int8_t > * bwgehl
Definition: statistical_corrector.hh:145
TAGEBase::threadHistory
std::vector< ThreadHistory > threadHistory
Definition: tage_base.hh:455
PowerISA::bi
Bitfield< 20, 16 > bi
Definition: types.hh:63
TAGE_SC_L_8KB_StatisticalCorrector::gUpdates
void gUpdates(ThreadID tid, Addr pc, bool taken, BranchInfo *bi, int64_t phist) override
Definition: tage_sc_l_8KB.cc:124
ArmISA::j
Bitfield< 24 > j
Definition: miscregs_types.hh:54
TAGE_SC_L_TAGE_8KB::initFoldedHistories
void initFoldedHistories(ThreadHistory &history) override
Initialization of the folded histories.
Definition: tage_sc_l_8KB.cc:147
TAGEBase::tCounter
int64_t tCounter
Definition: tage_base.hh:467
TAGEBase::pathHistBits
const unsigned pathHistBits
Definition: tage_base.hh:423
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:234
MipsISA::pc
Bitfield< 4 > pc
Definition: pra_constants.hh:240
TAGE_SC_L_TAGE_8KB::gtag
uint16_t gtag(ThreadID tid, Addr pc, int bank) const override
Computes the partial tag of a tagged table.
Definition: tage_sc_l_8KB.cc:171
StatisticalCorrector::gUpdate
virtual void gUpdate(Addr branch_pc, bool taken, int64_t hist, std::vector< int > &length, std::vector< int8_t > *tab, int nbr, int logs, std::vector< int8_t > &w, BranchInfo *bi)
Definition: statistical_corrector.cc:203
TAGE_SC_L_TAGE_8KB::handleAllocAndUReset
void handleAllocAndUReset(bool alloc, bool taken, TAGEBase::BranchInfo *bi, int nrand) override
Handles Allocation and U bits reset on an update.
Definition: tage_sc_l_8KB.cc:189
StatisticalCorrector::wbw
std::vector< int8_t > wbw
Definition: statistical_corrector.hh:146
TAGE_SC_L_TAGE::F
int F(int phist, int size, int bank) const override
Utility function to shuffle the path history depending on which tagged table we are accessing.
Definition: tage_sc_l.cc:199
StatisticalCorrector::lm
std::vector< int > lm
Definition: statistical_corrector.hh:151
TAGE_SC_L
Definition: tage_sc_l.hh:148
TAGE_SC_L_TAGE::handleUReset
void handleUReset() override
Handles the U bits reset.
Definition: tage_sc_l.cc:316
TAGE_SC_L_8KB_StatisticalCorrector::TAGE_SC_L_8KB_StatisticalCorrector
TAGE_SC_L_8KB_StatisticalCorrector(TAGE_SC_L_8KB_StatisticalCorrectorParams *p)
Definition: tage_sc_l_8KB.cc:47
TAGEBase::baseUpdate
void baseUpdate(Addr pc, bool taken, BranchInfo *bi)
Updates the bimodal predictor.
Definition: tage_base.cc:296
TAGEBase::TageEntry::ctr
int8_t ctr
Definition: tage_base.hh:70
StatisticalCorrector::im
std::vector< int > im
Definition: statistical_corrector.hh:158
TAGE_SC_L_8KB
Definition: tage_sc_l_8KB.hh:109
TAGEBase::logTagTableSizes
std::vector< int > logTagTableSizes
Definition: tage_base.hh:426
TAGE_SC_L_8KB_StatisticalCorrector::makeThreadHistory
SCThreadHistory * makeThreadHistory() override
Definition: tage_sc_l_8KB.cc:58
TAGE_SC_L_TAGE_8KB::handleTAGEUpdate
void handleTAGEUpdate(Addr branch_pc, bool taken, TAGEBase::BranchInfo *bi) override
Handles the update of the TAGE entries.
Definition: tage_sc_l_8KB.cc:258
TAGEBase::tagTableCounterBits
const unsigned tagTableCounterBits
Definition: tage_base.hh:418
StatisticalCorrector::scHistory
SCThreadHistory * scHistory
Definition: statistical_corrector.hh:132
StatisticalCorrector::updateThreshold
int updateThreshold
Definition: statistical_corrector.hh:168
TAGEBase::TageEntry::tag
uint16_t tag
Definition: tage_base.hh:71
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
TAGE_SC_L_8KB_StatisticalCorrector::gnb
const unsigned gnb
Definition: tage_sc_l_8KB.hh:73
StatisticalCorrector::scHistoryUpdate
virtual void scHistoryUpdate(Addr branch_pc, const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi, Addr corrTarget)
Definition: statistical_corrector.cc:289
StatisticalCorrector::initGEHLTable
void initGEHLTable(unsigned numLenghts, std::vector< int > lengths, std::vector< int8_t > *&table, unsigned logNumEntries, std::vector< int8_t > &w, int8_t wInitValue)
Definition: statistical_corrector.cc:128
TAGEBase::ctrUpdate
static void ctrUpdate(T &ctr, bool taken, int nbits)
Updates a direction counter based on the actual branch outcome.
Definition: tage_base.cc:255
StatisticalCorrector::inb
const unsigned inb
Definition: statistical_corrector.hh:156
StatisticalCorrector::wl
std::vector< int8_t > wl
Definition: statistical_corrector.hh:153
TAGEBase::gtable
TageEntry ** gtable
Definition: tage_base.hh:430
ArmISA::u
Bitfield< 22 > u
Definition: miscregs_types.hh:348
tage_sc_l_8KB.hh
StatisticalCorrector::logBwnb
const unsigned logBwnb
Definition: statistical_corrector.hh:143
TAGEBase::FoldedHistory::init
void init(int original_length, int compressed_length)
Definition: tage_base.hh:92
TAGEBase::instShiftAmt
const unsigned instShiftAmt
Definition: tage_base.hh:481
StatisticalCorrector::BranchInfo
Definition: statistical_corrector.hh:192
StatisticalCorrector::igehl
std::vector< int8_t > * igehl
Definition: statistical_corrector.hh:159
StatisticalCorrector
Definition: statistical_corrector.hh:52
StatisticalCorrector::gPredict
int gPredict(Addr branch_pc, int64_t hist, std::vector< int > &length, std::vector< int8_t > *tab, int nbr, int logs, std::vector< int8_t > &w)
Definition: statistical_corrector.cc:187
StatisticalCorrector::logBias
const unsigned logBias
Definition: statistical_corrector.hh:134
Random::random
std::enable_if< std::is_integral< T >::value, T >::type random()
Use the SFINAE idiom to choose an implementation based on whether the type is integral or floating po...
Definition: random.hh:86
TAGEBase::FoldedHistory::origLength
int origLength
Definition: tage_base.hh:83
TAGE_SC_L_8KB_StatisticalCorrector::gIndexLogsSubstr
int gIndexLogsSubstr(int nbr, int i) override
Definition: tage_sc_l_8KB.cc:98
TAGEBase::tagTableUBits
const unsigned tagTableUBits
Definition: tage_base.hh:419
StatisticalCorrector::lnb
const unsigned lnb
Definition: statistical_corrector.hh:149
RefCountingPtr< StaticInst >
StatisticalCorrector::bwnb
const unsigned bwnb
Definition: statistical_corrector.hh:142
TAGE_SC_L_8KB_StatisticalCorrector::gm
std::vector< int > gm
Definition: tage_sc_l_8KB.hh:75
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
TAGEBase::ThreadHistory::computeIndices
FoldedHistory * computeIndices
Definition: tage_base.hh:451
TAGE_SC_L_TAGE_8KB::resetUctr
void resetUctr(uint8_t &u) override
Algorithm for resetting a single U counter.
Definition: tage_sc_l_8KB.cc:249
ULL
#define ULL(N)
uint64_t constant
Definition: types.hh:50
TAGE_SC_L_8KB_StatisticalCorrector::getIndBiasBank
unsigned getIndBiasBank(Addr branch_pc, BranchInfo *bi, int hitBank, int altBank) const override
Definition: tage_sc_l_8KB.cc:67
StaticInst::isUncondCtrl
bool isUncondCtrl() const
Definition: static_inst.hh:181
StatisticalCorrector::bwm
std::vector< int > bwm
Definition: statistical_corrector.hh:144

Generated on Wed Sep 30 2020 14:02:09 for gem5 by doxygen 1.8.17