diff options
author | Mitch Hayenga <mitch.hayenga@arm.com> | 2014-09-20 17:18:35 -0400 |
---|---|---|
committer | Mitch Hayenga <mitch.hayenga@arm.com> | 2014-09-20 17:18:35 -0400 |
commit | e1403fc2af61c224c573c47c77a36f9b1b78e7df (patch) | |
tree | 07647bb8697ac256d180bf8de35080eee2a63f3e /src/cpu/o3/cpu.cc | |
parent | 2b0438a11eb6a9640b06da91e8a300d0ac3ad81a (diff) | |
download | gem5-e1403fc2af61c224c573c47c77a36f9b1b78e7df.tar.xz |
alpha,arm,mips,power,x86,cpu,sim: Cleanup activate/deactivate
activate(), suspend(), and halt() used on thread contexts had an optional
delay parameter. However this parameter was often ignored. Also, when used,
the delay was seemily arbitrarily set to 0 or 1 cycle (no other delays were
ever specified). This patch removes the delay parameter and 'Events'
associated with them across all ISAs and cores. Unused activate logic
is also removed.
Diffstat (limited to 'src/cpu/o3/cpu.cc')
-rw-r--r-- | src/cpu/o3/cpu.cc | 214 |
1 files changed, 14 insertions, 200 deletions
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index fdbbd5c14..2ae185532 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -148,67 +148,6 @@ FullO3CPU<Impl>::TickEvent::description() const } template <class Impl> -FullO3CPU<Impl>::ActivateThreadEvent::ActivateThreadEvent() - : Event(CPU_Switch_Pri) -{ -} - -template <class Impl> -void -FullO3CPU<Impl>::ActivateThreadEvent::init(int thread_num, - FullO3CPU<Impl> *thread_cpu) -{ - tid = thread_num; - cpu = thread_cpu; -} - -template <class Impl> -void -FullO3CPU<Impl>::ActivateThreadEvent::process() -{ - cpu->activateThread(tid); -} - -template <class Impl> -const char * -FullO3CPU<Impl>::ActivateThreadEvent::description() const -{ - return "FullO3CPU \"Activate Thread\""; -} - -template <class Impl> -FullO3CPU<Impl>::DeallocateContextEvent::DeallocateContextEvent() - : Event(CPU_Tick_Pri), tid(0), remove(false), cpu(NULL) -{ -} - -template <class Impl> -void -FullO3CPU<Impl>::DeallocateContextEvent::init(int thread_num, - FullO3CPU<Impl> *thread_cpu) -{ - tid = thread_num; - cpu = thread_cpu; - remove = false; -} - -template <class Impl> -void -FullO3CPU<Impl>::DeallocateContextEvent::process() -{ - cpu->deactivateThread(tid); - if (remove) - cpu->removeThread(tid); -} - -template <class Impl> -const char * -FullO3CPU<Impl>::DeallocateContextEvent::description() const -{ - return "FullO3CPU \"Deallocate Context\""; -} - -template <class Impl> FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params) : BaseO3CPU(params), itb(params->itb), @@ -346,9 +285,6 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params) renameMap[tid].init(®File, TheISA::ZeroReg, fpZeroReg, &freeList); - - activateThreadEvent[tid].init(tid, this); - deallocateContextEvent[tid].init(tid, this); } // Initialize rename map to assign physical registers to the @@ -389,7 +325,6 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params) globalSeqNum[tid] = 1; #endif - contextSwitch = false; DPRINTF(O3CPU, "Creating O3CPU object.\n"); // Setup any thread state. @@ -613,9 +548,6 @@ FullO3CPU<Impl>::tick() commit.tick(); - if (!FullSystem) - doContextSwitch(); - // Now advance the time buffers timeBuffer.advance(); @@ -761,18 +693,12 @@ FullO3CPU<Impl>::totalOps() const template <class Impl> void -FullO3CPU<Impl>::activateContext(ThreadID tid, Cycles delay) +FullO3CPU<Impl>::activateContext(ThreadID tid) { assert(!switchedOut()); // Needs to set each stage to running as well. - if (delay){ - DPRINTF(O3CPU, "[tid:%i]: Scheduling thread context to activate " - "on cycle %d\n", tid, clockEdge(delay)); - scheduleActivateThreadEvent(tid, delay); - } else { - activateThread(tid); - } + activateThread(tid); // We don't want to wake the CPU if it is drained. In that case, // we just want to flag the thread as active and schedule the tick @@ -783,7 +709,7 @@ FullO3CPU<Impl>::activateContext(ThreadID tid, Cycles delay) // If we are time 0 or if the last activation time is in the past, // schedule the next tick and wake up the fetch unit if (lastActivatedCycle == 0 || lastActivatedCycle < curTick()) { - scheduleTickEvent(delay); + scheduleTickEvent(Cycles(0)); // Be sure to signal that there's some activity so the CPU doesn't // deschedule itself. @@ -803,22 +729,12 @@ FullO3CPU<Impl>::activateContext(ThreadID tid, Cycles delay) } template <class Impl> -bool -FullO3CPU<Impl>::scheduleDeallocateContext(ThreadID tid, bool remove, - Cycles delay) -{ - // Schedule removal of thread data from CPU - if (delay){ - DPRINTF(O3CPU, "[tid:%i]: Scheduling thread context to deallocate " - "on tick %d\n", tid, clockEdge(delay)); - scheduleDeallocateContextEvent(tid, remove, delay); - return false; - } else { - deactivateThread(tid); - if (remove) - removeThread(tid); - return true; - } +void +FullO3CPU<Impl>::deallocateContext(ThreadID tid, bool remove) +{ + deactivateThread(tid); + if (remove) + removeThread(tid); } template <class Impl> @@ -827,10 +743,10 @@ FullO3CPU<Impl>::suspendContext(ThreadID tid) { DPRINTF(O3CPU,"[tid: %i]: Suspending Thread Context.\n", tid); assert(!switchedOut()); - bool deallocated = scheduleDeallocateContext(tid, false, Cycles(1)); + deallocateContext(tid, false); + // If this was the last thread then unschedule the tick event. - if ((activeThreads.size() == 1 && !deallocated) || - activeThreads.size() == 0) + if (activeThreads.size() == 0) unscheduleTickEvent(); DPRINTF(Quiesce, "Suspending Context\n"); @@ -845,7 +761,7 @@ FullO3CPU<Impl>::haltContext(ThreadID tid) //For now, this is the same as deallocate DPRINTF(O3CPU,"[tid:%i]: Halt Context called. Deallocating", tid); assert(!switchedOut()); - scheduleDeallocateContext(tid, true, Cycles(1)); + deallocateContext(tid, true); } template <class Impl> @@ -896,7 +812,7 @@ FullO3CPU<Impl>::insertThread(ThreadID tid) src_tc->setStatus(ThreadContext::Active); - activateContext(tid, Cycles(1)); + activateContext(tid); //Reset ROB/IQ/LSQ Entries commit.rob->resetEntries(); @@ -973,77 +889,6 @@ FullO3CPU<Impl>::removeThread(ThreadID tid) */ } - -template <class Impl> -void -FullO3CPU<Impl>::activateWhenReady(ThreadID tid) -{ - DPRINTF(O3CPU,"[tid:%i]: Checking if resources are available for incoming" - "(e.g. PhysRegs/ROB/IQ/LSQ) \n", - tid); - - bool ready = true; - - // Should these all be '<' not '>='? This seems backwards... - if (freeList.numFreeIntRegs() >= TheISA::NumIntRegs) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "Phys. Int. Regs.\n", - tid); - ready = false; - } else if (freeList.numFreeFloatRegs() >= TheISA::NumFloatRegs) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "Phys. Float. Regs.\n", - tid); - ready = false; - } else if (freeList.numFreeCCRegs() >= TheISA::NumCCRegs) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "Phys. CC. Regs.\n", - tid); - ready = false; - } else if (commit.rob->numFreeEntries() >= - commit.rob->entryAmount(activeThreads.size() + 1)) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "ROB entries.\n", - tid); - ready = false; - } else if (iew.instQueue.numFreeEntries() >= - iew.instQueue.entryAmount(activeThreads.size() + 1)) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "IQ entries.\n", - tid); - ready = false; - } else if (iew.ldstQueue.numFreeLoadEntries() >= - iew.ldstQueue.entryAmount(activeThreads.size() + 1)) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "LQ entries.\n", - tid); - ready = false; - } else if (iew.ldstQueue.numFreeStoreEntries() >= - iew.ldstQueue.entryAmount(activeThreads.size() + 1)) { - DPRINTF(O3CPU,"[tid:%i] Suspending thread due to not enough " - "SQ entries.\n", - tid); - ready = false; - } - - if (ready) { - insertThread(tid); - - contextSwitch = false; - - cpuWaitList.remove(tid); - } else { - suspendContext(tid); - - //blocks fetch - contextSwitch = true; - - //@todo: dont always add to waitlist - //do waitlist - cpuWaitList.push_back(tid); - } -} - template <class Impl> Fault FullO3CPU<Impl>::hwrei(ThreadID tid) @@ -1243,19 +1088,6 @@ FullO3CPU<Impl>::isDrained() const { bool drained(true); - for (ThreadID i = 0; i < thread.size(); ++i) { - if (activateThreadEvent[i].scheduled()) { - DPRINTF(Drain, "CPU not drained, tread %i has a " - "pending activate event\n", i); - drained = false; - } - if (deallocateContextEvent[i].scheduled()) { - DPRINTF(Drain, "CPU not drained, tread %i has a " - "pending deallocate context event\n", i); - drained = false; - } - } - if (!instList.empty() || !removeList.empty()) { DPRINTF(Drain, "Main CPU structures not drained.\n"); drained = false; @@ -1832,24 +1664,6 @@ FullO3CPU<Impl>::getFreeTid() template <class Impl> void -FullO3CPU<Impl>::doContextSwitch() -{ - if (contextSwitch) { - - //ADD CODE TO DEACTIVE THREAD HERE (???) - - ThreadID size = cpuWaitList.size(); - for (ThreadID tid = 0; tid < size; tid++) { - activateWhenReady(tid); - } - - if (cpuWaitList.size() == 0) - contextSwitch = true; - } -} - -template <class Impl> -void FullO3CPU<Impl>::updateThreadPriority() { if (activeThreads.size() > 1) { |