diff -r fbdaa08aaa42 -r e1ce7cc2abbd src/mem/ruby/network/MessageBuffer.cc --- a/src/mem/ruby/network/MessageBuffer.cc Tue May 05 09:25:59 2015 -0700 +++ b/src/mem/ruby/network/MessageBuffer.cc Sun May 17 10:00:15 2015 -0500 @@ -191,7 +191,7 @@ } // If running a cache trace, don't worry about the last arrival checks - if (!g_system_ptr->m_warmup_enabled) { + if (!RubySystem::getWarmupEnabled()) { m_last_arrival_time = arrival_time; } diff -r fbdaa08aaa42 -r e1ce7cc2abbd src/mem/ruby/slicc_interface/AbstractController.hh --- a/src/mem/ruby/slicc_interface/AbstractController.hh Tue May 05 09:25:59 2015 -0700 +++ b/src/mem/ruby/slicc_interface/AbstractController.hh Sun May 17 10:00:15 2015 -0500 @@ -205,9 +205,6 @@ // memory controller. MessageBuffer *m_responseFromMemory_ptr; - // Needed so we know if we are warming up - RubySystem *m_rubySystem; - // State that is stored in packets sent to the memory controller. struct SenderState : public Packet::SenderState { diff -r fbdaa08aaa42 -r e1ce7cc2abbd src/mem/ruby/slicc_interface/AbstractController.cc --- a/src/mem/ruby/slicc_interface/AbstractController.cc Tue May 05 09:25:59 2015 -0700 +++ b/src/mem/ruby/slicc_interface/AbstractController.cc Sun May 17 10:00:15 2015 -0500 @@ -40,8 +40,7 @@ m_transitions_per_cycle(p->transitions_per_cycle), m_buffer_size(p->buffer_size), m_recycle_latency(p->recycle_latency), memoryPort(csprintf("%s.memory", name()), this, ""), - m_responseFromMemory_ptr(new MessageBuffer()), - m_rubySystem(p->ruby_system) + m_responseFromMemory_ptr(new MessageBuffer()) { // Set the sender pointer of the response message buffer from the // memory controller. @@ -219,7 +218,7 @@ pkt->pushSenderState(s); // Use functional rather than timing accesses during warmup - if (m_rubySystem->m_warmup_enabled) { + if (RubySystem::getWarmupEnabled()) { memoryPort.sendFunctional(pkt); recvTimingResp(pkt); return; @@ -246,7 +245,7 @@ pkt->pushSenderState(s); // Use functional rather than timing accesses during warmup - if (m_rubySystem->m_warmup_enabled) { + if (RubySystem::getWarmupEnabled()) { memoryPort.sendFunctional(pkt); recvTimingResp(pkt); return; diff -r fbdaa08aaa42 -r e1ce7cc2abbd src/mem/ruby/system/Sequencer.cc --- a/src/mem/ruby/system/Sequencer.cc Tue May 05 09:25:59 2015 -0700 +++ b/src/mem/ruby/system/Sequencer.cc Sun May 17 10:00:15 2015 -0500 @@ -525,7 +525,7 @@ request_address, total_latency); // update the data unless it is a non-data-carrying flush - if (g_system_ptr->m_warmup_enabled) { + if (RubySystem::getWarmupEnabled()) { data.setData(pkt->getConstPtr(), request_address.getOffset(), pkt->getSize()); } else if (!pkt->isFlush()) { @@ -557,12 +557,12 @@ delete srequest; - if (g_system_ptr->m_warmup_enabled) { + if (RubySystem::getWarmupEnabled()) { assert(pkt->req); delete pkt->req; delete pkt; g_system_ptr->m_cache_recorder->enqueueNextFetchRequest(); - } else if (g_system_ptr->m_cooldown_enabled) { + } else if (RubySystem::getCooldownEnabled()) { delete pkt; g_system_ptr->m_cache_recorder->enqueueNextFlushRequest(); } else { diff -r fbdaa08aaa42 -r e1ce7cc2abbd src/mem/ruby/system/System.hh --- a/src/mem/ruby/system/System.hh Tue May 05 09:25:59 2015 -0700 +++ b/src/mem/ruby/system/System.hh Sun May 17 10:00:15 2015 -0500 @@ -74,6 +74,8 @@ static uint32_t getBlockSizeBytes() { return m_block_size_bytes; } static uint32_t getBlockSizeBits() { return m_block_size_bits; } static uint32_t getMemorySizeBits() { return m_memory_size_bits; } + static bool getWarmupEnabled() { return m_warmup_enabled; } + static bool getCooldownEnabled() { return m_cooldown_enabled; } SimpleMemory *getPhysMem() { return m_phys_mem; } const bool getAccessBackingStore() { return m_access_backing_store; } @@ -125,6 +127,9 @@ static uint32_t m_block_size_bytes; static uint32_t m_block_size_bits; static uint32_t m_memory_size_bits; + static bool m_warmup_enabled; + static unsigned m_systems_to_warmup; + static bool m_cooldown_enabled; SimpleMemory *m_phys_mem; const bool m_access_backing_store; @@ -133,8 +138,6 @@ public: Profiler* m_profiler; - bool m_warmup_enabled; - bool m_cooldown_enabled; CacheRecorder* m_cache_recorder; }; diff -r fbdaa08aaa42 -r e1ce7cc2abbd src/mem/ruby/system/System.cc --- a/src/mem/ruby/system/System.cc Tue May 05 09:25:59 2015 -0700 +++ b/src/mem/ruby/system/System.cc Sun May 17 10:00:15 2015 -0500 @@ -49,6 +49,11 @@ uint32_t RubySystem::m_block_size_bytes; uint32_t RubySystem::m_block_size_bits; uint32_t RubySystem::m_memory_size_bits; +bool RubySystem::m_warmup_enabled = false; +// To look forward to allowing multiple RubySystem instances, track the number +// of RubySystems that need to be warmed up on checkpoint restore. +unsigned RubySystem::m_systems_to_warmup = 0; +bool RubySystem::m_cooldown_enabled = false; RubySystem::RubySystem(const Params *p) : ClockedObject(p), m_access_backing_store(p->access_backing_store) @@ -65,9 +70,6 @@ m_block_size_bits = floorLog2(m_block_size_bytes); m_memory_size_bits = p->memory_size_bits; - m_warmup_enabled = false; - m_cooldown_enabled = false; - // Setup the global variables used in Ruby g_system_ptr = this; @@ -252,6 +254,7 @@ readCompressedTrace(cache_trace_file, uncompressed_trace, cache_trace_size); m_warmup_enabled = true; + m_systems_to_warmup++; vector sequencer_map; Sequencer* t = NULL; @@ -307,7 +310,10 @@ delete m_cache_recorder; m_cache_recorder = NULL; - m_warmup_enabled = false; + m_systems_to_warmup--; + if (m_systems_to_warmup == 0) { + m_warmup_enabled = false; + } // Restore eventq head eventq_head = eventq->replaceHead(eventq_head); @@ -322,9 +328,9 @@ void RubySystem::RubyEvent::process() { - if (ruby_system->m_warmup_enabled) { + if (RubySystem::getWarmupEnabled()) { ruby_system->m_cache_recorder->enqueueNextFetchRequest(); - } else if (ruby_system->m_cooldown_enabled) { + } else if (RubySystem::getCooldownEnabled()) { ruby_system->m_cache_recorder->enqueueNextFlushRequest(); } }