|
gem5 v23.0.0.1
|
Basically a wrapper class to hold both the branch predictor and the BTB. More...
#include <bpred_unit.hh>
Classes | |
| struct | BPredUnitStats |
| struct | PredictorHistory |
Public Types | |
| typedef BranchPredictorParams | Params |
Public Types inherited from gem5::SimObject | |
| typedef SimObjectParams | Params |
Public Member Functions | |
| BPredUnit (const Params &p) | |
| void | regProbePoints () override |
| Register probe points for this object. | |
| void | drainSanityCheck () const |
| Perform sanity checks after a drain. | |
| bool | predict (const StaticInstPtr &inst, const InstSeqNum &seqNum, PCStateBase &pc, ThreadID tid) |
| Predicts whether or not the instruction is a taken branch, and the target of the branch if it is taken. | |
| virtual void | uncondBranch (ThreadID tid, Addr pc, void *&bp_history)=0 |
| void | update (const InstSeqNum &done_sn, ThreadID tid) |
| Tells the branch predictor to commit any updates until the given sequence number. | |
| void | squash (const InstSeqNum &squashed_sn, ThreadID tid) |
| Squashes all outstanding updates until a given sequence number. | |
| void | squash (const InstSeqNum &squashed_sn, const PCStateBase &corr_target, bool actually_taken, ThreadID tid) |
| Squashes all outstanding updates until a given sequence number, and corrects that sn's update with the proper address and taken/not taken. | |
| virtual void | squash (ThreadID tid, void *bp_history)=0 |
| virtual bool | lookup (ThreadID tid, Addr instPC, void *&bp_history)=0 |
| Looks up a given PC in the BP to see if it is taken or not taken. | |
| virtual void | btbUpdate (ThreadID tid, Addr instPC, void *&bp_history)=0 |
| If a branch is not taken, because the BTB address is invalid or missing, this function sets the appropriate counter in the global and local predictors to not taken. | |
| bool | BTBValid (Addr instPC) |
| Looks up a given PC in the BTB to see if a matching entry exists. | |
| const PCStateBase * | BTBLookup (Addr inst_pc) |
| Looks up a given PC in the BTB to get the predicted target. | |
| virtual void | update (ThreadID tid, Addr instPC, bool taken, void *bp_history, bool squashed, const StaticInstPtr &inst, Addr corrTarget)=0 |
| Updates the BP with taken/not taken information. | |
| void | BTBUpdate (Addr instPC, const PCStateBase &target) |
| Updates the BTB with the target of a branch. | |
| void | dump () |
Public Member Functions inherited from gem5::SimObject | |
| const Params & | params () const |
| SimObject (const Params &p) | |
| virtual | ~SimObject () |
| virtual void | init () |
| init() is called after all C++ SimObjects have been created and all ports are connected. | |
| virtual void | loadState (CheckpointIn &cp) |
| loadState() is called on each SimObject when restoring from a checkpoint. | |
| virtual void | initState () |
| initState() is called on each SimObject when not restoring from a checkpoint. | |
| virtual void | regProbePoints () |
| Register probe points for this object. | |
| virtual void | regProbeListeners () |
| Register probe listeners for this object. | |
| ProbeManager * | getProbeManager () |
| Get the probe manager for this object. | |
| virtual Port & | getPort (const std::string &if_name, PortID idx=InvalidPortID) |
| Get a port with a given name and index. | |
| virtual void | startup () |
| startup() is the final initialization call before simulation. | |
| DrainState | drain () override |
| Provide a default implementation of the drain interface for objects that don't need draining. | |
| virtual void | memWriteback () |
| Write back dirty buffers to memory using functional writes. | |
| virtual void | memInvalidate () |
| Invalidate the contents of memory buffers. | |
| void | serialize (CheckpointOut &cp) const override |
| Serialize an object. | |
| void | unserialize (CheckpointIn &cp) override |
| Unserialize an object. | |
Public Member Functions inherited from gem5::EventManager | |
| EventQueue * | eventQueue () const |
| void | schedule (Event &event, Tick when) |
| void | deschedule (Event &event) |
| void | reschedule (Event &event, Tick when, bool always=false) |
| void | schedule (Event *event, Tick when) |
| void | deschedule (Event *event) |
| void | reschedule (Event *event, Tick when, bool always=false) |
| void | wakeupEventQueue (Tick when=(Tick) -1) |
| This function is not needed by the usual gem5 event loop but may be necessary in derived EventQueues which host gem5 on other schedulers. | |
| void | setCurTick (Tick newVal) |
| EventManager (EventManager &em) | |
| Event manger manages events in the event queue. | |
| EventManager (EventManager *em) | |
| EventManager (EventQueue *eq) | |
Public Member Functions inherited from gem5::Serializable | |
| Serializable () | |
| virtual | ~Serializable () |
| virtual void | serialize (CheckpointOut &cp) const =0 |
| Serialize an object. | |
| virtual void | unserialize (CheckpointIn &cp)=0 |
| Unserialize an object. | |
| void | serializeSection (CheckpointOut &cp, const char *name) const |
| Serialize an object into a new section. | |
| void | serializeSection (CheckpointOut &cp, const std::string &name) const |
| void | unserializeSection (CheckpointIn &cp, const char *name) |
| Unserialize an a child object. | |
| void | unserializeSection (CheckpointIn &cp, const std::string &name) |
Public Member Functions inherited from gem5::Drainable | |
| DrainState | drainState () const |
| Return the current drain state of an object. | |
| virtual void | notifyFork () |
| Notify a child process of a fork. | |
Public Member Functions inherited from gem5::statistics::Group | |
| Group (Group *parent, const char *name=nullptr) | |
| Construct a new statistics group. | |
| virtual | ~Group () |
| virtual void | regStats () |
| Callback to set stat parameters. | |
| virtual void | resetStats () |
| Callback to reset stats. | |
| virtual void | preDumpStats () |
| Callback before stats are dumped. | |
| void | addStat (statistics::Info *info) |
| Register a stat with this group. | |
| const std::map< std::string, Group * > & | getStatGroups () const |
| Get all child groups associated with this object. | |
| const std::vector< Info * > & | getStats () const |
| Get all stats associated with this object. | |
| void | addStatGroup (const char *name, Group *block) |
| Add a stat block as a child of this block. | |
| const Info * | resolveStat (std::string name) const |
| Resolve a stat by its name within this group. | |
| void | mergeStatGroup (Group *block) |
| Merge the contents (stats & children) of a block to this block. | |
| Group (const Group &)=delete | |
| Group & | operator= (const Group &)=delete |
Public Member Functions inherited from gem5::Named | |
| Named (const std::string &name_) | |
| virtual | ~Named ()=default |
| virtual std::string | name () const |
Protected Attributes | |
| const unsigned | instShiftAmt |
| Number of bits to shift instructions by for predictor addresses. | |
Protected Attributes inherited from gem5::SimObject | |
| const SimObjectParams & | _params |
| Cached copy of the object parameters. | |
Protected Attributes inherited from gem5::EventManager | |
| EventQueue * | eventq |
| A pointer to this object's event queue. | |
Private Types | |
| typedef std::deque< PredictorHistory > | History |
Private Attributes | |
| const unsigned | numThreads |
| Number of the threads for which the branch history is maintained. | |
| std::vector< History > | predHist |
| The per-thread predictor history. | |
| DefaultBTB | BTB |
| The BTB. | |
| std::vector< ReturnAddrStack > | RAS |
| The per-thread return address stack. | |
| IndirectPredictor * | iPred |
| The indirect target predictor. | |
| gem5::branch_prediction::BPredUnit::BPredUnitStats | stats |
PMU Probe points. | |
| probing::PMUUPtr | ppBranches |
| Branches seen by the branch predictor. | |
| probing::PMUUPtr | ppMisses |
| Miss-predicted branches. | |
| probing::PMUUPtr | pmuProbePoint (const char *name) |
| Helper method to instantiate probe points belonging to this object. | |
Additional Inherited Members | |
Static Public Member Functions inherited from gem5::SimObject | |
| static void | serializeAll (const std::string &cpt_dir) |
| Create a checkpoint by serializing all SimObjects in the system. | |
| static SimObject * | find (const char *name) |
| Find the SimObject with the given name and return a pointer to it. | |
| static void | setSimObjectResolver (SimObjectResolver *resolver) |
| There is a single object name resolver, and it is only set when simulation is restoring from checkpoints. | |
| static SimObjectResolver * | getSimObjectResolver () |
| There is a single object name resolver, and it is only set when simulation is restoring from checkpoints. | |
Static Public Member Functions inherited from gem5::Serializable | |
| static const std::string & | currentSection () |
| Gets the fully-qualified name of the active section. | |
| static void | generateCheckpointOut (const std::string &cpt_dir, std::ofstream &outstream) |
| Generate a checkpoint file so that the serialization can be routed to it. | |
Protected Member Functions inherited from gem5::Drainable | |
| Drainable () | |
| virtual | ~Drainable () |
| virtual DrainState | drain ()=0 |
| Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are partially executed or are partially in flight. | |
| virtual void | drainResume () |
| Resume execution after a successful drain. | |
| void | signalDrainDone () const |
| Signal that an object is drained. | |
Basically a wrapper class to hold both the branch predictor and the BTB.
Definition at line 68 of file bpred_unit.hh.
|
private |
Definition at line 284 of file bpred_unit.hh.
| typedef BranchPredictorParams gem5::branch_prediction::BPredUnit::Params |
Definition at line 71 of file bpred_unit.hh.
| gem5::branch_prediction::BPredUnit::BPredUnit | ( | const Params & | p | ) |
| params | The params object, that has the size of the BP and BTB. |
Definition at line 58 of file bpred_unit.cc.
References gem5::SimObject::params(), gem5::MipsISA::r, and RAS.
|
inline |
Looks up a given PC in the BTB to get the predicted target.
The PC may be changed or deleted in the future, so it needs to be used immediately, and/or copied for use later.
| inst_PC | The PC to look up. |
Definition at line 165 of file bpred_unit.hh.
References BTB, and gem5::branch_prediction::DefaultBTB::lookup().
|
inline |
Updates the BTB with the target of a branch.
| inst_PC | The branch's PC that will be updated. |
| target_PC | The branch's target that will be added to the BTB. |
Definition at line 192 of file bpred_unit.hh.
References BTB, gem5::branch_prediction::BPredUnit::BPredUnitStats::BTBUpdates, stats, and gem5::branch_prediction::DefaultBTB::update().
|
pure virtual |
If a branch is not taken, because the BTB address is invalid or missing, this function sets the appropriate counter in the global and local predictors to not taken.
| inst_PC | The PC to look up the local predictor. |
| bp_history | Pointer that will be set to an object that has the branch predictor state associated with the lookup. |
Implemented in gem5::branch_prediction::LocalBP, gem5::branch_prediction::BiModeBP, gem5::branch_prediction::TournamentBP, gem5::branch_prediction::MultiperspectivePerceptron, and gem5::branch_prediction::TAGE.
Referenced by predict().
|
inline |
Looks up a given PC in the BTB to see if a matching entry exists.
| inst_PC | The PC to look up. |
Definition at line 155 of file bpred_unit.hh.
References BTB, and gem5::branch_prediction::DefaultBTB::valid().
| void gem5::branch_prediction::BPredUnit::drainSanityCheck | ( | ) | const |
Perform sanity checks after a drain.
Definition at line 123 of file bpred_unit.cc.
References predHist.
Referenced by gem5::o3::Fetch::drainSanityCheck().
| void gem5::branch_prediction::BPredUnit::dump | ( | ) |
Definition at line 521 of file bpred_unit.cc.
References gem5::cprintf(), gem5::ArmISA::i, and predHist.
|
pure virtual |
Looks up a given PC in the BP to see if it is taken or not taken.
| inst_PC | The PC to look up. |
| bp_history | Pointer that will be set to an object that has the branch predictor state associated with the lookup. |
Implemented in gem5::branch_prediction::LocalBP, gem5::branch_prediction::BiModeBP, gem5::branch_prediction::TournamentBP, gem5::branch_prediction::TAGE, gem5::branch_prediction::MultiperspectivePerceptron, and gem5::branch_prediction::MultiperspectivePerceptronTAGE.
Referenced by predict().
|
protected |
Helper method to instantiate probe points belonging to this object.
| name | Name of the probe point. |
Definition at line 107 of file bpred_unit.cc.
References gem5::SimObject::getProbeManager(), and gem5::Named::name().
Referenced by regProbePoints().
| bool gem5::branch_prediction::BPredUnit::predict | ( | const StaticInstPtr & | inst, |
| const InstSeqNum & | seqNum, | ||
| PCStateBase & | pc, | ||
| ThreadID | tid | ||
| ) |
Predicts whether or not the instruction is a taken branch, and the target of the branch if it is taken.
| inst | The branch instruction. |
| PC | The predicted PC is passed back through this parameter. |
| tid | The thread id. |
Definition at line 132 of file bpred_unit.cc.
References gem5::StaticInst::advancePC(), BTB, gem5::branch_prediction::BPredUnit::BPredUnitStats::BTBHits, gem5::branch_prediction::BPredUnit::BPredUnitStats::BTBLookups, btbUpdate(), gem5::StaticInst::buildRetPC(), gem5::branch_prediction::BPredUnit::BPredUnitStats::condPredicted, DPRINTF, gem5::branch_prediction::IndirectPredictor::genIndirectInfo(), gem5::branch_prediction::BPredUnit::BPredUnitStats::indirectHits, gem5::branch_prediction::BPredUnit::BPredUnitStats::indirectLookups, gem5::branch_prediction::BPredUnit::BPredUnitStats::indirectMisses, iPred, gem5::StaticInst::isCall(), gem5::StaticInst::isDirectCtrl(), gem5::StaticInst::isReturn(), gem5::StaticInst::isUncondCtrl(), gem5::branch_prediction::IndirectPredictor::lookup(), gem5::branch_prediction::DefaultBTB::lookup(), lookup(), gem5::branch_prediction::BPredUnit::BPredUnitStats::lookups, gem5::MipsISA::pc, ppBranches, predHist, gem5::branch_prediction::BPredUnit::PredictorHistory::predTaken, gem5::branch_prediction::BPredUnit::PredictorHistory::pushedRAS, RAS, gem5::branch_prediction::BPredUnit::PredictorHistory::RASIndex, gem5::branch_prediction::BPredUnit::PredictorHistory::RASTarget, gem5::branch_prediction::BPredUnit::BPredUnitStats::RASUsed, gem5::branch_prediction::IndirectPredictor::recordIndirect(), gem5::ArmISA::set, stats, gem5::branch_prediction::BPredUnit::PredictorHistory::target, uncondBranch(), gem5::branch_prediction::IndirectPredictor::updateDirectionInfo(), gem5::branch_prediction::BPredUnit::PredictorHistory::usedRAS, gem5::branch_prediction::DefaultBTB::valid(), gem5::branch_prediction::BPredUnit::PredictorHistory::wasCall, gem5::branch_prediction::BPredUnit::PredictorHistory::wasIndirect, and gem5::branch_prediction::BPredUnit::PredictorHistory::wasReturn.
Referenced by gem5::o3::Fetch::lookupAndUpdateNextPC(), gem5::minor::Fetch2::predictBranch(), and gem5::BaseSimpleCPU::preExecute().
|
overridevirtual |
Register probe points for this object.
No probe points by default, so do nothing in base.
Reimplemented from gem5::SimObject.
Definition at line 116 of file bpred_unit.cc.
References pmuProbePoint(), ppBranches, and ppMisses.
| void gem5::branch_prediction::BPredUnit::squash | ( | const InstSeqNum & | squashed_sn, |
| const PCStateBase & | corr_target, | ||
| bool | actually_taken, | ||
| ThreadID | tid | ||
| ) |
Squashes all outstanding updates until a given sequence number, and corrects that sn's update with the proper address and taken/not taken.
| squashed_sn | The sequence number to squash any younger updates up until. |
| corr_target | The correct branch target. |
| actually_taken | The correct branch direction. |
| tid | The thread id. |
Definition at line 388 of file bpred_unit.cc.
References BTB, gem5::branch_prediction::BPredUnit::BPredUnitStats::BTBUpdates, gem5::branch_prediction::IndirectPredictor::changeDirectionPrediction(), gem5::branch_prediction::BPredUnit::BPredUnitStats::condIncorrect, DPRINTF, gem5::branch_prediction::BPredUnit::BPredUnitStats::indirectMispredicted, gem5::PCStateBase::instAddr(), iPred, ppMisses, predHist, RAS, gem5::branch_prediction::BPredUnit::BPredUnitStats::RASIncorrect, gem5::branch_prediction::IndirectPredictor::recordTarget(), squash(), stats, gem5::branch_prediction::DefaultBTB::update(), and update().
| void gem5::branch_prediction::BPredUnit::squash | ( | const InstSeqNum & | squashed_sn, |
| ThreadID | tid | ||
| ) |
Squashes all outstanding updates until a given sequence number.
| squashed_sn | The sequence number to squash any younger updates up until. |
| tid | The thread id. |
Definition at line 333 of file bpred_unit.cc.
References gem5::branch_prediction::IndirectPredictor::deleteIndirectInfo(), DPRINTF, iPred, predHist, RAS, squash(), and gem5::branch_prediction::IndirectPredictor::squash().
Referenced by gem5::BaseSimpleCPU::advancePC(), gem5::o3::Fetch::checkSignalsAndUpdate(), squash(), squash(), and gem5::minor::Fetch2::updateBranchPrediction().
|
pure virtual |
| bp_history | Pointer to the history object. The predictor will need to update any state and delete the object. |
Implemented in gem5::branch_prediction::LocalBP, gem5::branch_prediction::BiModeBP, gem5::branch_prediction::TournamentBP, gem5::branch_prediction::LTAGE, gem5::branch_prediction::MultiperspectivePerceptron, gem5::branch_prediction::MultiperspectivePerceptronTAGE, and gem5::branch_prediction::TAGE.
| void gem5::branch_prediction::BPredUnit::update | ( | const InstSeqNum & | done_sn, |
| ThreadID | tid | ||
| ) |
Tells the branch predictor to commit any updates until the given sequence number.
| done_sn | The sequence number to commit any older updates up until. |
| tid | The thread id. |
Definition at line 310 of file bpred_unit.cc.
References gem5::branch_prediction::IndirectPredictor::commit(), DPRINTF, iPred, gem5::MipsISA::pc, predHist, and update().
Referenced by gem5::BaseSimpleCPU::advancePC(), gem5::o3::Fetch::checkSignalsAndUpdate(), squash(), update(), and gem5::minor::Fetch2::updateBranchPrediction().
|
pure virtual |
Updates the BP with taken/not taken information.
| inst_PC | The branch's PC that will be updated. |
| taken | Whether the branch was taken or not taken. |
| bp_history | Pointer to the branch predictor state that is associated with the branch lookup that is being updated. |
| squashed | Set to true when this function is called during a squash operation. |
| inst | Static instruction information |
| corrTarget | The resolved target of the branch (only needed for squashed branches) |
Implemented in gem5::branch_prediction::LocalBP, gem5::branch_prediction::BiModeBP, gem5::branch_prediction::TournamentBP, gem5::branch_prediction::LTAGE, gem5::branch_prediction::TAGE, gem5::branch_prediction::TAGE_SC_L, gem5::branch_prediction::MultiperspectivePerceptron, and gem5::branch_prediction::MultiperspectivePerceptronTAGE.
|
private |
The BTB.
Definition at line 298 of file bpred_unit.hh.
Referenced by BTBLookup(), BTBUpdate(), BTBValid(), predict(), and squash().
|
protected |
Number of bits to shift instructions by for predictor addresses.
Definition at line 341 of file bpred_unit.hh.
Referenced by gem5::branch_prediction::TournamentBP::calcLocHistIdx(), gem5::branch_prediction::LocalBP::getLocalIndex(), gem5::branch_prediction::LocalBP::LocalBP(), gem5::branch_prediction::BiModeBP::lookup(), gem5::branch_prediction::MultiperspectivePerceptronTAGE::lookup(), gem5::branch_prediction::LTAGE::predict(), gem5::branch_prediction::TAGE_SC_L::predict(), gem5::branch_prediction::BiModeBP::update(), gem5::branch_prediction::LTAGE::update(), gem5::branch_prediction::TAGE_SC_L::update(), and gem5::branch_prediction::MultiperspectivePerceptronTAGE::update().
|
private |
|
private |
Number of the threads for which the branch history is maintained.
Definition at line 287 of file bpred_unit.hh.
|
protected |
Branches seen by the branch predictor.
Definition at line 363 of file bpred_unit.hh.
Referenced by predict(), and regProbePoints().
|
protected |
Miss-predicted branches.
Definition at line 366 of file bpred_unit.hh.
Referenced by regProbePoints(), and squash().
|
private |
The per-thread predictor history.
This is used to update the predictor as instructions are committed, or restore it to the proper state after a squash.
Definition at line 295 of file bpred_unit.hh.
Referenced by drainSanityCheck(), dump(), predict(), squash(), squash(), and update().
|
private |
The per-thread return address stack.
Definition at line 301 of file bpred_unit.hh.
Referenced by BPredUnit(), predict(), squash(), and squash().
|
private |
Referenced by BTBUpdate(), predict(), and squash().