ruby: Fix RubySystem warm-up and cool-down scope
authorJoel Hestness <jthestness@gmail.com>
Tue, 19 May 2015 15:56:51 +0000 (10:56 -0500)
committerJoel Hestness <jthestness@gmail.com>
Tue, 19 May 2015 15:56:51 +0000 (10:56 -0500)
The processes of warming up and cooling down Ruby caches are simulation-wide
processes, not just RubySystem instance-specific processes. Thus, the warm-up
and cool-down variables should be globally visible to any Ruby components
participating in either process. Make these variables static members and track
the warm-up and cool-down processes as appropriate.

This patch also has two side benefits:
1) It removes references to the RubySystem g_system_ptr, which are problematic
for allowing multiple RubySystem instances in a single simulation. Warmup and
cooldown variables being static (global) reduces the need for instance-specific
dereferences through the RubySystem.
2) From the AbstractController, it removes local RubySystem pointers, which are
used inconsistently with other uses of the RubySystem: 11 other uses reference
the RubySystem with the g_system_ptr. Only sequencers have local pointers.

src/mem/ruby/network/MessageBuffer.cc
src/mem/ruby/slicc_interface/AbstractController.cc
src/mem/ruby/slicc_interface/AbstractController.hh
src/mem/ruby/system/Sequencer.cc
src/mem/ruby/system/System.cc
src/mem/ruby/system/System.hh

index 57a8d551990cd9cbcec083605663b74f78388203..99879a1b670cdb5360cca526ab32a2f0287f380e 100644 (file)
@@ -191,7 +191,7 @@ MessageBuffer::enqueue(MsgPtr message, Cycles delta)
     }
 
     // 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;
     }
 
index 4290c63fa314b93ccbea49edd740640fb397b649..a6d05fd3a0560ecd63bd0dc5f55edecf04933bc3 100644 (file)
@@ -40,8 +40,7 @@ AbstractController::AbstractController(const Params *p)
       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 @@ AbstractController::queueMemoryRead(const MachineID &id, Address addr,
     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 @@ AbstractController::queueMemoryWrite(const MachineID &id, Address addr,
     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;
index 01859397a9537ecd435d25903045184cd5f00d7a..f8970fb590d1edbaf284713d187cc7ce2e34fb5c 100644 (file)
@@ -205,9 +205,6 @@ class AbstractController : public MemObject, public Consumer
     // 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
     {
index 98649dcd563c032ee60ae44befbaf0a8fa91a18b..b1d22b549a084f35627b244a3264fa53e32fb963 100644 (file)
@@ -525,7 +525,7 @@ Sequencer::hitCallback(SequencerRequest* srequest, DataBlock& data,
              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<uint8_t>(),
                      request_address.getOffset(), pkt->getSize());
     } else if (!pkt->isFlush()) {
@@ -557,12 +557,12 @@ Sequencer::hitCallback(SequencerRequest* srequest, DataBlock& data,
 
     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 {
index b93dacdfc18bae0aed7f0945b44048afa4174a0b..75ebc8caf545321f7ad9ce8bf9d8558a57bde3e2 100644 (file)
@@ -49,6 +49,11 @@ bool RubySystem::m_randomization;
 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 @@ RubySystem::RubySystem(const Params *p)
     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 @@ RubySystem::unserialize(Checkpoint *cp, const string &section)
     readCompressedTrace(cache_trace_file, uncompressed_trace,
                         cache_trace_size);
     m_warmup_enabled = true;
+    m_systems_to_warmup++;
 
     vector<Sequencer*> sequencer_map;
     Sequencer* t = NULL;
@@ -307,7 +310,10 @@ RubySystem::startup()
 
         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 @@ RubySystem::startup()
 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();
     }
 }
index 72de7470204fb3cd63133366c9c0a3b7a7bbea7f..45e8aa8b4bce998a848b5fab1ab77cb41b9ea447 100644 (file)
@@ -74,6 +74,8 @@ class RubySystem : public ClockedObject
     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 @@ class RubySystem : public ClockedObject
     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 @@ class RubySystem : public ClockedObject
 
   public:
     Profiler* m_profiler;
-    bool m_warmup_enabled;
-    bool m_cooldown_enabled;
     CacheRecorder* m_cache_recorder;
 };