クラス Onikiri::BPred

#include <BPred.h>

Onikiri::BPredに対する継承グラフ

Inheritance graph
[凡例]
Onikiri::BPredのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

Public メソッド

 BEGIN_PARAM_PATH (GetParamPath()) BEGIN_PARAM_PATH(GetResultPath()) BPred()
virtual void ChangeSimulationMode (SimulationMode mode)
void Commit (OpIterator op)
void Finished (OpIterator op)
void Initialize (InitPhase phase)
bool IsPerfect () const
PC Predict (OpIterator op, PC predIndexPC)
virtual ~BPred ()

Static Public 変数

static HookPoint< BPreds_branchPredictionMissHook

Protected メソッド

void RecoveryFromBPredMiss (OpIterator branch)

Protected 変数

BTBm_btb
OpExtraStateTable< BTBPredictm_btbPredTable
Corem_core
DirPredIFm_dirPred
ForwardEmulatorm_fwdEmulator
SimulationMode m_mode
bool m_perfect
PhysicalResourceArray< RASm_ras
std::vector< Statisticsm_statistics
Statistics m_totalStatistics

構成

struct  Statistics

説明

BPred.h57 行で定義されています。


コンストラクタとデストラクタ

BPred::~BPred (  )  [virtual]

BPred.cpp95 行で定義されています。

参照先 Onikiri::PhysicalResourceNode::ReleaseParam().

00096 {
00097     ReleaseParam();
00098 }

関数の呼び出しグラフ:


関数

Onikiri::BPred::BEGIN_PARAM_PATH ( GetParamPath()   ) 

virtual void Onikiri::BPred::ChangeSimulationMode ( SimulationMode  mode  )  [inline, virtual]

BPred.h94 行で定義されています。

00094 { m_mode = mode; };

void BPred::Commit ( OpIterator  op  ) 

BPred.cpp221 行で定義されています。

参照先 Onikiri::BTBPredict::hitOnikiri::OpClass::IsBranch()Onikiri::OpClass::IsConditionalBranch()m_btbm_btbPredTablem_dirPredm_modem_perfectm_statisticsm_totalStatisticsOnikiri::BPred::Statistics::numHitOnikiri::BPred::Statistics::numMissOnikiri::BranchTypeUtility::OpClassToBranchType()Onikiri::DirPredIF::Retired()Onikiri::PhysicalResourceNode::SM_SIMULATIONOnikiri::BTB::Update().

参照元 Onikiri::Fetcher::Commit()Onikiri::InorderSystem::Run().

00222 {
00223     if( m_perfect && m_mode != SM_SIMULATION ){
00224         return;
00225     }
00226 
00227     const OpClass& opClass = op->GetOpClass();
00228     if( !opClass.IsBranch() )
00229         return;
00230 
00231     bool conditional = opClass.IsConditionalBranch();
00232     
00233     if( !m_perfect ){
00234         // BTBXV
00235         const BTBPredict& predict = m_btbPredTable[op];
00236         m_btb->Update( op, predict );
00237 
00238         // \^CAm
00239         // i\BTBqbg
00240         if( conditional && predict.hit ){
00241             m_dirPred->Retired( op );
00242         }
00243     }
00244 
00245     // qbg
00246     PC pcTaken  = op->GetTakenPC();
00247     PC pcPred   = op->GetPredPC();
00248     PC pcNext   = NextPC( op->GetPC() );
00249     bool taken  = conditional ? op->GetTaken() : true;
00250     PC pcResult = taken ? pcTaken : pcNext;
00251 
00252     BranchTypeUtility util;
00253     BranchType type = util.OpClassToBranchType( opClass );
00254     if( pcPred == pcResult ){
00255         m_statistics[type].numHit++;
00256         m_totalStatistics.numHit++;
00257     }
00258     else{
00259         m_statistics[type].numMiss++;
00260         m_totalStatistics.numMiss++;
00261     }
00262 
00263 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void BPred::Finished ( OpIterator  op  ) 

BPred.cpp197 行で定義されています。

参照先 Onikiri::DirPredIF::Finished()Onikiri::OpClass::IsBranch()Onikiri::OpClass::IsConditionalBranch()m_btbPredTablem_dirPredm_perfectRecoveryFromBPredMiss().

参照元 Onikiri::Fetcher::Finished()Onikiri::InorderSystem::Run().

00198 {
00199     if( m_perfect ){
00200         return;
00201     }
00202 
00203     const OpClass& opClass = op->GetOpClass();
00204 
00205     // 
00206     if( !opClass.IsBranch() ) {
00207         return;
00208     }
00209 
00210     // Detect branch miss prediction and recovery if prediction is incorrect.
00211     RecoveryFromBPredMiss( op );
00212 
00213     // \タsm
00214     // i\BTBqbg
00215     if( opClass.IsConditionalBranch() && m_btbPredTable[op].hit ){
00216         m_dirPred->Finished( op );
00217     }
00218 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void BPred::Initialize ( InitPhase  phase  ) 

BPred.cpp101 行で定義されています。

参照先 Onikiri::PhysicalResourceNode::CheckNodeInitialized()Onikiri::Core::GetOpArray()Onikiri::PhysicalResourceNode::INIT_POST_CONNECTIONOnikiri::PhysicalResourceNode::INIT_PRE_CONNECTIONOnikiri::ForwardEmulator::IsEnabled()Onikiri::ParamExchange::LoadParam()m_btbm_btbPredTablem_corem_dirPredm_fwdEmulatorm_rasTHROW_RUNTIME_ERROR.

00102 {
00103     if( phase == INIT_PRE_CONNECTION ){
00104         LoadParam();
00105     }
00106     else if( phase == INIT_POST_CONNECTION ){
00107 
00108         // oZbg`FbN
00109         CheckNodeInitialized( "dirPred", m_dirPred );
00110         CheckNodeInitialized( "btb",  m_btb );
00111         CheckNodeInitialized( "ras",  m_ras );
00112         CheckNodeInitialized( "core", m_core );
00113         CheckNodeInitialized( "forwardEmulator", m_fwdEmulator );
00114 
00115         if( !m_fwdEmulator->IsEnabled() ){
00116             THROW_RUNTIME_ERROR(
00117                 "A perfect memory dependency predictor requires that a forawrd emulator is enabled." 
00118             );
00119         }
00120 
00121         m_btbPredTable.Resize( *m_core->GetOpArray() );
00122     }
00123 }

関数の呼び出しグラフ:

bool Onikiri::BPred::IsPerfect (  )  const [inline]

BPred.h91 行で定義されています。

参照先 m_perfect.

参照元 RecoveryFromBPredMiss().

00091 { return m_perfect; }

Here is the caller graph for this function:

PC BPred::Predict ( OpIterator  op,
PC  predIndexPC 
)

BPred.cpp128 行で定義されています。

参照先 ASSERTOnikiri::BT_CALLOnikiri::BT_CONDITIONALOnikiri::BT_CONDITIONAL_RETURNOnikiri::BT_ENDOnikiri::BT_NONOnikiri::BT_RETURNOnikiri::BT_UNCONDITIONALOnikiri::BTBPredict::dirPredictOnikiri::ForwardEmulator::GetExecutionResult()Onikiri::OpStateIF::GetPC()Onikiri::OpStateIF::GetTaken()Onikiri::OpStateIF::GetTakenPC()Onikiri::BTBPredict::hitm_btbm_btbPredTablem_dirPredm_fwdEmulatorm_modem_perfectm_rasOnikiri::DirPredIF::Predict()Onikiri::BTB::Predict()Onikiri::PhysicalResourceNode::SM_SIMULATIONOnikiri::BTBPredict::targetTHROW_RUNTIME_ERROROnikiri::BTBPredict::type.

参照元 Onikiri::Fetcher::PredictNextPCBody()Onikiri::InorderSystem::Run().

00129 {
00130     if( m_perfect && m_mode == SM_SIMULATION ){
00131         // Forward emulator can work in a simulation mode only.
00132         const OpStateIF* result = m_fwdEmulator->GetExecutionResult( op );
00133         if( !result ){
00134             THROW_RUNTIME_ERROR( "Pre-executed result cannot be retrieved from a forward emulator." );
00135         }
00136         return
00137             result->GetTaken() ? result->GetTakenPC() : NextPC( result->GetPC() );
00138     }
00139 
00140 
00141     SimPC pc = op->GetPC();
00142     BTBPredict btbPred = m_btb->Predict(predIndexPC);
00143     bool btbHit     = btbPred.hit;
00144 
00145     m_btbPredTable[op] = btbPred;
00146 
00147     // BTBqbgC\iXVjs
00148     if(!btbHit)
00149         return pc.Next();
00150 
00151 
00152     PC branchTarget = btbPred.target;
00153 
00154     // 
00155     bool predTaken  = btbPred.dirPredict ? m_dirPred->Predict(op, predIndexPC) : true;
00156 
00157     switch(btbPred.type){
00158     case BT_NON:
00159         ASSERT(0, "BT_NON is invalid.");
00160         return pc.Next();
00161 
00162     case BT_CONDITIONAL:
00163         // taken / not taken \APC
00164         // not taken \CopPC
00165         return predTaken ? branchTarget : pc.Next();        
00166 
00167     case BT_UNCONDITIONAL:
00168         //  BTB \
00169         return branchTarget;
00170 
00171     case BT_CALL:
00172         // call  RAS  push ABTB \
00173         // (CNgPushs
00174         m_ras[op->GetLocalTID()]->Push(pc);
00175         return branchTarget;
00176 
00177     case BT_RETURN:
00178         // return  RAS \ 
00179         return m_ras[op->GetLocalTID()]->Pop();
00180 
00181     case BT_CONDITIONAL_RETURN:
00182         // t^[DirPredTakenPop        
00183         // not taken PC
00184         return predTaken ? m_ras[op->GetLocalTID()]->Pop() : pc.Next();
00185 
00186     case BT_END:
00187         break;
00188     }
00189 
00190     // B
00191     THROW_RUNTIME_ERROR("reached end of Bpred::Predict\n");
00192 
00193     return pc.Next();   // warning 
00194 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void BPred::RecoveryFromBPredMiss ( OpIterator  branch  )  [protected]

BPred.cpp266 行で定義されています。

参照先 Onikiri::DS_BRANCH_PREDICTION_MISSOnikiri::Dumper::Dump()Onikiri::g_dumperHOOK_SECTION_OPIsPerfect()m_modeOnikiri::Recoverer::RecoverBPredMiss()s_branchPredictionMissHookOnikiri::PhysicalResourceNode::SM_SIMULATION.

参照元 Finished().

00267 {
00268     // Recovery is not necessary when the simulator is in an in-order mode.
00269     if( m_mode != PhysicalResourceNode::SM_SIMULATION ){
00270         return;
00271     }
00272 
00273     // If a perfect mode is enabled, prediction results are always correct and 
00274     // there is not nothing to do.
00275     if( IsPerfect() ){
00276         return;
00277     }
00278 
00279     if( branch->GetPredPC() != branch->GetNextPC() ) {
00280         // A branch prediction result is incorrect and recovery from an incorrect path.
00281         g_dumper.Dump( DS_BRANCH_PREDICTION_MISS, branch );
00282         HOOK_SECTION_OP( s_branchPredictionMissHook, branch )
00283         {
00284             Recoverer* recoverer = branch->GetThread()->GetRecoverer();
00285             recoverer->RecoverBPredMiss( branch );
00286         }
00287     }
00288 }

関数の呼び出しグラフ:

Here is the caller graph for this function:


変数

BTB* Onikiri::BPred::m_btb [protected]

BPred.h101 行で定義されています。

参照元 Commit()Initialize()Predict().

OpExtraStateTable<BTBPredict> Onikiri::BPred::m_btbPredTable [protected]

BPred.h112 行で定義されています。

参照元 Commit()Finished()Initialize()Predict().

Core* Onikiri::BPred::m_core [protected]

BPred.h103 行で定義されています。

参照元 Initialize().

DirPredIF* Onikiri::BPred::m_dirPred [protected]

BPred.h100 行で定義されています。

参照元 Commit()Finished()Initialize()Predict().

ForwardEmulator* Onikiri::BPred::m_fwdEmulator [protected]

BPred.h104 行で定義されています。

参照元 Initialize()Predict().

SimulationMode Onikiri::BPred::m_mode [protected]

BPred.h107 行で定義されています。

参照元 Commit()Predict()RecoveryFromBPredMiss().

bool Onikiri::BPred::m_perfect [protected]

BPred.h110 行で定義されています。

参照元 Commit()Finished()IsPerfect()Predict().

PhysicalResourceArray<RAS> Onikiri::BPred::m_ras [protected]

BPred.h102 行で定義されています。

参照元 Initialize()Predict().

std::vector<Statistics> Onikiri::BPred::m_statistics [protected]

BPred.h134 行で定義されています。

参照元 Commit().

Statistics Onikiri::BPred::m_totalStatistics [protected]

BPred.h135 行で定義されています。

参照元 Commit().

HookPoint< BPred > Onikiri::BPred::s_branchPredictionMissHook [static]

BPred.h94 行で定義されています。

参照元 RecoveryFromBPredMiss().


このクラスの説明は次のファイルから生成されました:
Onikiri2に対してTue Jun 18 14:51:32 2013に生成されました。  doxygen 1.4.7