#include <PrefetcherBase.h>
Onikiri::PrefetcherBaseに対する継承グラフ
Public メソッド | |
virtual void | AccessFinished (const CacheAccess &access, const CacheAccessNotificationParam ¶m) |
BEGIN_PARAM_PATH (GetResultPath()) PARAM_ENTRY("@NumPrefetch" | |
BEGIN_PARAM_PATH (GetParamPath()) PARAM_ENTRY("@EnablePrefetch" | |
virtual void | ChangeSimulationMode (SimulationMode mode) |
virtual void | Initialize (InitPhase phase) |
virtual void | OnCacheAccess (Cache *cache, const CacheAccess &access, bool hit)=0 |
virtual void | OnCacheInvalidation (Cache *cache, CacheHookParam *param) |
virtual void | OnCacheRead (Cache *cache, CacheHookParam *param) |
virtual void | OnCacheTableUpdate (Cache *cache, CacheHookParam *param) |
virtual void | OnCacheWrite (Cache *cache, CacheHookParam *param) |
PARAM_ENTRY ("@NumEffectivePrefetchedLine", m_numEffectivePrefetchedReplacedLine) | |
PARAM_ENTRY ("@NumPrefetchedReplacedLine", m_numPrefetchedReplacedLine) | |
PARAM_ENTRY ("@NumReplacedLine", m_numReplacedLine) | |
PARAM_ENTRY ("@NumWriteMissAccess", m_numWriteMissAccess) | |
PARAM_ENTRY ("@NumWriteHitAccess", m_numWriteHitAccess) | |
PARAM_ENTRY ("@NumReadMissAccess", m_numReadMissAccess) | |
PARAM_ENTRY ("@NumReadHitAccess", m_numReadHitAccess) | |
PARAM_ENTRY ("@OffsetBitSize", m_lineBitSize) | |
PARAM_ENTRY ("@Name", m_name) | |
PrefetcherBase () | |
RESULT_RATE_ENTRY ("@NumAccuracy", m_numEffectivePrefetchedReplacedLine, m_numPrefetchedReplacedLine) | |
virtual | ~PrefetcherBase () |
Public 変数 | |
m_enabled | |
m_numPrefetch | |
Protected 型 | |
typedef pool_list< PrefetchAccess > | AccessList |
Protected メソッド | |
AccessList::iterator | FindPrefetching (const Addr &addr) |
virtual void | IncrementPrefetchNum () |
bool | IsAccessFromThisPrefetcher (CacheHookParam *param) const |
bool | IsPrefetch (const CacheAccess &access) |
u64 | MaskLineOffset (u64 addr) |
void | Prefetch (const CacheAccess &access) |
virtual void | UpdateCacheAccessStat (const CacheAccess &access, bool hit) |
Protected 変数 | |
AccessList | m_accessList |
bool | m_enabled |
CacheExtraStateTable< ExLineState > | m_exLineState |
int | m_lineBitSize |
int | m_lineSize |
SimulationMode | m_mode |
String | m_name |
s64 | m_numEffectivePrefetchedReplacedLine |
s64 | m_numPrefetch |
s64 | m_numPrefetchedReplacedLine |
s64 | m_numReadHitAccess |
s64 | m_numReadMissAccess |
s64 | m_numReplacedLine |
s64 | m_numWriteHitAccess |
s64 | m_numWriteMissAccess |
Cache * | m_prefetchTarget |
Static Protected 変数 | |
static const size_t | MAX_INFLIGHT_PREFETCH_ACCESSES = 256 |
構成 | |
struct | ExLineState |
struct | PrefetchAccess |
PrefetcherBase.h の 49 行で定義されています。
typedef pool_list< PrefetchAccess > Onikiri::PrefetcherBase::AccessList [protected] |
PrefetcherBase.h の 179 行で定義されています。
PrefetcherBase::PrefetcherBase | ( | ) |
PrefetcherBase.cpp の 39 行で定義されています。
参照先 m_enabled・m_lineBitSize・m_lineSize・m_mode・m_numEffectivePrefetchedReplacedLine・m_numPrefetch・m_numPrefetchedReplacedLine・m_numReadHitAccess・m_numReadMissAccess・m_numReplacedLine・m_numWriteHitAccess・m_numWriteMissAccess・m_prefetchTarget・Onikiri::PhysicalResourceNode::SM_EMULATION.
00040 { 00041 m_prefetchTarget = NULL; 00042 00043 m_enabled = false; 00044 00045 m_lineSize = 0; 00046 m_lineBitSize = 0; 00047 00048 m_numPrefetch = 0; 00049 m_numReadHitAccess = 0; 00050 m_numReadMissAccess = 0; 00051 m_numWriteHitAccess = 0; 00052 m_numWriteMissAccess = 0; 00053 00054 m_numReplacedLine = 0; 00055 m_numPrefetchedReplacedLine = 0; 00056 m_numEffectivePrefetchedReplacedLine = 0; 00057 00058 m_mode = SM_EMULATION; 00059 00060 }
PrefetcherBase::~PrefetcherBase | ( | ) | [virtual] |
void PrefetcherBase::AccessFinished | ( | const CacheAccess & | access, | |
const CacheAccessNotificationParam & | param | |||
) | [virtual] |
Onikiri::CacheAccessNotifieeIFを実装しています。
PrefetcherBase.cpp の 279 行で定義されています。
参照先 Onikiri::MemAccess::address・ASSERT・Onikiri::CAET_FILL_FROM_MAL_FINISHED・Onikiri::CAET_FILL_FROM_NEXT_CACHE_FINISHED・Onikiri::CAET_READ_ACCESS_FINISHED・FindPrefetching()・m_accessList・m_mode・Onikiri::CacheAccessNotificationParam::result・Onikiri::PhysicalResourceNode::SM_SIMULATION・Onikiri::CacheAccessResult::ST_MISS・Onikiri::CacheAccessResult::ST_NOT_ACCESSED・Onikiri::CacheAccessResult::state・Onikiri::CacheAccessNotificationParam::type.
00282 { 00283 if( m_mode != SM_SIMULATION ){ 00284 return; 00285 } 00286 00287 ASSERT( 00288 param.result.state != CacheAccessResult::ST_NOT_ACCESSED, 00289 "Not initialized notification is reached." 00290 ); 00291 00292 switch( param.type ){ 00293 00294 case CAET_FILL_FROM_NEXT_CACHE_FINISHED: 00295 case CAET_FILL_FROM_MAL_FINISHED: 00296 case CAET_READ_ACCESS_FINISHED: 00297 00298 if( param.result.state == CacheAccessResult::ST_MISS ){ 00299 AccessList::iterator prefetch = FindPrefetching( access.address ); 00300 if( prefetch != m_accessList.end() ){ 00301 m_accessList.erase( prefetch ); 00302 } 00303 else{ 00304 ASSERT( 0, "An unknown prefetch access is finished.") 00305 } 00306 } 00307 break; 00308 00309 default: 00310 ASSERT( 0, "A write access must not be notified.." ); 00311 break; 00312 } 00313 }
関数の呼び出しグラフ:
Onikiri::PrefetcherBase::BEGIN_PARAM_PATH | ( | GetResultPath() | ) |
Onikiri::PrefetcherBase::BEGIN_PARAM_PATH | ( | GetParamPath() | ) |
void PrefetcherBase::ChangeSimulationMode | ( | SimulationMode | mode | ) | [virtual] |
PrefetcherBase::AccessList::iterator PrefetcherBase::FindPrefetching | ( | const Addr & | addr | ) | [protected] |
PrefetcherBase.cpp の 131 行で定義されています。
参照先 Onikiri::Addr::address・m_accessList.
参照元 AccessFinished()・OnCacheInvalidation()・OnCacheRead()・OnCacheTableUpdate().
00132 { 00133 for( pool_list< PrefetchAccess >::iterator i = m_accessList.begin(); 00134 i != m_accessList.end(); 00135 ++i 00136 ){ 00137 if( address == i->address){ 00138 return i; 00139 } 00140 } 00141 00142 return m_accessList.end(); 00143 }
Here is the caller graph for this function:
void PrefetcherBase::IncrementPrefetchNum | ( | ) | [protected, virtual] |
PrefetcherBase.cpp の 111 行で定義されています。
参照先 m_numPrefetch.
参照元 Onikiri::StridePrefetcher::OnCacheAccess()・Onikiri::StreamPrefetcher::Prefetch().
00112 { 00113 m_numPrefetch++; 00114 }
Here is the caller graph for this function:
void PrefetcherBase::Initialize | ( | InitPhase | phase | ) | [virtual] |
Onikiri::SamplePrefetcher・Onikiri::StreamPrefetcher・Onikiri::StridePrefetcherで再定義されています。
PrefetcherBase.cpp の 67 行で定義されています。
参照先 Onikiri::PhysicalResourceNode::INIT_POST_CONNECTION・Onikiri::PhysicalResourceNode::INIT_PRE_CONNECTION・Onikiri::ParamExchange::LoadParam()・m_exLineState・m_lineBitSize・m_lineSize・m_prefetchTarget.
参照元 Onikiri::StridePrefetcher::Initialize()・Onikiri::StreamPrefetcher::Initialize()・Onikiri::SamplePrefetcher::Initialize().
00068 { 00069 if(phase == INIT_PRE_CONNECTION){ 00070 00071 LoadParam(); 00072 00073 m_lineSize = 1 << m_lineBitSize; 00074 } 00075 else if(phase == INIT_POST_CONNECTION){ 00076 m_exLineState.Resize( m_prefetchTarget ); 00077 } 00078 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
bool PrefetcherBase::IsAccessFromThisPrefetcher | ( | CacheHookParam * | param | ) | const [protected] |
PrefetcherBase.cpp の 316 行で定義されています。
参照先 Onikiri::CacheHookParam::notifiee.
参照元 OnCacheRead()・OnCacheWrite().
00317 { 00318 if( !param->notifiee ){ 00319 return false; 00320 } 00321 00322 return param->notifiee == static_cast<const CacheAccessNotifieeIF*>(this); 00323 }
Here is the caller graph for this function:
bool PrefetcherBase::IsPrefetch | ( | const CacheAccess & | access | ) | [protected] |
PrefetcherBase.cpp の 123 行で定義されています。
参照先 Onikiri::CacheAccess::OT_PREFETCH・Onikiri::CacheAccess::type.
参照元 OnCacheRead()・OnCacheTableUpdate()・OnCacheWrite().
00124 { 00125 return access.type == CacheAccess::OT_PREFETCH; 00126 }
Here is the caller graph for this function:
PrefetcherBase.cpp の 117 行で定義されています。
参照先 m_lineBitSize.
参照元 Onikiri::StreamPrefetcher::AllocateStream()・Onikiri::StreamPrefetcher::IsInWindow()・Prefetch()・Onikiri::StreamPrefetcher::UpdateMonitorStream()・Onikiri::StreamPrefetcher::UpdateTrainingStream().
00118 { 00119 return addr & ~((1 << m_lineBitSize) - 1); 00120 }
Here is the caller graph for this function:
virtual void Onikiri::PrefetcherBase::OnCacheAccess | ( | Cache * | cache, | |
const CacheAccess & | access, | |||
bool | hit | |||
) | [pure virtual] |
Onikiri::SamplePrefetcher・Onikiri::StreamPrefetcher・Onikiri::StridePrefetcherで実装されています。
参照元 OnCacheRead()・OnCacheWrite().
Here is the caller graph for this function:
void PrefetcherBase::OnCacheInvalidation | ( | Cache * | cache, | |
CacheHookParam * | param | |||
) | [virtual] |
Onikiri::PrefetcherIFを実装しています。
PrefetcherBase.cpp の 201 行で定義されています。
参照先 Onikiri::CacheHookParam::address・shttl::setassoc_table< PairType, Hasher, Replacer, Strage >::end()・FindPrefetching()・Onikiri::CacheHookParam::line・m_accessList・m_enabled・m_exLineState・Onikiri::CacheHookParam::table.
00202 { 00203 if( !m_enabled ) 00204 return; 00205 00206 if( param->line != param->table->end() ){ 00207 m_exLineState[ param->line ].valid = false; 00208 } 00209 00210 AccessList::iterator prefetch = FindPrefetching( *param->address ); 00211 if( prefetch != m_accessList.end() ){ 00212 prefetch->invalidated = true; 00213 } 00214 }
関数の呼び出しグラフ:
void PrefetcherBase::OnCacheRead | ( | Cache * | cache, | |
CacheHookParam * | param | |||
) | [virtual] |
Onikiri::PrefetcherIFを実装しています。
PrefetcherBase.cpp の 147 行で定義されています。
参照先 Onikiri::CacheHookParam::access・Onikiri::MemAccess::address・ASSERT・shttl::setassoc_table< PairType, Hasher, Replacer, Strage >::end()・FindPrefetching()・IsAccessFromThisPrefetcher()・IsPrefetch()・Onikiri::CacheHookParam::line・m_accessList・m_enabled・m_exLineState・OnCacheAccess()・Onikiri::CacheHookParam::result・Onikiri::CacheAccessResult::ST_MISS・Onikiri::CacheAccessResult::state・Onikiri::CacheHookParam::table・UpdateCacheAccessStat().
00148 { 00149 if( !m_enabled ) 00150 return; 00151 00152 if( !IsPrefetch( *param->access ) || !IsAccessFromThisPrefetcher( param ) ){ 00153 bool hit = param->result.state != CacheAccessResult::ST_MISS; 00154 OnCacheAccess( 00155 cache, 00156 *param->access, 00157 hit 00158 ); 00159 00160 if( param->line != param->table->end() ){ 00161 ExLineState* state = &m_exLineState[ param->line ]; 00162 state->accessed = true; 00163 } 00164 00165 ASSERT( param->access ); 00166 AccessList::iterator prefetch = FindPrefetching( param->access->address ); 00167 if( prefetch != m_accessList.end() ){ 00168 prefetch->accessdCount++; 00169 } 00170 00171 // Update statistics about cache accesses. 00172 UpdateCacheAccessStat( *param->access, hit ); 00173 } 00174 }
関数の呼び出しグラフ:
void PrefetcherBase::OnCacheTableUpdate | ( | Cache * | cache, | |
CacheHookParam * | param | |||
) | [virtual] |
Onikiri::PrefetcherIFを実装しています。
PrefetcherBase.cpp の 217 行で定義されています。
参照先 Onikiri::CacheHookParam::access・Onikiri::PrefetcherBase::ExLineState::accessed・Onikiri::MemAccess::address・ASSERT・FindPrefetching()・IsPrefetch()・Onikiri::CacheHookParam::line・m_accessList・m_enabled・m_exLineState・m_numEffectivePrefetchedReplacedLine・m_numPrefetchedReplacedLine・m_numReplacedLine・Onikiri::PrefetcherBase::ExLineState::prefetched・Onikiri::CacheHookParam::replaced・Onikiri::PrefetcherBase::ExLineState::valid.
00218 { 00219 if( !m_enabled ) 00220 return; 00221 00222 ExLineState* state = &m_exLineState[ param->line ]; 00223 00224 if( param->replaced ){ 00225 m_numReplacedLine++; 00226 00227 if( state->valid && state->prefetched ){ 00228 m_numPrefetchedReplacedLine++; 00229 if( state->accessed ){ 00230 m_numEffectivePrefetchedReplacedLine++; 00231 } 00232 } 00233 00234 } 00235 00236 00237 state->valid = true; 00238 if( IsPrefetch( *param->access ) ){ 00239 state->prefetched = true; 00240 state->accessed = false; 00241 ASSERT( param->access ); 00242 AccessList::iterator prefetch = FindPrefetching( param->access->address ); 00243 if( prefetch != m_accessList.end() && prefetch->accessdCount > 0 ){ 00244 state->accessed = true; 00245 } 00246 } 00247 else{ 00248 state->prefetched = false; 00249 state->accessed = true; 00250 } 00251 }
関数の呼び出しグラフ:
void PrefetcherBase::OnCacheWrite | ( | Cache * | cache, | |
CacheHookParam * | param | |||
) | [virtual] |
Onikiri::PrefetcherIFを実装しています。
PrefetcherBase.cpp の 177 行で定義されています。
参照先 Onikiri::CacheHookParam::access・shttl::setassoc_table< PairType, Hasher, Replacer, Strage >::end()・IsAccessFromThisPrefetcher()・IsPrefetch()・Onikiri::CacheHookParam::line・m_enabled・m_exLineState・OnCacheAccess()・Onikiri::CacheHookParam::result・Onikiri::CacheAccessResult::ST_MISS・Onikiri::CacheAccessResult::state・Onikiri::CacheHookParam::table・UpdateCacheAccessStat().
00178 { 00179 if( !m_enabled ) 00180 return; 00181 00182 if( !IsPrefetch( *param->access ) || !IsAccessFromThisPrefetcher( param ) ){ 00183 bool hit = param->result.state != CacheAccessResult::ST_MISS; 00184 OnCacheAccess( 00185 cache, 00186 *param->access, 00187 hit 00188 ); 00189 00190 // Update statistics about cache accesses. 00191 UpdateCacheAccessStat( *param->access, hit ); 00192 00193 if( param->line != param->table->end() ){ 00194 ExLineState* state = &m_exLineState[ param->line ]; 00195 state->accessed = true; 00196 } 00197 } 00198 }
関数の呼び出しグラフ:
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumEffectivePrefetchedLine" | , | |
m_numEffectivePrefetchedReplacedLine | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumPrefetchedReplacedLine" | , | |
m_numPrefetchedReplacedLine | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumReplacedLine" | , | |
m_numReplacedLine | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumWriteMissAccess" | , | |
m_numWriteMissAccess | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumWriteHitAccess" | , | |
m_numWriteHitAccess | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumReadMissAccess" | , | |
m_numReadMissAccess | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@NumReadHitAccess" | , | |
m_numReadHitAccess | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@OffsetBitSize" | , | |
m_lineBitSize | ||||
) |
Onikiri::PrefetcherBase::PARAM_ENTRY | ( | "@Name" | , | |
m_name | ||||
) |
void PrefetcherBase::Prefetch | ( | const CacheAccess & | access | ) | [protected] |
PrefetcherBase.cpp の 254 行で定義されています。
参照先 Onikiri::Addr::address・Onikiri::MemAccess::address・m_accessList・m_mode・m_prefetchTarget・MaskLineOffset()・MAX_INFLIGHT_PREFETCH_ACCESSES・Onikiri::CacheAccess::OT_PREFETCH・Onikiri::Cache::Read()・Onikiri::PhysicalResourceNode::SM_SIMULATION・Onikiri::CacheAccessResult::ST_MISS・Onikiri::CacheAccessResult::state・THROW_RUNTIME_ERROR・Onikiri::CacheAccess::type.
参照元 Onikiri::StridePrefetcher::OnCacheAccess()・Onikiri::SamplePrefetcher::OnCacheAccess()・Onikiri::StreamPrefetcher::Prefetch().
00255 { 00256 CacheAccess prefetch = access; 00257 prefetch.type = CacheAccess::OT_PREFETCH; 00258 prefetch.address.address = MaskLineOffset( access.address.address ); 00259 00260 00261 AccessList::iterator current; 00262 if( m_mode == SM_SIMULATION ){ 00263 current = m_accessList.insert( m_accessList.end(), prefetch ); 00264 if( m_accessList.size() >= MAX_INFLIGHT_PREFETCH_ACCESSES ){ 00265 THROW_RUNTIME_ERROR( "The size of the prefetch access list exceeds a limit." ); 00266 } 00267 } 00268 00269 CacheAccessResult result = 00270 m_prefetchTarget->Read( prefetch, this ); 00271 00272 if( m_mode == SM_SIMULATION ){ 00273 if( result.state != CacheAccessResult::ST_MISS ){ 00274 m_accessList.erase( current ); 00275 } 00276 } 00277 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
Onikiri::PrefetcherBase::RESULT_RATE_ENTRY | ( | "@NumAccuracy" | , | |
m_numEffectivePrefetchedReplacedLine | , | |||
m_numPrefetchedReplacedLine | ||||
) |
void PrefetcherBase::UpdateCacheAccessStat | ( | const CacheAccess & | access, | |
bool | hit | |||
) | [protected, virtual] |
PrefetcherBase.cpp の 86 行で定義されています。
参照先 m_numReadHitAccess・m_numReadMissAccess・m_numWriteHitAccess・m_numWriteMissAccess・Onikiri::CacheAccess::OT_PREFETCH・Onikiri::CacheAccess::OT_READ・Onikiri::CacheAccess::OT_READ_FOR_WRITE_ALLOCATE・Onikiri::CacheAccess::OT_WRITE・Onikiri::CacheAccess::OT_WRITE_BACK・THROW_RUNTIME_ERROR・Onikiri::CacheAccess::type.
参照元 OnCacheRead()・OnCacheWrite().
00087 { 00088 switch( access.type ){ 00089 case CacheAccess::OT_READ: 00090 case CacheAccess::OT_PREFETCH: 00091 case CacheAccess::OT_READ_FOR_WRITE_ALLOCATE: 00092 if( hit ) 00093 m_numReadHitAccess++; 00094 else 00095 m_numReadMissAccess++; 00096 break; 00097 case CacheAccess::OT_WRITE: 00098 case CacheAccess::OT_WRITE_BACK: 00099 if( hit ) 00100 m_numWriteHitAccess++; 00101 else 00102 m_numWriteMissAccess++; 00103 break; 00104 default: 00105 THROW_RUNTIME_ERROR( "Invalid access." ); 00106 break; 00107 } 00108 }
Here is the caller graph for this function:
AccessList Onikiri::PrefetcherBase::m_accessList [protected] |
bool Onikiri::PrefetcherBase::m_enabled [protected] |
PrefetcherBase.h の 138 行で定義されています。
PrefetcherBase.h の 196 行で定義されています。
参照元 Initialize()・OnCacheInvalidation()・OnCacheRead()・OnCacheTableUpdate()・OnCacheWrite().
int Onikiri::PrefetcherBase::m_lineBitSize [protected] |
int Onikiri::PrefetcherBase::m_lineSize [protected] |
SimulationMode Onikiri::PrefetcherBase::m_mode [protected] |
PrefetcherBase.h の 163 行で定義されています。
参照元 AccessFinished()・ChangeSimulationMode()・Prefetch()・PrefetcherBase().
String Onikiri::PrefetcherBase::m_name [protected] |
PrefetcherBase.h の 132 行で定義されています。
s64 Onikiri::PrefetcherBase::m_numPrefetch [protected] |
PrefetcherBase.h の 145 行で定義されています。
s64 Onikiri::PrefetcherBase::m_numReadHitAccess [protected] |
s64 Onikiri::PrefetcherBase::m_numReadMissAccess [protected] |
s64 Onikiri::PrefetcherBase::m_numReplacedLine [protected] |
s64 Onikiri::PrefetcherBase::m_numWriteHitAccess [protected] |
s64 Onikiri::PrefetcherBase::m_numWriteMissAccess [protected] |
Cache* Onikiri::PrefetcherBase::m_prefetchTarget [protected] |
const size_t Onikiri::PrefetcherBase::MAX_INFLIGHT_PREFETCH_ACCESSES = 256 [static, protected] |