summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorKorey Sewell <ksewell@umich.edu>2011-06-19 21:43:38 -0400
committerKorey Sewell <ksewell@umich.edu>2011-06-19 21:43:38 -0400
commit22ba1718c4c36b5abd5fdc8ce32792f5dfdd4fc1 (patch)
tree6518123e144dee30a15428df3ad4e5c66051b5a3 /src/cpu
parente8082a28c8ee36d6e7e1982952fc545224eb33e7 (diff)
downloadgem5-22ba1718c4c36b5abd5fdc8ce32792f5dfdd4fc1.tar.xz
inorder: cleanup events in resource pool
remove events in the resource pool that can be called from the CPU event, since the CPU event is scheduled at the same time at the resource pool event. ---- Also, match the resPool event function names to the cpu event function names ----
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/inorder/cpu.cc8
-rw-r--r--src/cpu/inorder/resource_pool.cc100
-rw-r--r--src/cpu/inorder/resource_pool.hh11
3 files changed, 22 insertions, 97 deletions
diff --git a/src/cpu/inorder/cpu.cc b/src/cpu/inorder/cpu.cc
index 75e9e06d9..7ef48608a 100644
--- a/src/cpu/inorder/cpu.cc
+++ b/src/cpu/inorder/cpu.cc
@@ -117,6 +117,7 @@ InOrderCPU::CPUEvent::process()
{
case ActivateThread:
cpu->activateThread(tid);
+ cpu->resPool->activateThread(tid);
break;
case ActivateNextReadyThread:
@@ -125,18 +126,23 @@ InOrderCPU::CPUEvent::process()
case DeactivateThread:
cpu->deactivateThread(tid);
+ cpu->resPool->deactivateThread(tid);
break;
case HaltThread:
cpu->haltThread(tid);
+ cpu->resPool->deactivateThread(tid);
break;
case SuspendThread:
cpu->suspendThread(tid);
+ cpu->resPool->suspendThread(tid);
break;
case SquashFromMemStall:
cpu->squashDueToMemStall(inst->squashingStage, inst->seqNum, tid);
+ cpu->resPool->squashDueToMemStall(inst, inst->squashingStage,
+ inst->seqNum, tid);
break;
case Trap:
@@ -896,7 +902,7 @@ InOrderCPU::activateNextReadyThread()
activateThread(ready_tid);
// Activate in Resource Pool
- resPool->activateAll(ready_tid);
+ resPool->activateThread(ready_tid);
list<ThreadID>::iterator ready_it =
std::find(readyThreads.begin(), readyThreads.end(), ready_tid);
diff --git a/src/cpu/inorder/resource_pool.cc b/src/cpu/inorder/resource_pool.cc
index 6640d6c0e..a8a26f51e 100644
--- a/src/cpu/inorder/resource_pool.cc
+++ b/src/cpu/inorder/resource_pool.cc
@@ -86,6 +86,7 @@ ResourcePool::ResourcePool(InOrderCPU *_cpu, ThePipeline::Params *params)
stage_width * 2 + MaxThreads, 0, _cpu,
params));
+ gradObjects.push_back(BPred);
resources.push_back(new GraduationUnit("graduation_unit", Grad,
stage_width, 0, _cpu,
params));
@@ -274,59 +275,6 @@ ResourcePool::scheduleEvent(InOrderCPU::CPUEventType e_type, DynInstPtr inst,
switch ((int)e_type)
{
- case InOrderCPU::ActivateThread:
- {
- DPRINTF(Resource, "Scheduling Activate Thread Resource Pool Event "
- "for tick %i, [tid:%i].\n", curTick() + delay,
- inst->readTid());
- ResPoolEvent *res_pool_event =
- new ResPoolEvent(this,
- e_type,
- inst,
- inst->squashingStage,
- inst->squashSeqNum,
- inst->readTid());
- cpu->schedule(res_pool_event, when);
- }
- break;
-
- case InOrderCPU::HaltThread:
- case InOrderCPU::DeactivateThread:
- {
-
- DPRINTF(Resource, "Scheduling Deactivate Thread Resource Pool "
- "Event for tick %i.\n", curTick() + delay);
- ResPoolEvent *res_pool_event =
- new ResPoolEvent(this,
- e_type,
- inst,
- inst->squashingStage,
- inst->squashSeqNum,
- tid);
-
- cpu->schedule(res_pool_event, when);
- }
- break;
-
- case InOrderCPU::SuspendThread:
- {
- // not sure why we add another nextCycle() call here...
- Tick sked_tick = cpu->nextCycle(when);
-
- DPRINTF(Resource, "Scheduling Suspend Thread Resource Pool "
- "Event for tick %i.\n", sked_tick);
-
- ResPoolEvent *res_pool_event = new ResPoolEvent(this,
- e_type,
- inst,
- inst->squashingStage,
- inst->squashSeqNum,
- tid);
-
- cpu->schedule(res_pool_event, sked_tick);
- }
- break;
-
case ResourcePool::InstGraduated:
{
DPRINTF(Resource, "Scheduling Inst-Graduated Resource Pool "
@@ -361,22 +309,6 @@ ResourcePool::scheduleEvent(InOrderCPU::CPUEventType e_type, DynInstPtr inst,
}
break;
- case InOrderCPU::SquashFromMemStall:
- {
- DPRINTF(Resource, "Scheduling Squash Due to Memory Stall Resource "
- "Pool Event for tick %i.\n",
- curTick() + delay);
- ResPoolEvent *res_pool_event =
- new ResPoolEvent(this,
- e_type,
- inst,
- inst->squashingStage,
- inst->seqNum - 1,
- inst->readTid());
- cpu->schedule(res_pool_event, when);
- }
- break;
-
case ResourcePool::UpdateAfterContextSwitch:
{
DPRINTF(Resource, "Scheduling UpdatePC Resource Pool Event "
@@ -436,7 +368,7 @@ ResourcePool::squashDueToMemStall(DynInstPtr inst, int stage_num,
}
void
-ResourcePool::activateAll(ThreadID tid)
+ResourcePool::activateThread(ThreadID tid)
{
bool do_activate = cpu->threadModel != InOrderCPU::SwitchOnCacheMiss ||
cpu->numActiveThreads() < 1 ||
@@ -459,7 +391,7 @@ ResourcePool::activateAll(ThreadID tid)
}
void
-ResourcePool::deactivateAll(ThreadID tid)
+ResourcePool::deactivateThread(ThreadID tid)
{
DPRINTF(Resource, "[tid:%i] Broadcasting Thread Deactivation to all "
"resources.\n", tid);
@@ -472,7 +404,7 @@ ResourcePool::deactivateAll(ThreadID tid)
}
void
-ResourcePool::suspendAll(ThreadID tid)
+ResourcePool::suspendThread(ThreadID tid)
{
DPRINTF(Resource, "[tid:%i] Broadcasting Thread Suspension to all "
"resources.\n", tid);
@@ -487,13 +419,13 @@ ResourcePool::suspendAll(ThreadID tid)
void
ResourcePool::instGraduated(InstSeqNum seq_num, ThreadID tid)
{
- DPRINTF(Resource, "[tid:%i] Broadcasting [sn:%i] graduation to all "
- "resources.\n", tid, seq_num);
+ DPRINTF(Resource, "[tid:%i] Broadcasting [sn:%i] graduation to "
+ "appropriate resources.\n", tid, seq_num);
- int num_resources = resources.size();
+ int num_resources = gradObjects.size();
for (int idx = 0; idx < num_resources; idx++) {
- resources[idx]->instGraduated(seq_num, tid);
+ resources[gradObjects[idx]]->instGraduated(seq_num, tid);
}
}
@@ -528,18 +460,6 @@ ResourcePool::ResPoolEvent::process()
{
switch ((int)eventType)
{
- case InOrderCPU::ActivateThread:
- resPool->activateAll(tid);
- break;
-
- case InOrderCPU::DeactivateThread:
- case InOrderCPU::HaltThread:
- resPool->deactivateAll(tid);
- break;
-
- case InOrderCPU::SuspendThread:
- resPool->suspendAll(tid);
- break;
case ResourcePool::InstGraduated:
resPool->instGraduated(seqNum, tid);
@@ -549,10 +469,6 @@ ResourcePool::ResPoolEvent::process()
resPool->squashAll(inst, stageNum, seqNum, tid);
break;
- case InOrderCPU::SquashFromMemStall:
- resPool->squashDueToMemStall(inst, stageNum, seqNum, tid);
- break;
-
case ResourcePool::UpdateAfterContextSwitch:
resPool->updateAfterContextSwitch(inst, tid);
break;
diff --git a/src/cpu/inorder/resource_pool.hh b/src/cpu/inorder/resource_pool.hh
index ba3d6fafb..e892d750a 100644
--- a/src/cpu/inorder/resource_pool.hh
+++ b/src/cpu/inorder/resource_pool.hh
@@ -175,13 +175,13 @@ class ResourcePool {
InstSeqNum done_seq_num, ThreadID tid);
/** Activate Thread in all resources */
- void activateAll(ThreadID tid);
+ void activateThread(ThreadID tid);
/** De-Activate Thread in all resources */
- void deactivateAll(ThreadID tid);
+ void deactivateThread(ThreadID tid);
- /** De-Activate Thread in all resources */
- void suspendAll(ThreadID tid);
+ /** Suspend Thread in all resources */
+ void suspendThread(ThreadID tid);
/** Broadcast Context Switch Update to all resources */
void updateAfterContextSwitch(DynInstPtr inst, ThreadID tid);
@@ -218,8 +218,11 @@ class ResourcePool {
private:
std::vector<Resource *> resources;
+ /** Resources that interface with memory objects */
std::vector<int> memObjects;
+ /** Resources that need to be updated on an inst. graduation */
+ std::vector<int> gradObjects;
};
#endif //__CPU_INORDER_RESOURCE_HH__