changeset 7eb151d3881f in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=7eb151d3881f
description:
        inorder: enforce stage bandwidth
        each stage keeps track of insts_processed on a per_thread basis but we 
should
        be keeping that on a total basis inorder to enforce stage width limits

diffstat:

3 files changed, 28 insertions(+), 12 deletions(-)
src/cpu/inorder/first_stage.cc    |   11 ++++++++---
src/cpu/inorder/pipeline_stage.cc |   22 ++++++++++++++--------
src/cpu/inorder/pipeline_stage.hh |    7 ++++++-

diffs (115 lines):

diff -r 862f3d824be7 -r 7eb151d3881f src/cpu/inorder/first_stage.cc
--- a/src/cpu/inorder/first_stage.cc    Sun Jan 31 18:28:12 2010 -0500
+++ b/src/cpu/inorder/first_stage.cc    Sun Jan 31 18:28:31 2010 -0500
@@ -175,9 +175,14 @@
             ThePipeline::createFrontEndSchedule(inst);
         }
 
-        // Don't let instruction pass to next stage if it hasnt completed
-        // all of it's requests for this stage.
-        all_reqs_completed = processInstSchedule(inst);
+        int reqs_processed = 0;            
+        all_reqs_completed = processInstSchedule(inst, reqs_processed);
+
+        // If the instruction isnt squashed & we've completed one request
+        // Then we can officially count this instruction toward the stage's 
+        // bandwidth count
+        if (reqs_processed > 0)
+            instsProcessed++;
 
         if (!all_reqs_completed) {
             if (new_inst) {
diff -r 862f3d824be7 -r 7eb151d3881f src/cpu/inorder/pipeline_stage.cc
--- a/src/cpu/inorder/pipeline_stage.cc Sun Jan 31 18:28:12 2010 -0500
+++ b/src/cpu/inorder/pipeline_stage.cc Sun Jan 31 18:28:31 2010 -0500
@@ -726,8 +726,10 @@
         nextStage->size = 0;
 
     toNextStageIndex = 0;
+    
+    sortInsts();
 
-    sortInsts();
+    instsProcessed = 0;
 
     processStage(status_change);
 
@@ -873,10 +875,8 @@
     DynInstPtr inst;
     bool last_req_completed = true;
 
-    int insts_processed = 0;
-
     while (insts_available > 0 &&
-           insts_processed < stageWidth &&
+           instsProcessed < stageWidth &&
            (!nextStageValid || canSendInstToStage(stageNum+1)) &&
            last_req_completed) {
         assert(!insts_to_stage.empty());
@@ -901,8 +901,14 @@
             continue;
         }
 
+        int reqs_processed = 0;        
+        last_req_completed = processInstSchedule(inst, reqs_processed);
 
-        last_req_completed = processInstSchedule(inst);
+        // If the instruction isnt squashed & we've completed one request
+        // Then we can officially count this instruction toward the stage's 
+        // bandwidth count
+        if (reqs_processed > 0)
+            instsProcessed++;
 
         // Don't let instruction pass to next stage if it hasnt completed
         // all of it's requests for this stage.
@@ -916,8 +922,6 @@
             break;
         }
 
-        insts_processed++;
-
         insts_to_stage.pop();
 
         //++stageProcessedInsts;
@@ -938,7 +942,7 @@
 }
 
 bool
-PipelineStage::processInstSchedule(DynInstPtr inst)
+PipelineStage::processInstSchedule(DynInstPtr inst,int &reqs_processed)
 {
     bool last_req_completed = true;
     ThreadID tid = inst->readTid();
@@ -966,6 +970,8 @@
                     panic("%i: encountered %s fault!\n",
                           curTick, req->fault->name());
                 }
+
+                reqs_processed++;                
             } else {
                 DPRINTF(InOrderStage, "[tid:%i]: [sn:%i] request to %s failed."
                         "\n", tid, inst->seqNum, cpu->resPool->name(res_num));
diff -r 862f3d824be7 -r 7eb151d3881f src/cpu/inorder/pipeline_stage.hh
--- a/src/cpu/inorder/pipeline_stage.hh Sun Jan 31 18:28:12 2010 -0500
+++ b/src/cpu/inorder/pipeline_stage.hh Sun Jan 31 18:28:31 2010 -0500
@@ -178,7 +178,7 @@
     virtual void processInsts(ThreadID tid);
 
     /** Process all resources on an instruction's resource schedule */
-    virtual bool processInstSchedule(DynInstPtr inst);
+    virtual bool processInstSchedule(DynInstPtr inst, int &reqs_processed);
 
     /** Is there room in the next stage buffer for this instruction? */
     virtual bool canSendInstToStage(unsigned stage_num);
@@ -270,6 +270,11 @@
     std::vector<DynInstPtr> switchedOutBuffer;
     std::vector<bool> switchedOutValid;
 
+    /** Instructions that we've processed this tick
+     *  NOTE: "Processed" means completed at least 1 instruction request 
+     */
+    unsigned instsProcessed;    
+
     /** Queue of all instructions coming from previous stage on this cycle. */
     std::queue<DynInstPtr> insts[ThePipeline::MaxThreads];
 
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to