gem5  v20.1.0.0
multiperspective_perceptron_tage.hh
Go to the documentation of this file.
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 
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 {
53  public:
54  struct BranchInfo : public TAGEBase::BranchInfo {
56  {}
57  virtual ~BranchInfo()
58  {}
59  };
60 
61  MPP_TAGE(const MPP_TAGEParams *p) : TAGEBase(p),
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 
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 
95  protected:
96  int8_t thirdH;
97  // global branch history variation GEHL
98  const unsigned pnb;
99  const unsigned logPnb;
103 
104  // global branch history GEHL
105  const unsigned gnb;
106  const unsigned logGnb;
110 
112  {
114  historyStackPointer(0) {}
115  int64_t globalHist; // global history
117  unsigned int historyStackPointer;
118 
119  int64_t getHistoryStackEntry() const
120  {
122  }
123 
124  void updateHistoryStack(Addr target, bool taken, bool is_call,
125  bool is_return)
126  {
127  unsigned int truncated_target = target;
129  (historyStack[historyStackPointer] << 1) ^ (truncated_target ^
130  (truncated_target >> 5) ^ taken);
131  if (is_return) {
133  historyStack.size();
134  }
135  if (is_call) {
136  int index = (historyStackPointer + 1) % historyStack.size();
139  }
140  }
141  unsigned int getPointer() const { return historyStackPointer; }
142  };
143 
144  public:
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;
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,
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,
180 };
181 
183 {
187 
192  {
201  tageBranchInfo(tage.makeBranchInfo()),
202  lpBranchInfo(loopPredictor.makeBranchInfo()),
203  scBranchInfo(statisticalCorrector.makeBranchInfo()),
204  predictedTaken(false)
205  {}
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:
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) 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__
MPP_StatisticalCorrector::MPP_SCThreadHistory::historyStack
std::vector< int64_t > historyStack
Definition: multiperspective_perceptron_tage.hh:116
MPP_StatisticalCorrector::MPP_SCThreadHistory::updateHistoryStack
void updateHistoryStack(Addr target, bool taken, bool is_call, bool is_return)
Definition: multiperspective_perceptron_tage.hh:124
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo
Branch information data type.
Definition: multiperspective_perceptron_tage.hh:191
MPP_StatisticalCorrector::gUpdate
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, StatisticalCorrector::BranchInfo *bi) override
Definition: multiperspective_perceptron_tage.cc:333
MPP_StatisticalCorrector::getIndBiasSK
unsigned getIndBiasSK(Addr branch_pc, StatisticalCorrector::BranchInfo *bi) const override
Definition: multiperspective_perceptron_tage.cc:306
MPP_StatisticalCorrector::BranchInfo::~BranchInfo
virtual ~BranchInfo()
Definition: multiperspective_perceptron_tage.hh:146
MPP_TAGE::BranchInfo::~BranchInfo
virtual ~BranchInfo()
Definition: multiperspective_perceptron_tage.hh:57
length
uint8_t length
Definition: inet.hh:422
MultiperspectivePerceptronTAGE::MultiperspectivePerceptronTAGE
MultiperspectivePerceptronTAGE(const MultiperspectivePerceptronTAGEParams *p)
Definition: multiperspective_perceptron_tage.cc:387
MipsISA::index
Bitfield< 30, 0 > index
Definition: pra_constants.hh:44
tage_base.hh
MPP_StatisticalCorrector::getIndBias
unsigned getIndBias(Addr branch_pc, StatisticalCorrector::BranchInfo *bi, bool bias) const override
Definition: multiperspective_perceptron_tage.cc:298
LoopPredictor::BranchInfo
Definition: loop_predictor.hh:122
MPP_StatisticalCorrector::MPP_SCThreadHistory
Definition: multiperspective_perceptron_tage.hh:111
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
ThreadID
int16_t ThreadID
Thread index/ID type.
Definition: types.hh:227
StatisticalCorrector::bias
std::vector< int8_t > bias
Definition: statistical_corrector.hh:162
MPP_TAGE::tunedHistoryLengths
std::vector< unsigned int > tunedHistoryLengths
Definition: multiperspective_perceptron_tage.hh:52
statistical_corrector.hh
MPP_StatisticalCorrector::gIndexLogsSubstr
int gIndexLogsSubstr(int nbr, int i) override
Definition: multiperspective_perceptron_tage.cc:321
MPP_StatisticalCorrector::MPP_SCThreadHistory::historyStackPointer
unsigned int historyStackPointer
Definition: multiperspective_perceptron_tage.hh:117
TAGEBase::BranchInfo
Definition: tage_base.hh:120
MultiperspectivePerceptron::pcshift
const int pcshift
Definition: multiperspective_perceptron.hh:258
ArmISA::cond
cond
Definition: types.hh:61
LoopPredictor
Definition: loop_predictor.hh:43
MPP_TAGE::BranchInfo::BranchInfo
BranchInfo(TAGEBase &tage)
Definition: multiperspective_perceptron_tage.hh:55
MPP_StatisticalCorrector::BranchInfo
Definition: multiperspective_perceptron_tage.hh:145
MPP_StatisticalCorrector::MPP_SCThreadHistory::getHistoryStackEntry
int64_t getHistoryStackEntry() const
Definition: multiperspective_perceptron_tage.hh:119
std::vector< unsigned int >
MultiperspectivePerceptronTAGE::init
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: multiperspective_perceptron_tage.cc:398
MPP_StatisticalCorrector
Definition: multiperspective_perceptron_tage.hh:94
MPP_StatisticalCorrector::getBiasLSUM
virtual void getBiasLSUM(Addr branch_pc, StatisticalCorrector::BranchInfo *bi, int &lsum) const =0
MPP_StatisticalCorrector::logGnb
const unsigned logGnb
Definition: multiperspective_perceptron_tage.hh:106
MultiperspectivePerceptronTAGE::updatePartial
void updatePartial(ThreadID tid, MPPTAGEBranchInfo &bi, bool taken)
Definition: multiperspective_perceptron_tage.cc:447
MPP_TAGE::BranchInfo
Definition: multiperspective_perceptron_tage.hh:54
MPP_StatisticalCorrector::getIndBiasBank
unsigned getIndBiasBank(Addr branch_pc, StatisticalCorrector::BranchInfo *bi, int hitBank, int altBank) const override
Definition: multiperspective_perceptron_tage.cc:314
MPP_TAGE::getUseAltIdx
unsigned getUseAltIdx(TAGEBase::BranchInfo *bi, Addr branch_pc) override
Calculation of the index for useAltPredForNewlyAllocated On this base TAGE implementation it is alway...
Definition: multiperspective_perceptron_tage.cc:169
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo::lpBranchInfo
LoopPredictor::BranchInfo * lpBranchInfo
Definition: multiperspective_perceptron_tage.hh:194
MultiperspectivePerceptronTAGE
Definition: multiperspective_perceptron_tage.hh:182
StatisticalCorrector::SCThreadHistory
Definition: statistical_corrector.hh:69
MultiperspectivePerceptronTAGE::uncondBranch
void uncondBranch(ThreadID tid, Addr pc, void *&bp_history) override
Definition: multiperspective_perceptron_tage.cc:680
MultiperspectivePerceptronTAGE::getIndex
unsigned int getIndex(ThreadID tid, MPPTAGEBranchInfo &bi, const HistorySpec &spec, int index) const
Definition: multiperspective_perceptron_tage.cc:411
MPP_TAGE::adjustAlloc
void adjustAlloc(bool &alloc, bool taken, bool pred_taken) override
Extra calculation to tell whether TAGE allocaitons may happen or not on an update For this base TAGE ...
Definition: multiperspective_perceptron_tage.cc:178
MPP_TAGE
Definition: multiperspective_perceptron_tage.hh:51
MPP_TAGE::bindex
int bindex(Addr pc_in) const override
Computes the index used to access the bimodal table.
Definition: multiperspective_perceptron_tage.cc:161
PowerISA::bi
Bitfield< 20, 16 > bi
Definition: types.hh:63
MultiperspectivePerceptronTAGE::squash
void squash(ThreadID tid, void *bp_history) override
Definition: multiperspective_perceptron_tage.cc:690
MultiperspectivePerceptronTAGE::computePartialSum
int computePartialSum(ThreadID tid, MPPTAGEBranchInfo &bi) const
Definition: multiperspective_perceptron_tage.cc:435
MPP_TAGE::updateHistories
void updateHistories(ThreadID tid, Addr branch_pc, bool taken, TAGEBase::BranchInfo *b, bool speculative, const StaticInstPtr &inst, Addr target) override
(Speculatively) updates global histories (path and direction).
Definition: multiperspective_perceptron_tage.cc:187
MPP_StatisticalCorrector::wg
std::vector< int8_t > wg
Definition: multiperspective_perceptron_tage.hh:109
MPP_StatisticalCorrector::thirdH
int8_t thirdH
Definition: multiperspective_perceptron_tage.hh:96
MPP_TAGE::handleTAGEUpdate
void handleTAGEUpdate(Addr branch_pc, bool taken, TAGEBase::BranchInfo *bi) override
Handles the update of the TAGE entries.
Definition: multiperspective_perceptron_tage.cc:53
multiperspective_perceptron.hh
MipsISA::w
Bitfield< 0 > w
Definition: pra_constants.hh:278
MPP_TAGE::resetUctr
void resetUctr(uint8_t &u) override
Algorithm for resetting a single U counter.
Definition: multiperspective_perceptron_tage.cc:151
MPP_TAGE::updatePathAndGlobalHistory
void updatePathAndGlobalHistory(ThreadHistory &tHist, int brtype, bool taken, Addr branch_pc, Addr target)
Definition: multiperspective_perceptron_tage.cc:207
MPP_StatisticalCorrector::condBranchUpdate
void condBranchUpdate(ThreadID tid, Addr branch_pc, bool taken, StatisticalCorrector::BranchInfo *bi, Addr corrTarget, bool b, int hitBank, int altBank, int64_t phist) override
Definition: multiperspective_perceptron_tage.cc:559
MPP_TAGE::handleAllocAndUReset
void handleAllocAndUReset(bool alloc, bool taken, TAGEBase::BranchInfo *bi, int nrand) override
Handles Allocation and U bits reset on an update.
Definition: multiperspective_perceptron_tage.cc:89
MipsISA::pc
Bitfield< 4 > pc
Definition: pra_constants.hh:240
MultiperspectivePerceptronTAGE::update
void update(ThreadID tid, Addr instPC, bool taken, void *bp_history, bool squashed, const StaticInstPtr &inst, Addr corrTarget) override
Updates the BP with taken/not taken information.
Definition: multiperspective_perceptron_tage.cc:600
MPP_LoopPredictor::optionalAgeInc
bool optionalAgeInc() const override
Definition: multiperspective_perceptron_tage.cc:259
MPP_StatisticalCorrector::pgehl
std::vector< int8_t > * pgehl
Definition: multiperspective_perceptron_tage.hh:101
TAGEBase
Definition: tage_base.hh:58
MPP_StatisticalCorrector::scPredict
bool scPredict(ThreadID tid, Addr branch_pc, bool cond_branch, StatisticalCorrector::BranchInfo *bi, bool prev_pred_taken, bool bias_bit, bool use_conf_ctr, int8_t conf_ctr, unsigned conf_bits, int hitBank, int altBank, int64_t phist, int init_lsum) override
Definition: multiperspective_perceptron_tage.cc:348
MPP_StatisticalCorrector::MPP_SCThreadHistory::getPointer
unsigned int getPointer() const
Definition: multiperspective_perceptron_tage.hh:141
MPP_LoopPredictor::MPP_LoopPredictor
MPP_LoopPredictor(MPP_LoopPredictorParams *p)
Definition: multiperspective_perceptron_tage.hh:87
MPP_StatisticalCorrector::wp
std::vector< int8_t > wp
Definition: multiperspective_perceptron_tage.hh:102
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
MPP_StatisticalCorrector::pnb
const unsigned pnb
Definition: multiperspective_perceptron_tage.hh:98
MultiperspectivePerceptronTAGE::statisticalCorrector
StatisticalCorrector * statisticalCorrector
Definition: multiperspective_perceptron_tage.hh:186
MPP_StatisticalCorrector::ggehl
std::vector< int8_t > * ggehl
Definition: multiperspective_perceptron_tage.hh:108
ArmISA::u
Bitfield< 22 > u
Definition: miscregs_types.hh:348
MPP_StatisticalCorrector::logPnb
const unsigned logPnb
Definition: multiperspective_perceptron_tage.hh:99
MPP_StatisticalCorrector::gnb
const unsigned gnb
Definition: multiperspective_perceptron_tage.hh:105
MultiperspectivePerceptronTAGE::updateHistories
void updateHistories(ThreadID tid, MPPTAGEBranchInfo &bi, bool taken)
Definition: multiperspective_perceptron_tage.cc:471
ArmISA::b
Bitfield< 7 > b
Definition: miscregs_types.hh:376
loop_predictor.hh
StatisticalCorrector::BranchInfo
Definition: statistical_corrector.hh:192
MultiperspectivePerceptron::MPPBranchInfo::pc
const unsigned int pc
pc of the branch
Definition: multiperspective_perceptron.hh:56
MPP_TAGE::MPP_TAGE
MPP_TAGE(const MPP_TAGEParams *p)
Definition: multiperspective_perceptron_tage.hh:61
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo::tageBranchInfo
TAGEBase::BranchInfo * tageBranchInfo
Definition: multiperspective_perceptron_tage.hh:193
StatisticalCorrector
Definition: statistical_corrector.hh:52
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo::scBranchInfo
StatisticalCorrector::BranchInfo * scBranchInfo
Definition: multiperspective_perceptron_tage.hh:195
MPP_TAGE::calculateParameters
void calculateParameters() override
Calculates the history lengths and some other paramters in derived classes.
Definition: multiperspective_perceptron_tage.cc:44
MPP_StatisticalCorrector::getIndUpd
unsigned getIndUpd(Addr branch_pc) const override
Definition: multiperspective_perceptron_tage.cc:327
MPP_StatisticalCorrector::MPP_SCThreadHistory::MPP_SCThreadHistory
MPP_SCThreadHistory()
Definition: multiperspective_perceptron_tage.hh:113
MPP_StatisticalCorrector::gm
std::vector< int > gm
Definition: multiperspective_perceptron_tage.hh:107
MultiperspectivePerceptron::MPPBranchInfo
Branch information data.
Definition: multiperspective_perceptron.hh:54
RefCountingPtr< StaticInst >
MPP_StatisticalCorrector::MPP_SCThreadHistory::globalHist
int64_t globalHist
Definition: multiperspective_perceptron_tage.hh:115
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
MultiperspectivePerceptronTAGE::lookup
bool lookup(ThreadID tid, Addr instPC, void *&bp_history) override
Looks up a given PC in the BP to see if it is taken or not taken.
Definition: multiperspective_perceptron_tage.cc:527
MPP_StatisticalCorrector::pm
std::vector< int > pm
Definition: multiperspective_perceptron_tage.hh:100
MultiperspectivePerceptronTAGE::loopPredictor
LoopPredictor * loopPredictor
Definition: multiperspective_perceptron_tage.hh:185
MPP_TAGE::isHighConfidence
bool isHighConfidence(TAGEBase::BranchInfo *bi) const override
Definition: multiperspective_perceptron_tage.cc:232
MultiperspectivePerceptron
Definition: multiperspective_perceptron.hh:48
MultiperspectivePerceptronTAGE::tage
TAGEBase * tage
Definition: multiperspective_perceptron_tage.hh:184
MPP_LoopPredictor
Definition: multiperspective_perceptron_tage.hh:85
MPP_StatisticalCorrector::initBias
void initBias() override
Definition: multiperspective_perceptron_tage.cc:284
MPP_StatisticalCorrector::MPP_StatisticalCorrector
MPP_StatisticalCorrector(const MPP_StatisticalCorrectorParams *p)
Definition: multiperspective_perceptron_tage.cc:270
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo::predictedTaken
bool predictedTaken
Definition: multiperspective_perceptron_tage.hh:196
MPP_TAGE::handleUReset
void handleUReset() override
Handles the U bits reset.
Definition: multiperspective_perceptron_tage.cc:130
MPP_LoopPredictor::calcConf
bool calcConf(int index) const override
Definition: multiperspective_perceptron_tage.cc:252
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo::MPPTAGEBranchInfo
MPPTAGEBranchInfo(Addr pc, int pcshift, bool cond, TAGEBase &tage, LoopPredictor &loopPredictor, StatisticalCorrector &statisticalCorrector)
Definition: multiperspective_perceptron_tage.hh:197
MultiperspectivePerceptronTAGE::MPPTAGEBranchInfo::~MPPTAGEBranchInfo
virtual ~MPPTAGEBranchInfo()
Definition: multiperspective_perceptron_tage.hh:206

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