cpu: Accurately count idle cycles for simple cpu

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.
This commit is contained in:
Lena Olson 2013-08-19 03:52:35 -04:00
parent c26911013c
commit 646c4a23ca
3 changed files with 10 additions and 6 deletions

View 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;
}

View 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;
}

View 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;
}