gem5 v24.0.0.0
Loading...
Searching...
No Matches
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
47namespace gem5
48{
49
50namespace branch_prediction
51{
52
54 const TAGE_SC_L_8KB_StatisticalCorrectorParams &p)
56 gnb(p.gnb),
57 logGnb(p.logGnb),
58 gm(p.gm)
59{
61}
62
65{
67 sh->setNumOrdinalHistories(1);
68 sh->initLocalHistory(1, numEntriesFirstLocalHistories, 2);
69 return sh;
70}
71
72unsigned
74 BranchInfo* bi, int hitBank, int altBank) const
75{
76 return (bi->predBeforeSC + (((hitBank+1)/4)<<4) + (bi->highConf<<1) +
77 (bi->lowConf <<2) +((altBank!=0)<<3)) & ((1<<logBias) -1);
78}
79
80int
82 ThreadID tid, Addr branch_pc, BranchInfo* bi, int & lsum, int64_t phist)
83{
85 lsum += gPredict(
86 branch_pc, sh->globalHist, gm, ggehl, gnb, logGnb, wg);
87
88 lsum += gPredict(
89 branch_pc, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw);
90
91 // only 1 local history here
92 lsum += gPredict(
93 branch_pc, sh->getLocalHistory(1, branch_pc), lm,
94 lgehl, lnb, logLnb, wl);
95
96 lsum += gPredict(
97 branch_pc, sh->imliCount, im, igehl, inb, logInb, wi);
98
99 int thres = (updateThreshold>>3)+pUpdateThreshold[getIndUpd(branch_pc)];
100
101 return thres;
102}
103
105{
106 return 0;
107}
108
109void
111 const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi,
112 Addr corrTarget)
113{
114 int brtype = inst->isDirectCtrl() ? 0 : 2;
115 if (! inst->isUncondCtrl()) {
116 ++brtype;
117 }
118 // Non speculative SC histories update
119 if (brtype & 1) {
121 static_cast<SC_8KB_ThreadHistory *>(scHistory);
122 sh->globalHist = (sh->globalHist << 1) + taken;
123 }
124
125 StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, tage_bi,
126 corrTarget);
127}
128
129void
131 BranchInfo* bi, int64_t phist)
132{
134 gUpdate(pc, taken, sh->globalHist, gm, ggehl, gnb, logGnb, wg, bi);
135 gUpdate(pc, taken, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw, bi);
136 gUpdate(pc, taken, sh->getLocalHistory(1, pc), lm, lgehl, lnb, logLnb, wl,
137 bi);
138 gUpdate(pc, taken, sh->imliCount, im, igehl, inb, logInb, wi, bi);
139}
140
141TAGE_SC_L_8KB::TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams &params)
142 : TAGE_SC_L(params)
143{
144}
145
146void
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
163int
165{
166 return (index ^ (index >> logTagTableSizes[bank])
167 ^ (index >> 2 * logTagTableSizes[bank]));
168}
169
170uint16_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 & ((1ULL << tagTableTagWidths[bank]) - 1));
186}
187
188void
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
248void
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
257void
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
320} // namespace branch_prediction
321} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:210
bool isDirectCtrl() const
bool isUncondCtrl() const
void initGEHLTable(unsigned numLenghts, std::vector< int > lengths, std::vector< int8_t > *&table, unsigned logNumEntries, std::vector< int8_t > &w, int8_t wInitValue)
virtual void scHistoryUpdate(Addr branch_pc, const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi, Addr corrTarget)
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)
virtual unsigned getIndUpd(Addr branch_pc) const
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)
static void ctrUpdate(T &ctr, bool taken, int nbits)
Updates a direction counter based on the actual branch outcome.
Definition tage_base.cc:261
std::vector< ThreadHistory > threadHistory
Definition tage_base.hh:464
std::vector< int > logTagTableSizes
Definition tage_base.hh:434
void baseUpdate(Addr pc, bool taken, BranchInfo *bi)
Updates the bimodal predictor.
Definition tage_base.cc:302
std::vector< unsigned > tagTableTagWidths
Definition tage_base.hh:433
TAGE_SC_L_8KB_StatisticalCorrector(const TAGE_SC_L_8KB_StatisticalCorrectorParams &p)
void scHistoryUpdate(Addr branch_pc, const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi, Addr corrTarget) override
unsigned getIndBiasBank(Addr branch_pc, BranchInfo *bi, int hitBank, int altBank) const override
int gPredictions(ThreadID tid, Addr branch_pc, BranchInfo *bi, int &lsum, int64_t phist) override
void gUpdates(ThreadID tid, Addr pc, bool taken, BranchInfo *bi, int64_t phist) override
TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams &params)
void handleAllocAndUReset(bool alloc, bool taken, TAGEBase::BranchInfo *bi, int nrand) override
Handles Allocation and U bits reset on an update.
uint16_t gtag(ThreadID tid, Addr pc, int bank) const override
Computes the partial tag of a tagged table.
void initFoldedHistories(ThreadHistory &history) override
Initialization of the folded histories.
int gindex_ext(int index, int bank) const override
void resetUctr(uint8_t &u) override
Algorithm for resetting a single U counter.
void handleTAGEUpdate(Addr branch_pc, bool taken, TAGEBase::BranchInfo *bi) override
Handles the update of the TAGE entries.
int calcDep(TAGEBase::BranchInfo *bi)
Definition tage_sc_l.cc:317
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:211
void handleUReset() override
Handles the U bits reset.
Definition tage_sc_l.cc:328
Random random_mt
Definition random.cc:99
std::enable_if_t< std::is_integral_v< T >, T > random()
Use the SFINAE idiom to choose an implementation based on whether the type is integral or floating po...
Definition random.hh:90
Bitfield< 8, 7 > sh
Bitfield< 7 > i
Definition misc_types.hh:67
Bitfield< 22 > u
Bitfield< 4 > pc
Bitfield< 30, 0 > index
Bitfield< 0 > p
Bitfield< 20, 16 > bi
Definition types.hh:80
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
int16_t ThreadID
Thread index/ID type.
Definition types.hh:235
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
void init(int original_length, int compressed_length)
Definition tage_base.hh:99

Generated on Tue Jun 18 2024 16:24:02 for gem5 by doxygen 1.11.0