cpu: Accurately count idle cycles for simple cpu
authorLena Olson <lena@cs.wisc,edu>
Mon, 19 Aug 2013 07:52:35 +0000 (03:52 -0400)
committerLena Olson <lena@cs.wisc,edu>
Mon, 19 Aug 2013 07:52:35 +0000 (03:52 -0400)
Added a couple missing updates to the notIdleFraction stat. Without
these, it sometimes gives a (not) idle fraction that is greater than 1
or less than 0.

src/cpu/ozone/cpu_impl.hh
src/cpu/simple/atomic.cc
src/cpu/simple/timing.cc

index fe8ae25512dbf63e4814002b65c1c8b04d31510f..f64f287ea7e178f5e6654e0e1c8b3e85ca8b6ad1 100644 (file)
@@ -282,7 +282,7 @@ OzoneCPU<Impl>::activateContext(int thread_num, int delay)
     assert(thread_num == 0);
 
     assert(_status == Idle);
-    notIdleFraction++;
+    notIdleFraction = 1;
     scheduleTickEvent(delay);
     _status = Running;
     if (thread.quiesceEvent && thread.quiesceEvent->scheduled())
@@ -300,7 +300,7 @@ OzoneCPU<Impl>::suspendContext(int thread_num)
     // @todo: Figure out how to initially set the status properly so
     // this is running.
 //    assert(_status == Running);
-    notIdleFraction--;
+    notIdleFraction = 0;
     unscheduleTickEvent();
     _status = Idle;
 }
index ffd1c4d434eb5a7cea58f7725079c637eb606d9f..d29903c2f5ae6121b01dd36350d58fadbdafc045 100644 (file)
@@ -175,8 +175,10 @@ AtomicSimpleCPU::drainResume()
     if (thread->status() == ThreadContext::Active) {
         schedule(tickEvent, nextCycle());
         _status = BaseSimpleCPU::Running;
+        notIdleFraction = 1;
     } else {
         _status = BaseSimpleCPU::Idle;
+        notIdleFraction = 0;
     }
 
     system->totalNumInsts = 0;
@@ -244,7 +246,7 @@ AtomicSimpleCPU::activateContext(ThreadID thread_num, Cycles delay)
     assert(_status == Idle);
     assert(!tickEvent.scheduled());
 
-    notIdleFraction++;
+    notIdleFraction = 1;
     numCycles += ticksToCycles(thread->lastActivate - thread->lastSuspend);
 
     //Make sure ticks are still on multiples of cycles
@@ -271,7 +273,7 @@ AtomicSimpleCPU::suspendContext(ThreadID thread_num)
     if (tickEvent.scheduled())
         deschedule(tickEvent);
 
-    notIdleFraction--;
+    notIdleFraction = 0;
     _status = Idle;
 }
 
index 075d05d810bc2bcdb8a53bba1cf586137faa39c3..744bf839773a3cf0cebd3d00a95751c6a98d86ea 100644 (file)
@@ -143,8 +143,10 @@ TimingSimpleCPU::drainResume()
     if (thread->status() == ThreadContext::Active) {
         schedule(fetchEvent, nextCycle());
         _status = BaseSimpleCPU::Running;
+        notIdleFraction = 1;
     } else {
         _status = BaseSimpleCPU::Idle;
+        notIdleFraction = 0;
     }
 }
 
@@ -206,7 +208,7 @@ TimingSimpleCPU::activateContext(ThreadID thread_num, Cycles delay)
 
     assert(_status == Idle);
 
-    notIdleFraction++;
+    notIdleFraction = 1;
     _status = BaseSimpleCPU::Running;
 
     // kick things off by initiating the fetch of the next instruction
@@ -230,7 +232,7 @@ TimingSimpleCPU::suspendContext(ThreadID thread_num)
     // just change status to Idle... if status != Running,
     // completeInst() will not initiate fetch of next instruction.
 
-    notIdleFraction--;
+    notIdleFraction = 0;
     _status = Idle;
 }