inorder-cleanup: remove unused thread functions

This commit is contained in:
Korey Sewell 2010-01-31 18:26:40 -05:00
parent e1fcc64980
commit d9eaa2fe21
4 changed files with 80 additions and 332 deletions

View file

@ -100,13 +100,9 @@ std::string InOrderCPU::eventNames[NumCPUEvents] =
"DeactivateThread",
"DeallocateThread",
"SuspendThread",
"DisableThreads",
"EnableThreads",
"DisableVPEs",
"EnableVPEs",
"Trap",
"InstGraduated",
"SquashAll",
"SquashFromMemStall",
"UpdatePCs"
};
@ -119,8 +115,6 @@ InOrderCPU::CPUEvent::process()
cpu->activateThread(tid);
break;
//@TODO: Consider Implementing "Suspend Thread" as Separate from
//Deallocate
case ActivateNextReadyThread:
cpu->activateNextReadyThread();
break;
@ -129,28 +123,12 @@ InOrderCPU::CPUEvent::process()
cpu->deactivateThread(tid);
break;
case SuspendThread: // Suspend & Deallocate are same for now.
cpu->suspendThread(tid);
break;
case DeallocateThread:
cpu->deallocateThread(tid);
break;
case EnableVPEs:
cpu->enableVPEs(vpe);
break;
case DisableVPEs:
cpu->disableVPEs(tid, vpe);
break;
case EnableThreads:
cpu->enableThreads(vpe);
break;
case DisableThreads:
cpu->disableThreads(tid, vpe);
case SuspendThread:
cpu->suspendThread(tid);
break;
case SquashFromMemStall:
@ -212,8 +190,7 @@ InOrderCPU::InOrderCPU(Params *params)
#endif // DEBUG
switchCount(0),
deferRegistration(false/*params->deferRegistration*/),
stageTracing(params->stageTracing),
numVirtProcs(1)
stageTracing(params->stageTracing)
{
ThreadID active_threads;
cpu_params = params;
@ -335,11 +312,10 @@ InOrderCPU::InOrderCPU(Params *params)
memset(floatRegs.i[tid], 0, sizeof(floatRegs.i[tid]));
isa[tid].clear();
isa[tid].expandForMultithreading(numThreads, numVirtProcs);
isa[tid].expandForMultithreading(numThreads, 1/*numVirtProcs*/);
}
lastRunningCycle = curTick;
contextSwitch = false;
// Define dummy instructions and resource requests to be used.
dummyInst = new InOrderDynInst(this, NULL, 0, 0);
@ -526,7 +502,7 @@ InOrderCPU::reset()
{
for (int i = 0; i < numThreads; i++) {
isa[i].reset(coreType, numThreads,
numVirtProcs, dynamic_cast<BaseCPU*>(this));
1/*numVirtProcs*/, dynamic_cast<BaseCPU*>(this));
}
}
@ -703,6 +679,20 @@ InOrderCPU::activateThread(ThreadID tid)
}
}
void
InOrderCPU::deactivateContext(ThreadID tid, int delay)
{
DPRINTF(InOrderCPU,"[tid:%i]: Deactivating ...\n", tid);
scheduleCpuEvent(DeactivateThread, NoFault, tid, dummyInst, delay);
// Be sure to signal that there's some activity so the CPU doesn't
// deschedule itself.
activityRec.activity();
_status = Running;
}
void
InOrderCPU::deactivateThread(ThreadID tid)
{
@ -722,6 +712,40 @@ InOrderCPU::deactivateThread(ThreadID tid)
}
}
void
InOrderCPU::deallocateContext(ThreadID tid, int delay)
{
DPRINTF(InOrderCPU,"[tid:%i]: Deallocating ...\n", tid);
scheduleCpuEvent(DeallocateThread, NoFault, tid, dummyInst, delay);
// Be sure to signal that there's some activity so the CPU doesn't
// deschedule itself.
activityRec.activity();
_status = Running;
}
void
InOrderCPU::deallocateThread(ThreadID tid)
{
DPRINTF(InOrderCPU, "[tid:%i]: Calling deallocate thread.\n", tid);
if (isThreadActive(tid)) {
DPRINTF(InOrderCPU,"[tid:%i]: Removing from active threads list\n",
tid);
list<ThreadID>::iterator thread_it =
std::find(activeThreads.begin(), activeThreads.end(), tid);
removePipelineStalls(*thread_it);
activeThreads.erase(thread_it);
}
// TODO: "Un"Load/Unmap register file state
}
void
InOrderCPU::removePipelineStalls(ThreadID tid)
{
@ -733,36 +757,6 @@ InOrderCPU::removePipelineStalls(ThreadID tid)
}
}
bool
InOrderCPU::isThreadInCPU(ThreadID tid)
{
list<ThreadID>::iterator isCurrent =
std::find(currentThreads.begin(), currentThreads.end(), tid);
return (isCurrent != currentThreads.end());
}
void
InOrderCPU::addToCurrentThreads(ThreadID tid)
{
if (!isThreadInCPU(tid)) {
DPRINTF(InOrderCPU, "Adding Thread %i to current threads list in CPU."
"\n", tid);
currentThreads.push_back(tid);
}
}
void
InOrderCPU::removeFromCurrentThreads(ThreadID tid)
{
if (isThreadInCPU(tid)) {
DPRINTF(InOrderCPU,
"Adding Thread %i to current threads list in CPU.\n", tid);
list<ThreadID>::iterator isCurrent =
std::find(currentThreads.begin(), currentThreads.end(), tid);
currentThreads.erase(isCurrent);
}
}
bool
InOrderCPU::isThreadSuspended(ThreadID tid)
@ -773,125 +767,6 @@ InOrderCPU::isThreadSuspended(ThreadID tid)
return (isSuspended!= suspendedThreads.end());
}
void
InOrderCPU::enableVirtProcElement(unsigned vpe)
{
DPRINTF(InOrderCPU, "[vpe:%i]: Scheduling "
"Enabling of concurrent virtual processor execution",
vpe);
scheduleCpuEvent(EnableVPEs, NoFault, 0/*tid*/, dummyInst);
}
void
InOrderCPU::enableVPEs(unsigned vpe)
{
DPRINTF(InOrderCPU, "[vpe:%i]: Enabling Concurrent Execution "
"virtual processors %i", vpe);
list<ThreadID>::iterator thread_it = currentThreads.begin();
while (thread_it != currentThreads.end()) {
if (!isThreadSuspended(*thread_it)) {
activateThread(*thread_it);
}
thread_it++;
}
}
void
InOrderCPU::disableVirtProcElement(ThreadID tid, unsigned vpe)
{
DPRINTF(InOrderCPU, "[vpe:%i]: Scheduling "
"Disabling of concurrent virtual processor execution",
vpe);
scheduleCpuEvent(DisableVPEs, NoFault, 0/*tid*/, dummyInst);
}
void
InOrderCPU::disableVPEs(ThreadID tid, unsigned vpe)
{
DPRINTF(InOrderCPU, "[vpe:%i]: Disabling Concurrent Execution of "
"virtual processors %i", vpe);
unsigned base_vpe = TheISA::getVirtProcNum(tcBase(tid));
list<ThreadID>::iterator thread_it = activeThreads.begin();
vector<list<ThreadID>::iterator> removeList;
while (thread_it != activeThreads.end()) {
if (base_vpe != vpe) {
removeList.push_back(thread_it);
}
thread_it++;
}
for (int i = 0; i < removeList.size(); i++) {
activeThreads.erase(removeList[i]);
}
}
void
InOrderCPU::enableMultiThreading(unsigned vpe)
{
// Schedule event to take place at end of cycle
DPRINTF(InOrderCPU, "[vpe:%i]: Scheduling Enable Multithreading on "
"virtual processor %i", vpe);
scheduleCpuEvent(EnableThreads, NoFault, 0/*tid*/, dummyInst);
}
void
InOrderCPU::enableThreads(unsigned vpe)
{
DPRINTF(InOrderCPU, "[vpe:%i]: Enabling Multithreading on "
"virtual processor %i", vpe);
list<ThreadID>::iterator thread_it = currentThreads.begin();
while (thread_it != currentThreads.end()) {
if (TheISA::getVirtProcNum(tcBase(*thread_it)) == vpe) {
if (!isThreadSuspended(*thread_it)) {
activateThread(*thread_it);
}
}
thread_it++;
}
}
void
InOrderCPU::disableMultiThreading(ThreadID tid, unsigned vpe)
{
// Schedule event to take place at end of cycle
DPRINTF(InOrderCPU, "[tid:%i]: Scheduling Disable Multithreading on "
"virtual processor %i", tid, vpe);
scheduleCpuEvent(DisableThreads, NoFault, tid, dummyInst);
}
void
InOrderCPU::disableThreads(ThreadID tid, unsigned vpe)
{
DPRINTF(InOrderCPU, "[tid:%i]: Disabling Multithreading on "
"virtual processor %i", tid, vpe);
list<ThreadID>::iterator thread_it = activeThreads.begin();
vector<list<ThreadID>::iterator> removeList;
while (thread_it != activeThreads.end()) {
if (TheISA::getVirtProcNum(tcBase(*thread_it)) == vpe) {
removeList.push_back(thread_it);
}
thread_it++;
}
for (int i = 0; i < removeList.size(); i++) {
activeThreads.erase(removeList[i]);
}
}
void
InOrderCPU::updateThreadPriority()
{
@ -958,6 +833,12 @@ InOrderCPU::activateNextReadyContext(int delay)
_status = Running;
}
void
InOrderCPU::haltContext(ThreadID tid, int delay)
{
suspendContext(tid, delay);
}
void
InOrderCPU::suspendContext(ThreadID tid, int delay)
{
@ -973,24 +854,6 @@ InOrderCPU::suspendThread(ThreadID tid)
suspendedThreads.push_back(tid);
}
void
InOrderCPU::deallocateContext(ThreadID tid, int delay)
{
scheduleCpuEvent(DeallocateThread, NoFault, tid, dummyInst, delay);
}
void
InOrderCPU::deallocateThread(ThreadID tid)
{
DPRINTF(InOrderCPU,"[tid:%i]: Deallocating ...", tid);
removeFromCurrentThreads(tid);
deactivateThread(tid);
squashThreadInPipeline(tid);
}
void
InOrderCPU::squashThreadInPipeline(ThreadID tid)
{
@ -1000,45 +863,12 @@ InOrderCPU::squashThreadInPipeline(ThreadID tid)
}
}
void
InOrderCPU::haltContext(ThreadID tid, int delay)
{
DPRINTF(InOrderCPU, "[tid:%i]: Halt context called.\n", tid);
// Halt is same thing as deallocate for now
// @TODO: Differentiate between halt & deallocate in the CPU
// model
deallocateContext(tid, delay);
}
void
InOrderCPU::insertThread(ThreadID tid)
{
panic("Unimplemented Function\n.");
}
void
InOrderCPU::removeThread(ThreadID tid)
{
DPRINTF(InOrderCPU, "Removing Thread %i from CPU.\n", tid);
/** Broadcast to CPU resources*/
}
PipelineStage*
InOrderCPU::getPipeStage(int stage_num)
{
return pipelineStage[stage_num];
}
void
InOrderCPU::activateWhenReady(ThreadID tid)
{
panic("Unimplemented Function\n.");
}
uint64_t
InOrderCPU::readPC(ThreadID tid)
{

View file

@ -179,10 +179,6 @@ class InOrderCPU : public BaseCPU
DeactivateThread,
DeallocateThread,
SuspendThread,
DisableThreads,
EnableThreads,
DisableVPEs,
EnableVPEs,
Trap,
InstGraduated,
SquashFromMemStall,
@ -347,18 +343,6 @@ class InOrderCPU : public BaseCPU
void trap(Fault fault, ThreadID tid, int delay = 0);
void trapCPU(Fault fault, ThreadID tid);
/** squashFromMemStall() - sets up a squash event
* squashDueToMemStall() - squashes pipeline
*/
void squashFromMemStall(DynInstPtr inst, ThreadID tid, int delay = 0);
void squashDueToMemStall(int stage_num, InstSeqNum seq_num, ThreadID tid);
/** Setup CPU to insert a thread's context */
void insertThread(ThreadID tid);
/** Remove all of a thread's context from CPU */
void removeThread(ThreadID tid);
/** Add Thread to Active Threads List. */
void activateContext(ThreadID tid, int delay = 0);
void activateThread(ThreadID tid);
@ -367,16 +351,28 @@ class InOrderCPU : public BaseCPU
void activateNextReadyContext(int delay = 0);
void activateNextReadyThread();
/** Remove Thread from Active Threads List */
/** Remove from Active Thread List */
void deactivateContext(ThreadID tid, int delay = 0);
void deactivateThread(ThreadID tid);
/** Suspend Thread, Remove from Active Threads List, Add to Suspend List */
void haltContext(ThreadID tid, int delay = 0);
void suspendContext(ThreadID tid, int delay = 0);
void suspendThread(ThreadID tid);
/** Remove Thread from Active Threads List &&
* Remove Thread Context from CPU.
*/
/** Remove Thread from Active Threads List, Remove Any Loaded Thread State */
void deallocateContext(ThreadID tid, int delay = 0);
void deallocateThread(ThreadID tid);
void deactivateThread(ThreadID tid);
/** squashFromMemStall() - sets up a squash event
* squashDueToMemStall() - squashes pipeline
*/
void squashFromMemStall(DynInstPtr inst, ThreadID tid, int delay = 0);
void squashDueToMemStall(int stage_num, InstSeqNum seq_num, ThreadID tid);
void removePipelineStalls(ThreadID tid);
void squashThreadInPipeline(ThreadID tid);
void squashBehindMemStall(int stage_num, InstSeqNum seq_num, ThreadID tid);
PipelineStage* getPipeStage(int stage_num);
@ -387,37 +383,6 @@ class InOrderCPU : public BaseCPU
return 0;
}
/** Remove Thread from Active Threads List &&
* Remove Thread Context from CPU.
*/
void haltContext(ThreadID tid, int delay = 0);
void removePipelineStalls(ThreadID tid);
void squashThreadInPipeline(ThreadID tid);
/// Notify the CPU to enable a virtual processor element.
virtual void enableVirtProcElement(unsigned vpe);
void enableVPEs(unsigned vpe);
/// Notify the CPU to disable a virtual processor element.
virtual void disableVirtProcElement(ThreadID tid, unsigned vpe);
void disableVPEs(ThreadID tid, unsigned vpe);
/// Notify the CPU that multithreading is enabled.
virtual void enableMultiThreading(unsigned vpe);
void enableThreads(unsigned vpe);
/// Notify the CPU that multithreading is disabled.
virtual void disableMultiThreading(ThreadID tid, unsigned vpe);
void disableThreads(ThreadID tid, unsigned vpe);
/** Activate a Thread When CPU Resources are Available. */
void activateWhenReady(ThreadID tid);
/** Add or Remove a Thread Context in the CPU. */
void doContextSwitch();
/** Update The Order In Which We Process Threads. */
void updateThreadPriority();
@ -615,21 +580,15 @@ class InOrderCPU : public BaseCPU
/** Active Threads List */
std::list<ThreadID> activeThreads;
/** Current Threads List */
std::list<ThreadID> currentThreads;
/** Ready Threads List */
std::list<ThreadID> readyThreads;
/** Suspended Threads List */
std::list<ThreadID> suspendedThreads;
/** Thread Status Functions (Unused Currently) */
bool isThreadInCPU(ThreadID tid);
/** Thread Status Functions */
bool isThreadActive(ThreadID tid);
bool isThreadSuspended(ThreadID tid);
void addToCurrentThreads(ThreadID tid);
void removeFromCurrentThreads(ThreadID tid);
private:
/** The activity recorder; used to tell if the CPU has any
@ -643,7 +602,8 @@ class InOrderCPU : public BaseCPU
ThreadID numActiveThreads() { return activeThreads.size(); }
/** Thread id of active thread
* Only used for SwitchOnCacheMiss model. Assumes only 1 thread active
* Only used for SwitchOnCacheMiss model.
* Assumes only 1 thread active
*/
ThreadID activeThreadId()
{
@ -672,9 +632,6 @@ class InOrderCPU : public BaseCPU
virtual void wakeup();
#endif
/** Gets a free thread id. Use if thread ids change across system. */
ThreadID getFreeTid();
// LL/SC debug functionality
unsigned stCondFails;
@ -740,18 +697,9 @@ class InOrderCPU : public BaseCPU
/** Per-Stage Instruction Tracing */
bool stageTracing;
/** Is there a context switch pending? */
bool contextSwitch;
/** Threads Scheduled to Enter CPU */
std::list<int> cpuWaitList;
/** The cycle that the CPU was last running, used for statistics. */
Tick lastRunningCycle;
/** Number of Virtual Processors the CPU can process */
unsigned numVirtProcs;
/** Update Thread , used for statistic purposes*/
inline void tickThreadStats();

View file

@ -583,30 +583,6 @@ InOrderDynInst::deallocateContext(int thread_num)
this->cpu->deallocateContext(thread_num);
}
void
InOrderDynInst::enableVirtProcElement(unsigned vpe)
{
this->cpu->enableVirtProcElement(vpe);
}
void
InOrderDynInst::disableVirtProcElement(unsigned vpe)
{
this->cpu->disableVirtProcElement(threadNumber, vpe);
}
void
InOrderDynInst::enableMultiThreading(unsigned vpe)
{
this->cpu->enableMultiThreading(vpe);
}
void
InOrderDynInst::disableMultiThreading(unsigned vpe)
{
this->cpu->disableMultiThreading(threadNumber, vpe);
}
template<class T>
inline Fault
InOrderDynInst::read(Addr addr, T &data, unsigned flags)

View file

@ -515,12 +515,6 @@ class InOrderDynInst : public FastAlloc, public RefCounted
////////////////////////////////////////////////////////////
virtual void deallocateContext(int thread_num);
virtual void enableVirtProcElement(unsigned vpe);
virtual void disableVirtProcElement(unsigned vpe);
virtual void enableMultiThreading(unsigned vpe);
virtual void disableMultiThreading(unsigned vpe);
////////////////////////////////////////////////////////////
//
// PROGRAM COUNTERS - PC/NPC/NPC