事件队列1
在每个NVMObject中,有eventQueue和globalEventQueue
在nvmain_mem.cc的初始化init函数中,设置globalEventQueue和eventQueue
SetGlobalEventQueue( m_nvmainGlobalEventQueue );
SetEventQueue( m_nvmainEventQueue );
此外,二者均在SetParent函数中获得parent的queue(NVMObject.cpp)
void NVMObject::SetParent( NVMObject *p )
{
NVMObject_hook *hook = new NVMObject_hook( p );
parent = hook;
SetEventQueue( p->GetEventQueue( ) );
SetGlobalEventQueue( p->GetGlobalEventQueue( ) );
SetStats( p->GetStats( ) );
SetTagGenerator( p->GetTagGenerator( ) );
}
在nvmain_mem.cc中,gem5函数调用的均为globalEventQueue(如在nvmain_mem.cc的函数process,recvTimingReq,tick中等)
/* Setup child and parent modules. */
AddChild( m_nvmainPtr );
m_nvmainPtr->SetParent( this );
m_nvmainGlobalEventQueue->AddSystem( m_nvmainPtr, m_nvmainConfig );
m_nvmainPtr->SetConfig( m_nvmainConfig );
m_nvmainPtr为
m_nvmainPtr = new NVM::NVMain( );
即它的child是nvmain,后续都从nvmain开始;nvmain设置parent时,获取了parent的globalEventQueue和eventQueue;在AddSystem时,将parent的EventQueue设置为了这个globalEventQueue的EventQueue;所以nvmain_mem.cc中的globalEventQueue的eventQueues中就包含了nvmain_mem的EventQueue
void GlobalEventQueue::AddSystem( NVMain *subSystem, Config *config )
{
double subSystemFrequency = config->GetEnergy( "CLK" ) * 1000000.0;
EventQueue *queue = subSystem->GetEventQueue( );
assert( subSystemFrequency <= frequency );
/*
* The CLK value in the config file is the frequency this subsystem should run at.
* We aren't doing and checks here to make sure the input side (i.e. CPUFreq) is
* corrent since we don't know what it should be.
*/
eventQueues.insert( std::pair<EventQueue*, double>(queue, subSystemFrequency) );
queue->SetFrequency( subSystemFrequency );
std::cout << "NVMain: GlobalEventQueue: Added a memory subsystem running at "
<< config->GetEnergy( "CLK" ) << "MHz. My frequency is "
<< (frequency / 1000000.0) << "MHz." << std::endl;
}
eventQueues在nvmain_mem.cc中对globalEventQueue进行操作时会被调用