#include <LatPred.h>
Onikiri::LatPredに対する継承グラフ
Public メソッド | |
BEGIN_PARAM_MAP (GetResultPath()) RESULT_RATE_SUM_ENTRY("@PredictionHitRate" | |
void | Commit (OpIterator op) |
void | Finished (OpIterator op) |
HitMissPredIF * | GetHitMissPred () |
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< LatPred > | s_latencyPredictionHook |
Protected 変数 | |
Core * | m_core |
ExecLatencyInfo * | m_execLatencyInfo |
HitMissPredIF * | m_hmPredictor |
u64 | m_numHit |
u64 | m_numLoadHitPredToHit |
u64 | m_numLoadHitPredToMiss |
u64 | m_numLoadMissPredToHit |
u64 | m_numLoadMissPredToMiss |
u64 | m_numMiss |
LatPred::LatPred | ( | ) |
LatPred.cpp の 49 行で定義されています。
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.cpp の 62 行で定義されています。
参照先 Onikiri::PhysicalResourceNode::ReleaseParam().
00063 { 00064 ReleaseParam(); 00065 }
関数の呼び出しグラフ:
Onikiri::LatPred::BEGIN_PARAM_MAP | ( | GetResultPath() | ) |
void LatPred::Commit | ( | OpIterator | op | ) |
LatPred.cpp の 173 行で定義されています。
参照先 Onikiri::HitMissPredIF::Commit()・Onikiri::LatPredResult::Get()・Onikiri::LatPredResult::Scheduling::latency・m_hmPredictor・m_numHit・m_numLoadHitPredToHit・m_numLoadHitPredToMiss・m_numLoadMissPredToHit・m_numLoadMissPredToMiss・m_numMiss・Onikiri::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.cpp の 210 行で定義されています。
参照先 Onikiri::HitMissPredIF::Finished()・Onikiri::LatPredResult::Scheduling::latency・m_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] |
参照先 m_hmPredictor.
参照元 Onikiri::InorderSystem::Run().
00087 { return m_hmPredictor; }
Here is the caller graph for this function:
void LatPred::Initialize | ( | InitPhase | phase | ) |
LatPred.cpp の 67 行で定義されています。
参照先 Onikiri::PhysicalResourceNode::CheckNodeInitialized()・Onikiri::PhysicalResourceNode::INIT_POST_CONNECTION・Onikiri::PhysicalResourceNode::INIT_PRE_CONNECTION・Onikiri::ParamExchange::LoadParam()・m_execLatencyInfo・m_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.cpp の 81 行で定義されています。
参照先 ASSERT・Onikiri::HookType::HOOK_AFTER・Onikiri::HookType::HOOK_AROUND・Onikiri::HookType::HOOK_BEFORE・Onikiri::OpClass::IsLoad()・m_hmPredictor・Onikiri::LatPredResult::MAX_COUNT・Onikiri::HitMissPredIF::Predict()・s_latencyPredictionHook・Onikiri::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] |
ExecLatencyInfo* Onikiri::LatPred::m_execLatencyInfo [protected] |
HitMissPredIF* Onikiri::LatPred::m_hmPredictor [protected] |
u64 Onikiri::LatPred::m_numHit [protected] |
u64 Onikiri::LatPred::m_numLoadHitPredToHit [protected] |
u64 Onikiri::LatPred::m_numLoadHitPredToMiss [protected] |
u64 Onikiri::LatPred::m_numLoadMissPredToHit [protected] |
u64 Onikiri::LatPred::m_numLoadMissPredToMiss [protected] |
u64 Onikiri::LatPred::m_numMiss [protected] |