クラス Onikiri::CacheMissedAccessList

#include <CacheMissedAccessList.h>

Onikiri::CacheMissedAccessListのコラボレーション図

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

Public 型

typedef CacheAccess Access
typedef pool_list< AccessStateAccessList
typedef AccessList::iterator AccessListIterator
typedef CacheAccessEventType EventType
typedef boost::array< CacheAccessNotifieeIF *,
MAX_NOTIFIEE_COUNT
NotifieeArray
typedef CacheAccessResult Result

Public メソッド

void Add (const Access &access, const Result &result, CacheAccessNotifieeIF *notifiees[], int notifieesCount, const CacheAccessNotificationParam &notification)
 CacheMissedAccessList (Pipeline *pipe, int offsetBitSize)
Result Find (const Addr &addr)
size_t GetSize () const
void Remove (const CacheAccess &access, AccessListIterator target)
void SetEnabled (bool enabled)
virtual ~CacheMissedAccessList ()

Static Public 変数

static const size_t MAX_MISSED_ACCESS_LIST_LIMIT = 1024
static const size_t MAX_NOTIFIEE_COUNT = 4

Protected メソッド

void AddList (const CacheAccess &access, const AccessState &state, int latency)
AccessListIterator FindAccess (const Addr &addr)
Addr MaskLineOffset (Addr addr)

Protected 変数

u64 m_currentAccessID
bool m_enabled
AccessList m_list
int m_offsetBitSize
Pipelinem_pipe

構成

struct  AccessState

説明

CacheMissedAccessList.h45 行で定義されています。


型定義

typedef CacheAccess Onikiri::CacheMissedAccessList::Access

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

typedef pool_list< AccessState > Onikiri::CacheMissedAccessList::AccessList

CacheMissedAccessList.h82 行で定義されています。

typedef AccessList::iterator Onikiri::CacheMissedAccessList::AccessListIterator

CacheMissedAccessList.h83 行で定義されています。

typedef CacheAccessEventType Onikiri::CacheMissedAccessList::EventType

CacheMissedAccessList.h51 行で定義されています。

typedef boost::array<CacheAccessNotifieeIF*, MAX_NOTIFIEE_COUNT> Onikiri::CacheMissedAccessList::NotifieeArray

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

typedef CacheAccessResult Onikiri::CacheMissedAccessList::Result

CacheMissedAccessList.h50 行で定義されています。


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

CacheMissedAccessList::CacheMissedAccessList ( Pipeline pipe,
int  offsetBitSize 
)

CacheMissedAccessList.cpp46 行で定義されています。

00049   :
00050     m_enabled( false ),
00051     m_currentAccessID( 0 ),
00052     m_pipe( pipe ),
00053     m_offsetBitSize( offsetBitSize )
00054 {
00055 }

CacheMissedAccessList::~CacheMissedAccessList (  )  [virtual]

CacheMissedAccessList.cpp57 行で定義されています。

00058 {
00059 }


関数

void CacheMissedAccessList::Add ( const Access access,
const Result result,
CacheAccessNotifieeIF notifiees[],
int  notifieesCount,
const CacheAccessNotificationParam notification 
)

CacheMissedAccessList.cpp134 行で定義されています。

参照先 Onikiri::CacheMissedAccessList::AccessState::accessAddList()Onikiri::MemAccess::addressASSERTOnikiri::CacheMissedAccessList::AccessState::endTimeFindAccess()Onikiri::TimeWheelBase::GetNow()Onikiri::CacheMissedAccessList::AccessState::idOnikiri::CacheAccess::IsWirte()Onikiri::CacheAccessResult::latencyOnikiri::CacheMissedAccessList::AccessState::linkm_currentAccessIDm_enabledm_listm_pipeMaskLineOffset()Onikiri::CacheMissedAccessList::AccessState::notificationOnikiri::CacheMissedAccessList::AccessState::notifieesOnikiri::CacheMissedAccessList::AccessState::notifieesCountOnikiri::CacheMissedAccessList::AccessState::startTime.

参照元 Onikiri::Cache::AddToMissedAccessList().

00140  {
00141     ASSERT( !access.IsWirte(), "A write access is pushed to CacheMissedAccessList." );
00142 
00143     if( !m_enabled ){
00144         // Notify access finish.
00145         for( int i = 0; i < notifieesCount; i++ ){
00146             notifiees[i]->AccessFinished( access, notification );
00147         }
00148         return;
00149     }
00150 
00151     Addr addr = access.address;
00152     int  latency = result.latency;
00153     s64  now = m_pipe->GetNow();
00154         
00155     CacheMissedAccessList::AccessListIterator 
00156         foundAccess = FindAccess( addr );
00157 
00158     // A link of a link is forbidden.
00159     if( foundAccess != m_list.end() && !foundAccess->link ){
00160         // Add a link to the found predecessor access.
00161         AccessState state = *foundAccess;
00162         state.notification = notification;
00163         state.notifieesCount = notifieesCount;
00164         for( int i = 0; i < notifieesCount; i++ ){
00165             state.notifiees[i] = notifiees[i];
00166         }
00167         state.link = true;
00168         state.id = m_currentAccessID;
00169         int latency = (int)(state.endTime - now);
00170         AddList( access, state, latency );
00171         
00172     }
00173     else{
00174         AccessState state;
00175         state.access    = access;
00176         state.id        = m_currentAccessID;
00177         state.startTime = now;
00178         state.endTime   = now + latency;
00179         state.link      = false;
00180         state.notifieesCount = notifieesCount;
00181         for( int i = 0; i < notifieesCount; i++ ){
00182             state.notifiees[i] = notifiees[i];
00183         }
00184         state.notification = notification;
00185         state.access.address = MaskLineOffset( state.access.address );
00186         AddList( access, state, latency );
00187     } 
00188 
00189 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void CacheMissedAccessList::AddList ( const CacheAccess access,
const AccessState state,
int  latency 
) [protected]

CacheMissedAccessList.cpp113 行で定義されています。

参照先 Onikiri::TimeWheelBase::AddEvent()Onikiri::PooledIntrusivePtrObject< T, PtrT >::Construct()m_currentAccessIDm_listm_pipeMAX_MISSED_ACCESS_LIST_LIMITTHROW_RUNTIME_ERROR.

参照元 Add().

00115  {
00116     m_currentAccessID++;
00117     m_list.push_back( state );
00118 
00119     if( m_list.size() >= MAX_MISSED_ACCESS_LIST_LIMIT ){
00120         THROW_RUNTIME_ERROR( "The size of the missed access list exceeds a limit." );
00121     }
00122 
00123     // An event of memory access end time.
00124     AccessListIterator stateIterator = m_list.end(); 
00125     stateIterator--;
00126     EventPtr evnt(
00127         MissedAccessRearchEvent::Construct( access, stateIterator, this )
00128     );
00129     m_pipe->AddEvent( evnt, latency ); 
00130 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

CacheMissedAccessList::Result CacheMissedAccessList::Find ( const Addr addr  ) 

CacheMissedAccessList.cpp92 行で定義されています。

参照先 FindAccess()Onikiri::TimeWheelBase::GetNow()m_enabledm_listm_pipeOnikiri::CacheAccessResult::ST_HITOnikiri::CacheAccessResult::ST_MISSTHROW_RUNTIME_ERROR.

参照元 Onikiri::Cache::ReadBody()Onikiri::Cache::WriteBody().

00093 {
00094     if( !m_enabled ){
00095         return Result( 0, Result::ST_MISS );
00096     }
00097 
00098     AccessListIterator e = FindAccess( addr );
00099     if( e == m_list.end() ){
00100         return Result( 0, Result::ST_MISS );
00101     }
00102 
00103     // hit
00104     int leftCycles = (int)e->endTime - (int)m_pipe->GetNow();
00105     if( leftCycles < 0 ){
00106         THROW_RUNTIME_ERROR( "Invalid Pending Access." );
00107     }
00108 
00109     return Result( leftCycles, Result::ST_HIT );
00110 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

CacheMissedAccessList::AccessListIterator CacheMissedAccessList::FindAccess ( const Addr addr  )  [protected]

CacheMissedAccessList.cpp80 行で定義されています。

参照先 m_listMaskLineOffset().

参照元 Add()Find().

00081 {
00082     AccessListIterator i = m_list.begin();
00083     Addr maskedAddr = MaskLineOffset( addr );
00084     while( i != m_list.end() && i->access.address != maskedAddr ){
00085         ++i;
00086     }
00087     return i;
00088 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

size_t CacheMissedAccessList::GetSize (  )  const

CacheMissedAccessList.cpp213 行で定義されています。

参照先 m_list.

参照元 Onikiri::Cache::IsStallRequired().

00214 {
00215     return m_list.size();
00216 }

Here is the caller graph for this function:

Addr CacheMissedAccessList::MaskLineOffset ( Addr  addr  )  [protected]

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

参照先 Onikiri::Addr::addressm_offsetBitSize.

参照元 Add()FindAccess().

00068 {
00069     addr.address &= 
00070         shttl::mask( 
00071             m_offsetBitSize, 
00072             64 - m_offsetBitSize 
00073         );
00074     return addr;
00075 }

Here is the caller graph for this function:

void CacheMissedAccessList::Remove ( const CacheAccess access,
AccessListIterator  target 
)

CacheMissedAccessList.cpp193 行で定義されています。

参照先 ASSERTm_enabledm_list.

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

00195  {
00196     
00197 
00198     ASSERT( m_enabled );
00199 
00200     // Remove from the list.
00201     CacheAccessNotificationParam notification = target->notification;
00202     NotifieeArray notifiees = target->notifiees;
00203     int notifieesCount = target->notifieesCount;
00204     m_list.erase( target );
00205     
00206     // Notify access finish.
00207     for( int i = 0; i < notifieesCount; ++i ){
00208         notifiees[i]->AccessFinished( access, notification );
00209     }
00210 }

Here is the caller graph for this function:

void CacheMissedAccessList::SetEnabled ( bool  enabled  ) 

CacheMissedAccessList.cpp61 行で定義されています。

参照先 m_enabled.

参照元 Onikiri::Cache::ChangeSimulationMode().

00062 {
00063     m_enabled = enabled;
00064 }

Here is the caller graph for this function:


変数

u64 Onikiri::CacheMissedAccessList::m_currentAccessID [protected]

CacheMissedAccessList.h114 行で定義されています。

参照元 Add()AddList().

bool Onikiri::CacheMissedAccessList::m_enabled [protected]

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

参照元 Add()Find()Remove()SetEnabled().

AccessList Onikiri::CacheMissedAccessList::m_list [protected]

CacheMissedAccessList.h117 行で定義されています。

参照元 Add()AddList()Find()FindAccess()GetSize()Remove().

int Onikiri::CacheMissedAccessList::m_offsetBitSize [protected]

CacheMissedAccessList.h123 行で定義されています。

参照元 MaskLineOffset().

Pipeline* Onikiri::CacheMissedAccessList::m_pipe [protected]

CacheMissedAccessList.h120 行で定義されています。

参照元 Add()AddList()Find().

const size_t Onikiri::CacheMissedAccessList::MAX_MISSED_ACCESS_LIST_LIMIT = 1024 [static]

CacheMissedAccessList.h53 行で定義されています。

参照元 AddList().

const size_t Onikiri::CacheMissedAccessList::MAX_NOTIFIEE_COUNT = 4 [static]

CacheMissedAccessList.h54 行で定義されています。


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