クラス Onikiri::LatPred

#include <LatPred.h>

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

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

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

Public メソッド

 BEGIN_PARAM_MAP (GetResultPath()) RESULT_RATE_SUM_ENTRY("@PredictionHitRate"
void Commit (OpIterator op)
void Finished (OpIterator op)
HitMissPredIFGetHitMissPred ()
void Initialize (InitPhase phase)
m_numMiss m_numLoadMissPredToMiss LatPred ()
void Predict (OpIterator op)
m_numMiss RESULT_RATE_SUM_ENTRY ("@PredictionHitRatePredToHit", m_numLoadHitPredToHit, m_numLoadHitPredToHit, m_numLoadMissPredToHit) RESULT_RATE_SUM_ENTRY("@PredictionHitRatePredAsMiss"
 ~LatPred ()

Public 変数

 m_numHit
m_numMiss m_numLoadHitPredToMiss
m_numMiss m_numLoadMissPredToMiss

Static Public 変数

static HookPoint< LatPreds_latencyPredictionHook

Protected 変数

Corem_core
ExecLatencyInfom_execLatencyInfo
HitMissPredIFm_hmPredictor
u64 m_numHit
u64 m_numLoadHitPredToHit
u64 m_numLoadHitPredToMiss
u64 m_numLoadMissPredToHit
u64 m_numLoadMissPredToMiss
u64 m_numMiss

説明

LatPred.h49 行で定義されています。


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

LatPred::LatPred (  ) 

LatPred.cpp49 行で定義されています。

00049                  :
00050     m_execLatencyInfo(0),
00051     m_hmPredictor(0),
00052     m_core(0),
00053     m_numHit(0),
00054     m_numMiss(0),
00055     m_numLoadHitPredToHit(0),
00056     m_numLoadHitPredToMiss(0),
00057     m_numLoadMissPredToHit(0),
00058     m_numLoadMissPredToMiss(0)
00059 {
00060 }

LatPred::~LatPred (  ) 

LatPred.cpp62 行で定義されています。

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

00063 {
00064     ReleaseParam();
00065 }

関数の呼び出しグラフ:


関数

Onikiri::LatPred::BEGIN_PARAM_MAP ( GetResultPath()   ) 

void LatPred::Commit ( OpIterator  op  ) 

LatPred.cpp173 行で定義されています。

参照先 Onikiri::HitMissPredIF::Commit()Onikiri::LatPredResult::Get()Onikiri::LatPredResult::Scheduling::latencym_hmPredictorm_numHitm_numLoadHitPredToHitm_numLoadHitPredToMissm_numLoadMissPredToHitm_numLoadMissPredToMissm_numMissOnikiri::LatPredResult::Scheduling::wakeup.

参照元 Onikiri::Renamer::Commit().

00174 {
00175     if( !op->GetOpClass().IsLoad() ){
00176         return;
00177     }
00178 
00179     int latency = op->GetIssueState().executionLatency;
00180     const LatPredResult& latPredResult = 
00181         op->GetLatPredRsult();
00182     const LatPredResult::Scheduling& predSched = latPredResult.Get(0);
00183     
00184     bool predictedAsHitLv1 = predSched.wakeup;
00185     bool hitMissOfLV1      = latency == predSched.latency ? true : false;
00186     if( hitMissOfLV1 ){
00187         if( predictedAsHitLv1 ){
00188             m_numLoadHitPredToHit++;
00189         } 
00190         else{
00191             m_numLoadHitPredToMiss++;
00192         }
00193     }
00194     else{
00195         if( predictedAsHitLv1 ){
00196             m_numLoadMissPredToHit++;
00197         } else {
00198             m_numLoadMissPredToMiss++;
00199         }
00200     }
00201 
00202     if( predictedAsHitLv1 == hitMissOfLV1 )
00203         m_numHit++;
00204     else
00205         m_numMiss++;
00206 
00207     m_hmPredictor->Commit( op, hitMissOfLV1 );
00208 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void LatPred::Finished ( OpIterator  op  ) 

LatPred.cpp210 行で定義されています。

参照先 Onikiri::HitMissPredIF::Finished()Onikiri::LatPredResult::Scheduling::latencym_hmPredictor.

参照元 Onikiri::OpFinishEvent::Update().

00211 {
00212     if( !op->GetOpClass().IsLoad() ){
00213         return;
00214     }
00215 
00216     int latency = op->GetIssueState().executionLatency;
00217     const LatPredResult::Scheduling& predSched = op->GetLatPredRsult().Get(0);
00218     bool hitMissOfLV1      = latency == predSched.latency ? true : false;
00219     m_hmPredictor->Finished( op, hitMissOfLV1 );
00220 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

HitMissPredIF* Onikiri::LatPred::GetHitMissPred (  )  [inline]

LatPred.h87 行で定義されています。

参照先 m_hmPredictor.

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

00087 { return m_hmPredictor; }

Here is the caller graph for this function:

void LatPred::Initialize ( InitPhase  phase  ) 

LatPred.cpp67 行で定義されています。

参照先 Onikiri::PhysicalResourceNode::CheckNodeInitialized()Onikiri::PhysicalResourceNode::INIT_POST_CONNECTIONOnikiri::PhysicalResourceNode::INIT_PRE_CONNECTIONOnikiri::ParamExchange::LoadParam()m_execLatencyInfom_hmPredictor.

00068 {
00069     if(phase == INIT_PRE_CONNECTION){
00070         LoadParam();
00071     }
00072     else if(phase == INIT_POST_CONNECTION){
00073         CheckNodeInitialized( "execLatencyInfo", m_execLatencyInfo );
00074         CheckNodeInitialized( "hmPredictor", m_hmPredictor );
00075     }
00076 }

関数の呼び出しグラフ:

void LatPred::Predict ( OpIterator  op  ) 

LatPred.cpp81 行で定義されています。

参照先 ASSERTOnikiri::HookType::HOOK_AFTEROnikiri::HookType::HOOK_AROUNDOnikiri::HookType::HOOK_BEFOREOnikiri::OpClass::IsLoad()m_hmPredictorOnikiri::LatPredResult::MAX_COUNTOnikiri::HitMissPredIF::Predict()s_latencyPredictionHookOnikiri::LatPredResult::Set()Onikiri::LatPredResult::SetCount().

参照元 Onikiri::Renamer::Steer().

00082 {
00083     const OpClass& opClass = op->GetOpClass();
00084 
00085     LatPredResult result;
00086 
00087     s_latencyPredictionHook.Trigger(op, this, HookType::HOOK_BEFORE);
00088 
00089     if( !s_latencyPredictionHook.HasAround() ) {
00090         // {
00091         // Load/store hit miss prediction
00092         // CeV\XPW[Oft@CQ
00093         ExecUnitIF* execUnit = op->GetExecUnit();
00094         int latencyCount = execUnit->GetLatencyCount(opClass);
00095         
00096         if( opClass.IsLoad() ){
00097 
00098             static const int MAX_PRED_LEVEL = LatPredResult::MAX_COUNT;
00099             ASSERT( latencyCount <= MAX_PRED_LEVEL, "Make MAX_PRED_LEVEL large enough." );
00100             result.SetCount( latencyCount ); 
00101 
00102             // Get latencies
00103             int latencies[ MAX_PRED_LEVEL ];
00104             for( int i = 0; i < latencyCount; ++i ){
00105                 latencies[i] = execUnit->GetLatency( opClass, i );
00106             }
00107             
00108             // L1 prediction
00109             bool lv1Hit = m_hmPredictor->Predict( op );
00110             result.Set( 0, latencies[0], lv1Hit );
00111             
00112             // Issue latency
00113             int issueLatency = op->GetScheduler()->GetIssueLatency();
00114 
00115             // Lv2 & higher caches are predicted as always hit.
00116             bool prevLevelWokeup = lv1Hit;
00117             for( int i = 1; i < latencyCount; ++i ){
00118 
00119                 // 0  1  2  3  4  5  6  7  8                  
00120                 // SC IS IS IS IS L1 L2 L2 L2
00121                 //             SC IS IS IS IS EX
00122                 //                ^^ L1 miss detected point
00123                 //                   SC IS IS IS IS EX
00124                 // detected     : 1(SC) + 4(IS) + 1(L1)
00125                 // second issue: 1(SC) + L2(3)
00126                 // second issue - detected = L2 - IS - L1
00127 
00128                 int wakeupTime = latencies[i];
00129                 if( prevLevelWokeup ){
00130                     int detectTime = issueLatency + latencies[i - 1] + 1 + 1;// + rescheduling + select
00131                     if( wakeupTime < detectTime ){
00132                         wakeupTime = detectTime;
00133                     }
00134                 }
00135                 result.Set( i, wakeupTime, true );
00136                 prevLevelWokeup = true;
00137             }
00138 
00139             // A last level memory is predicted as always miss and does not wakeup.
00140             if( latencyCount > 1 ){
00141                 result.Set( 
00142                     latencyCount - 1, 
00143                     latencies[latencyCount - 1], 
00144                     false 
00145                 );
00146             }
00147 
00148 
00149         }   // if(opClass.IsLoad()) {
00150         else{
00151             
00152             ASSERT( latencyCount == 1, "A variable latency is not supported except case of Load." );
00153 
00154             int latency = execUnit->GetLatency( opClass, 0 );
00155 
00156             result.SetCount( 1 );
00157             result.Set( 0, latency, true );
00158         }
00159 
00160         op->SetLatPredRsult( result );
00161     }
00162     else {
00163         s_latencyPredictionHook.Trigger(op, this, HookType::HOOK_AROUND);
00164     }
00165 
00166     s_latencyPredictionHook.Trigger(op, this, HookType::HOOK_AFTER);
00167 
00168 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

m_numMiss Onikiri::LatPred::RESULT_RATE_SUM_ENTRY ( "@PredictionHitRatePredToHit"  ,
m_numLoadHitPredToHit  ,
m_numLoadHitPredToHit  ,
m_numLoadMissPredToHit   
)


変数

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

LatPred.h97 行で定義されています。

ExecLatencyInfo* Onikiri::LatPred::m_execLatencyInfo [protected]

LatPred.h93 行で定義されています。

参照元 Initialize().

HitMissPredIF* Onikiri::LatPred::m_hmPredictor [protected]

LatPred.h95 行で定義されています。

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

u64 Onikiri::LatPred::m_numHit [protected]

LatPred.h99 行で定義されています。

Onikiri::LatPred::m_numHit

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

参照元 Commit().

u64 Onikiri::LatPred::m_numLoadHitPredToHit [protected]

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

参照元 Commit().

u64 Onikiri::LatPred::m_numLoadHitPredToMiss [protected]

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

m_numMiss Onikiri::LatPred::m_numLoadHitPredToMiss

LatPred.h71 行で定義されています。

参照元 Commit().

u64 Onikiri::LatPred::m_numLoadMissPredToHit [protected]

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

参照元 Commit().

u64 Onikiri::LatPred::m_numLoadMissPredToMiss [protected]

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

m_numMiss Onikiri::LatPred::m_numLoadMissPredToMiss

LatPred.h71 行で定義されています。

参照元 Commit().

u64 Onikiri::LatPred::m_numMiss [protected]

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

参照元 Commit().

HookPoint< LatPred > Onikiri::LatPred::s_latencyPredictionHook [static]

LatPred.h89 行で定義されています。

参照元 Predict().


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