ruby: reset timing after cache warm up
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 15 Oct 2012 22:27:15 +0000 (17:27 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 15 Oct 2012 22:27:15 +0000 (17:27 -0500)
Ruby system was recently converted to a clocked object. Such objects maintain
state related to the time that has passed so far. During the cache warmup, Ruby
system changes its own time and the global time. Later on, the global time is
restored. So Ruby system also needs to reset its own time.

src/mem/ruby/system/System.cc
src/sim/clocked_object.hh

index 8c267654fd6a6677f500515b11678a3e0fe6d3f3..6e144a7030c2e2fbf09f2cf19e6e956ae3b7bb22 100644 (file)
@@ -354,8 +354,9 @@ RubySystem::startup()
         Tick curtick_original = curTick();
         // save the event queue head
         Event* eventq_head = eventq->replaceHead(NULL);
-        // set curTick to 0
+        // set curTick to 0 and reset Ruby System's clock
         curTick(0);
+        resetClock();
 
         // Schedule an event to start cache warmup
         enqueueRubyEvent(curTick());
@@ -369,8 +370,9 @@ RubySystem::startup()
         m_memory_controller->reset();
         // Restore eventq head
         eventq_head = eventq->replaceHead(eventq_head);
-        // Restore curTick
+        // Restore curTick and Ruby System's clock
         curTick(curtick_original);
+        resetClock();
     }
 }
 
index 78539c9c96ad2a3c0762d263cbd70598230189c3..9a4c1034a7ae32ef17720ef78228aa2b49d5babf 100644 (file)
@@ -119,6 +119,18 @@ class ClockedObject : public SimObject
      */
     virtual ~ClockedObject() { }
 
+    /**
+     * Reset the object's clock using the current global tick value. Likely
+     * to be used only when the global clock is reset. Currently, this done
+     * only when Ruby is done warming up the memory system.
+     */
+    void resetClock() const
+    {
+        Cycles elapsedCycles(divCeil(curTick(), clock));
+        cycle = elapsedCycles;
+        tick = elapsedCycles * clock;
+    }
+
   public:
 
     /**