misc: Make many includes explicit.
[gem5.git] / src / cpu / pred / multiperspective_perceptron_tage.hh
1 /*
2 * Copyright 2019 Texas A&M University
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * 3. Neither the name of the copyright holder nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Author: Daniel A. Jiménez
31 * Adapted to gem5 by: Javier Bueno Hedo
32 *
33 */
34
35 /*
36 * Multiperspective Perceptron Predictor with TAGE (by Daniel A. Jiménez)
37 */
38
39 #ifndef __CPU_PRED_MULTIPERSPECTIVE_PERCEPTRON_TAGE_HH__
40 #define __CPU_PRED_MULTIPERSPECTIVE_PERCEPTRON_TAGE_HH__
41
42 #include "cpu/pred/loop_predictor.hh"
43 #include "cpu/pred/multiperspective_perceptron.hh"
44 #include "cpu/pred/statistical_corrector.hh"
45 #include "cpu/pred/tage_base.hh"
46 #include "params/MPP_LoopPredictor.hh"
47 #include "params/MPP_StatisticalCorrector.hh"
48 #include "params/MPP_TAGE.hh"
49 #include "params/MultiperspectivePerceptronTAGE.hh"
50
51 class MPP_TAGE : public TAGEBase {
52 std::vector<unsigned int> tunedHistoryLengths;
53 public:
54 struct BranchInfo : public TAGEBase::BranchInfo {
55 BranchInfo(TAGEBase &tage) : TAGEBase::BranchInfo(tage)
56 {}
57 virtual ~BranchInfo()
58 {}
59 };
60
61 MPP_TAGE(const MPP_TAGEParams *p) : TAGEBase(p),
62 tunedHistoryLengths(p->tunedHistoryLengths)
63 {}
64
65 void calculateParameters() override;
66 void handleTAGEUpdate(Addr branch_pc, bool taken, TAGEBase::BranchInfo* bi)
67 override;
68 void handleAllocAndUReset(bool alloc, bool taken, TAGEBase::BranchInfo* bi,
69 int nrand) override;
70 void handleUReset() override;
71 void resetUctr(uint8_t &u) override;
72 int bindex(Addr pc_in) const override;
73 bool isHighConfidence(TAGEBase::BranchInfo *bi) const override;
74
75 unsigned getUseAltIdx(TAGEBase::BranchInfo* bi, Addr branch_pc) override;
76 void adjustAlloc(bool & alloc, bool taken, bool pred_taken) override;
77 void updateHistories(ThreadID tid, Addr branch_pc, bool taken,
78 TAGEBase::BranchInfo* b, bool speculative,
79 const StaticInstPtr &inst, Addr target) override;
80
81 void updatePathAndGlobalHistory(ThreadHistory& tHist, int brtype,
82 bool taken, Addr branch_pc, Addr target);
83 };
84
85 class MPP_LoopPredictor : public LoopPredictor {
86 public:
87 MPP_LoopPredictor(MPP_LoopPredictorParams *p) : LoopPredictor(p)
88 {}
89
90 bool calcConf(int index) const override;
91 bool optionalAgeInc() const override;
92 };
93
94 class MPP_StatisticalCorrector : public StatisticalCorrector {
95 protected:
96 int8_t thirdH;
97 // global branch history variation GEHL
98 const unsigned pnb;
99 const unsigned logPnb;
100 std::vector<int> pm;
101 std::vector<int8_t> * pgehl;
102 std::vector<int8_t> wp;
103
104 // global branch history GEHL
105 const unsigned gnb;
106 const unsigned logGnb;
107 std::vector<int> gm;
108 std::vector<int8_t> * ggehl;
109 std::vector<int8_t> wg;
110
111 struct MPP_SCThreadHistory : public StatisticalCorrector::SCThreadHistory
112 {
113 MPP_SCThreadHistory() : globalHist(0), historyStack(16, 0),
114 historyStackPointer(0) {}
115 int64_t globalHist; // global history
116 std::vector<int64_t> historyStack;
117 unsigned int historyStackPointer;
118
119 int64_t getHistoryStackEntry() const
120 {
121 return historyStack[historyStackPointer];
122 }
123
124 void updateHistoryStack(Addr target, bool taken, bool is_call,
125 bool is_return)
126 {
127 unsigned int truncated_target = target;
128 historyStack[historyStackPointer] =
129 (historyStack[historyStackPointer] << 1) ^ (truncated_target ^
130 (truncated_target >> 5) ^ taken);
131 if (is_return) {
132 historyStackPointer = (historyStackPointer - 1) %
133 historyStack.size();
134 }
135 if (is_call) {
136 int index = (historyStackPointer + 1) % historyStack.size();
137 historyStack[index] = historyStack[historyStackPointer];
138 historyStackPointer = index;
139 }
140 }
141 unsigned int getPointer() const { return historyStackPointer; }
142 };
143
144 public:
145 struct BranchInfo : public StatisticalCorrector::BranchInfo {
146 virtual ~BranchInfo()
147 {}
148 };
149 MPP_StatisticalCorrector(const MPP_StatisticalCorrectorParams *p);
150
151 void initBias() override;
152 unsigned getIndBias(Addr branch_pc, StatisticalCorrector::BranchInfo* bi,
153 bool bias) const override;
154 unsigned getIndBiasSK(Addr branch_pc, StatisticalCorrector::BranchInfo* bi)
155 const override;
156 unsigned getIndBiasBank(Addr branch_pc,
157 StatisticalCorrector::BranchInfo* bi, int hitBank,
158 int altBank) const override;
159 unsigned getIndUpd(Addr branch_pc) const override;
160 int gIndexLogsSubstr(int nbr, int i) override;
161
162 bool scPredict(ThreadID tid, Addr branch_pc, bool cond_branch,
163 StatisticalCorrector::BranchInfo* bi, bool prev_pred_taken,
164 bool bias_bit, bool use_conf_ctr, int8_t conf_ctr,
165 unsigned conf_bits, int hitBank, int altBank, int64_t phist,
166 int init_lsum) override;
167
168 void condBranchUpdate(ThreadID tid, Addr branch_pc, bool taken,
169 StatisticalCorrector::BranchInfo *bi,
170 Addr corrTarget, bool b, int hitBank, int altBank,
171 int64_t phist) override;
172
173 virtual void getBiasLSUM(Addr branch_pc,
174 StatisticalCorrector::BranchInfo *bi, int &lsum) const = 0;
175
176 void gUpdate(
177 Addr branch_pc, bool taken, int64_t hist, std::vector<int> & length,
178 std::vector<int8_t> * tab, int nbr, int logs,
179 std::vector<int8_t> &w, StatisticalCorrector::BranchInfo* bi) override;
180 };
181
182 class MultiperspectivePerceptronTAGE : public MultiperspectivePerceptron
183 {
184 TAGEBase *tage;
185 LoopPredictor *loopPredictor;
186 StatisticalCorrector *statisticalCorrector;
187
188 /**
189 * Branch information data type
190 */
191 struct MPPTAGEBranchInfo : public MPPBranchInfo
192 {
193 TAGEBase::BranchInfo *tageBranchInfo;
194 LoopPredictor::BranchInfo *lpBranchInfo;
195 StatisticalCorrector::BranchInfo *scBranchInfo;
196 bool predictedTaken;
197 MPPTAGEBranchInfo(Addr pc, int pcshift, bool cond, TAGEBase &tage,
198 LoopPredictor &loopPredictor,
199 StatisticalCorrector &statisticalCorrector)
200 : MPPBranchInfo(pc, pcshift, cond),
201 tageBranchInfo(tage.makeBranchInfo()),
202 lpBranchInfo(loopPredictor.makeBranchInfo()),
203 scBranchInfo(statisticalCorrector.makeBranchInfo()),
204 predictedTaken(false)
205 {}
206 virtual ~MPPTAGEBranchInfo()
207 {
208 delete tageBranchInfo;
209 delete lpBranchInfo;
210 delete scBranchInfo;
211 }
212 };
213
214 unsigned int getIndex(ThreadID tid, MPPTAGEBranchInfo &bi,
215 const HistorySpec &spec, int index) const;
216 int computePartialSum(ThreadID tid, MPPTAGEBranchInfo &bi) const;
217 void updatePartial(ThreadID tid, MPPTAGEBranchInfo &bi, bool taken);
218 void updateHistories(ThreadID tid, MPPTAGEBranchInfo &bi, bool taken);
219
220 public:
221 MultiperspectivePerceptronTAGE(
222 const MultiperspectivePerceptronTAGEParams *p);
223
224 void init() override;
225
226 bool lookup(ThreadID tid, Addr instPC, void * &bp_history) override;
227
228 void update(ThreadID tid, Addr instPC, bool taken,
229 void *bp_history, bool squashed,
230 const StaticInstPtr & inst,
231 Addr corrTarget = MaxAddr) override;
232 void uncondBranch(ThreadID tid, Addr pc, void * &bp_history) override;
233 void squash(ThreadID tid, void *bp_history) override;
234
235 };
236 #endif//__CPU_PRED_MULTIPERSPECTIVE_PERCEPTRON_TAGE_HH__