#include <MemExecUnit.h>
Onikiri::MemExecUnitに対する継承グラフ
Public メソッド | |
BEGIN_PARAM_PATH (GetParamPath()) MemExecUnit() | |
virtual void | Execute (OpIterator op) |
Cache * | GetCache () |
virtual int | GetLatency (const OpClass &opClass, int index) |
virtual int | GetLatencyCount (const OpClass &opClass) |
void | Initialize (InitPhase phase) |
virtual | ~MemExecUnit () |
Protected メソッド | |
int | GetExecutedLatency (OpIterator op) |
int | GetExecutedReadLatency (OpIterator op) |
int | GetExecutedWriteLatency (OpIterator op) |
OpIterator | GetProducerStore (OpIterator consumer) |
Protected 変数 | |
Cache * | m_cache |
int | m_cacheCount |
CacheSystem * | m_cacheSystem |
int | m_floatConversionLatency |
PhysicalResourceArray< MemOrderManager > | m_memOrderManager |
MemExecUnit.h の 48 行で定義されています。
MemExecUnit::~MemExecUnit | ( | ) | [virtual] |
MemExecUnit.cpp の 61 行で定義されています。
参照先 Onikiri::PhysicalResourceNode::ReleaseParam().
00062 { 00063 ReleaseParam(); 00064 }
関数の呼び出しグラフ:
Onikiri::MemExecUnit::BEGIN_PARAM_PATH | ( | GetParamPath() | ) |
Onikiri::ExecUnitBaseを再定義しています。
void MemExecUnit::Execute | ( | OpIterator | op | ) | [virtual] |
Onikiri::PipelinedExecUnitを再定義しています。
MemExecUnit.cpp の 87 行で定義されています。
参照先 Onikiri::ExecUnitBase::Execute()・GetExecutedLatency()・Onikiri::ExecUnitBase::RegisterEvents().
00088 { 00089 ExecUnitBase::Execute( op ); // Not PipelinedExecUnit 00090 RegisterEvents( op, GetExecutedLatency( op ) ); 00091 }
関数の呼び出しグラフ:
Cache* Onikiri::MemExecUnit::GetCache | ( | ) | [inline] |
int MemExecUnit::GetExecutedLatency | ( | OpIterator | op | ) | [protected] |
MemExecUnit.cpp の 94 行で定義されています。
参照先 GetExecutedReadLatency()・GetExecutedWriteLatency()・THROW_RUNTIME_ERROR.
参照元 Execute().
00095 { 00096 int latency = 0; 00097 00098 if(op->GetOpClass().IsLoad()) { 00099 latency = GetExecutedReadLatency(op); 00100 } else if(op->GetOpClass().IsStore()) { 00101 latency = GetExecutedWriteLatency(op); 00102 } else { 00103 THROW_RUNTIME_ERROR("Unknwon opclass."); 00104 } 00105 00106 return latency; 00107 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
int MemExecUnit::GetExecutedReadLatency | ( | OpIterator | op | ) | [protected] |
MemExecUnit.cpp の 113 行で定義されています。
参照先 GetLatency()・GetProducerStore()・Onikiri::OpIterator::IsNull()・m_cache・m_floatConversionLatency・Onikiri::CacheAccess::OT_READ・Onikiri::Cache::Read()・Onikiri::CacheAccessResult::ST_HIT・Onikiri::CacheAccessResult::ST_NOT_ACCESSED.
参照元 GetExecutedLatency().
00114 { 00115 int readLatency = 0; 00116 00117 // StoreBuffer AhXvs Store 00118 // cache ANZX 00119 OpIterator producer = GetProducerStore( op ); 00120 00121 // Only the first access is set to op, because the second or later cache 00122 // accesses are always partial hit and they are not useful for statistics. 00123 bool firstAccess = 00124 op->GetCacheAccessResult().state == CacheAccessResult::ST_NOT_ACCESSED; 00125 00126 if( !producer.IsNull() ) { 00127 readLatency = GetLatency( op->GetOpClass(), 0 ); 00128 00129 if( firstAccess ){ 00130 CacheAccessResult result( 0, CacheAccessResult::ST_HIT, NULL ); 00131 op->SetCacheAccessResult( result ); 00132 } 00133 } 00134 else { 00135 CacheAccess access( op->GetMemAccess(), op, CacheAccess::OT_READ ); 00136 CacheAccessResult result = m_cache->Read( access, NULL ); 00137 readLatency = result.latency; 00138 00139 if( firstAccess ){ 00140 op->SetCacheAccessResult( result ); 00141 } 00142 00143 // float Load CeV 00144 if( op->GetOpClass().IsFloat() ) { 00145 readLatency += m_floatConversionLatency; 00146 } 00147 } 00148 00149 return readLatency; 00150 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
int MemExecUnit::GetExecutedWriteLatency | ( | OpIterator | op | ) | [protected] |
MemExecUnit.cpp の 153 行で定義されています。
参照先 code・Onikiri::ExecLatencyInfo::GetLatency()・Onikiri::ExecUnitBase::m_execLatencyInfo.
参照元 GetExecutedLatency().
00154 { 00155 // StoreBuffer Write CeV( ISA K) 00156 int code = op->GetOpClass().GetCode(); 00157 int writeLatency = m_execLatencyInfo->GetLatency(code); 00158 00159 return writeLatency; 00160 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
int MemExecUnit::GetLatency | ( | const OpClass & | opClass, | |
int | index | |||
) | [virtual] |
Onikiri::ExecUnitBaseを再定義しています。
MemExecUnit.cpp の 176 行で定義されています。
参照先 ASSERT・Onikiri::OpClass::GetCode()・Onikiri::ExecLatencyInfo::GetLatency()・Onikiri::Cache::GetNextCache()・Onikiri::OpClass::IsFloat()・Onikiri::OpClass::IsLoad()・Onikiri::OpClass::IsMem()・Onikiri::OpClass::IsStore()・m_cache・Onikiri::ExecUnitBase::m_execLatencyInfo・m_floatConversionLatency.
00177 { 00178 ASSERT( opClass.IsMem(), "not mem op"); 00179 if( opClass.IsStore() ) { 00180 // store CeV ExecLatencyInfo 00181 return m_execLatencyInfo->GetLatency(opClass.GetCode()); 00182 } 00183 00184 int latency = 0; 00185 Cache* cache = m_cache; 00186 for(int i = 0; i <= index; ++i, cache = cache->GetNextCache()) { 00187 ASSERT(cache != 0, "cache not set.(index: %d)", index); 00188 latency += cache->GetStaticLatency(); 00189 } 00190 00191 if( opClass.IsFloat() && opClass.IsLoad() ) { 00192 latency += m_floatConversionLatency; 00193 } 00194 00195 return latency; 00196 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
int MemExecUnit::GetLatencyCount | ( | const OpClass & | opClass | ) | [virtual] |
Onikiri::ExecUnitBaseを再定義しています。
MemExecUnit.cpp の 163 行で定義されています。
参照先 ASSERT・Onikiri::OpClass::IsMem()・Onikiri::OpClass::IsStore()・m_cacheCount.
00164 { 00165 ASSERT(opClass.IsMem(), "not mem op"); 00166 if( opClass.IsStore() ) { 00167 // store CeV 00168 return 1; 00169 } 00170 00171 // load LbV\ 00172 return m_cacheCount; 00173 }
関数の呼び出しグラフ:
OpIterator MemExecUnit::GetProducerStore | ( | OpIterator | consumer | ) | [protected] |
MemExecUnit.cpp の 199 行で定義されています。
参照先 Onikiri::MemOrderManager::GetProducerStore().
00200 { 00201 MemOrderManager* memOrderManager = 00202 consumer->GetThread()->GetMemOrderManager(); 00203 00204 return 00205 memOrderManager->GetProducerStore( 00206 consumer, 00207 consumer->GetMemAccess() 00208 ); 00209 }
関数の呼び出しグラフ:
Here is the caller graph for this function:
void MemExecUnit::Initialize | ( | InitPhase | phase | ) | [virtual] |
Onikiri::ExecUnitBaseを再定義しています。
MemExecUnit.cpp の 66 行で定義されています。
参照先 Onikiri::PhysicalResourceNode::CheckNodeInitialized()・Onikiri::CacheSystem::GetFirstLevelDataCache()・Onikiri::Cache::GetNextCache()・Onikiri::PhysicalResourceNode::INIT_POST_CONNECTION・Onikiri::PhysicalResourceNode::INIT_PRE_CONNECTION・Onikiri::ExecUnitBase::Initialize()・m_cache・m_cacheCount・m_cacheSystem・m_memOrderManager.
00067 { 00068 if(phase == INIT_PRE_CONNECTION){ 00069 } 00070 else if(phase == INIT_POST_CONNECTION){ 00071 CheckNodeInitialized( "memOrderManager", m_memOrderManager ); 00072 CheckNodeInitialized( "cacheSystem", m_cacheSystem ); 00073 00074 // LbV 00075 m_cache = m_cacheSystem->GetFirstLevelDataCache(); 00076 m_cacheCount = 0; 00077 Cache* cache = m_cache; 00078 for(; cache != 0; cache = cache->GetNextCache(), ++m_cacheCount) {} 00079 } 00080 00081 PipelinedExecUnit::Initialize(phase); 00082 00083 }
関数の呼び出しグラフ:
Cache* Onikiri::MemExecUnit::m_cache [protected] |
int Onikiri::MemExecUnit::m_cacheCount [protected] |
CacheSystem* Onikiri::MemExecUnit::m_cacheSystem [protected] |
int Onikiri::MemExecUnit::m_floatConversionLatency [protected] |