Fix default SMT configuration in O3CPU (i.e. fetch policy, workloads/numThreads)
authorKorey Sewell <ksewell@umich.edu>
Mon, 3 Jul 2006 03:11:24 +0000 (23:11 -0400)
committerKorey Sewell <ksewell@umich.edu>
Mon, 3 Jul 2006 03:11:24 +0000 (23:11 -0400)
Edit Test3 for newmem

src/base/traceflags.py:
    Add O3CPU flag
src/cpu/base.cc:
    for some reason adding a BaseCPU flag doesnt work so just go back to old way...
src/cpu/o3/alpha/cpu_builder.cc:
    Determine number threads by workload size instead of solely by parameter.

    Default SMT fetch policy to RoundRobin if it's not specified in Config file
src/cpu/o3/commit.hh:
    only use nextNPC for !ALPHA
src/cpu/o3/commit_impl.hh:
    add FetchTrapPending as condition for commit
src/cpu/o3/cpu.cc:
    panic if active threads is more than Impl::MaxThreads
src/cpu/o3/fetch.hh:
src/cpu/o3/inst_queue.hh:
src/cpu/o3/inst_queue_impl.hh:
src/cpu/o3/rob.hh:
src/cpu/o3/rob_impl.hh:
    name stuff
src/cpu/o3/fetch_impl.hh:
    fatal if try to use SMT branch count, that's unimplemented right now
src/python/m5/config.py:
    make it clearer that a parameter is not valid within a configuration class

--HG--
extra : convert_revision : 55069847304e40e257f9225f0dc3894ce6491b34

12 files changed:
src/base/traceflags.py
src/cpu/base.cc
src/cpu/o3/alpha/cpu_builder.cc
src/cpu/o3/commit.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.cc
src/cpu/o3/fetch_impl.hh
src/cpu/o3/inst_queue.hh
src/cpu/o3/inst_queue_impl.hh
src/cpu/o3/rob.hh
src/cpu/o3/rob_impl.hh
src/python/m5/config.py

index d51236c46fb5d25a23954a160adac9d0dda1c44d..327ce60757a106e3a5183e04056a3d83acdca93f 100644 (file)
@@ -121,6 +121,7 @@ baseFlags = [
     'FE',
     'IBE',
     'BE',
+    'O3CPU',
     'OzoneLSQ',
     'PCEvent',
     'PCIA',
index 9df61d2ced8094aeac28b8e61a69485c1c1dd910..40cec416be2b2eda35fe4c646cadb10af198f581 100644 (file)
@@ -68,12 +68,12 @@ BaseCPU::BaseCPU(Params *p)
       number_of_threads(p->numberOfThreads), system(p->system)
 #endif
 {
-    DPRINTF(BaseCPU, "BaseCPU: Creating object, mem address %#x.\n", this);
+    DPRINTF(FullCPU, "BaseCPU: Creating object, mem address %#x.\n", this);
 
     // add self to global list of CPUs
     cpuList.push_back(this);
 
-    DPRINTF(BaseCPU, "BaseCPU: CPU added to cpuList, mem address %#x.\n",
+    DPRINTF(FullCPU, "BaseCPU: CPU added to cpuList, mem address %#x.\n",
             this);
 
     if (number_of_threads > maxThreadsPerCPU)
index 8190256fbfcf6db41147e1193ebceb4551dacce1..12d083a436a5e676ff548f7840de8f2b431dc6d6 100644 (file)
@@ -274,12 +274,12 @@ CREATE_SIM_OBJECT(DerivO3CPU)
     // In non-full-system mode, we infer the number of threads from
     // the workload if it's not explicitly specified.
     int actual_num_threads =
-        numThreads.isValid() ? numThreads : workload.size();
+        (numThreads.isValid() && numThreads >= workload.size()) ?
+         numThreads : workload.size();
 
     if (workload.size() == 0) {
         fatal("Must specify at least one workload!");
     }
-
 #endif
 
     AlphaSimpleParams *params = new AlphaSimpleParams;
@@ -371,7 +371,16 @@ CREATE_SIM_OBJECT(DerivO3CPU)
     params->numROBEntries = numROBEntries;
 
     params->smtNumFetchingThreads = smtNumFetchingThreads;
-    params->smtFetchPolicy = smtFetchPolicy;
+
+    // Default smtFetchPolicy to "RoundRobin", if necessary.
+    std::string round_robin_policy = "RoundRobin";
+    std::string single_thread = "SingleThread";
+
+    if (actual_num_threads > 1 && single_thread.compare(smtFetchPolicy) == 0)
+        params->smtFetchPolicy = single_thread;
+    else
+        params->smtFetchPolicy = smtFetchPolicy;
+
     params->smtIQPolicy    = smtIQPolicy;
     params->smtLSQPolicy    = smtLSQPolicy;
     params->smtLSQThreshold = smtLSQThreshold;
index 860326283380866474a50b9bbc7dbac8d3bcce85..60b555269ec6bc87e10fb9e31dd56df010756010 100644 (file)
@@ -406,8 +406,10 @@ class DefaultCommit
     /** The next PC of each thread. */
     Addr nextPC[Impl::MaxThreads];
 
+#if THE_ISA != ALPHA_ISA
     /** The next NPC of each thread. */
     Addr nextNPC[Impl::MaxThreads];
+#endif
 
     /** The sequence number of the youngest valid instruction in the ROB. */
     InstSeqNum youngestSeqNum[Impl::MaxThreads];
index cd7dd47d48b259aadb3828b4bc285f37c266167d..06b8e8a954c53ac197d64f7730cc9c9325ece97e 100644 (file)
@@ -1221,7 +1221,8 @@ DefaultCommit<Impl>::roundRobin()
         unsigned tid = *pri_iter;
 
         if (commitStatus[tid] == Running ||
-            commitStatus[tid] == Idle) {
+            commitStatus[tid] == Idle ||
+            commitStatus[tid] == FetchTrapPending) {
 
             if (rob->isHeadReady(tid)) {
                 priority_list.erase(pri_iter);
index 7ed17a91e88f2732311d6daebbfa25e3cebe9f14..feca4cdf2f34ef7ee741fd078f649cc37e65e778 100644 (file)
@@ -127,7 +127,7 @@ FullO3CPU<Impl>::FullO3CPU(Params *params)
 
       regFile(params->numPhysIntRegs, params->numPhysFloatRegs),
 
-      freeList(params->numberOfThreads,//number of activeThreads
+      freeList(params->numberOfThreads,
                TheISA::NumIntRegs, params->numPhysIntRegs,
                TheISA::NumFloatRegs, params->numPhysFloatRegs),
 
@@ -135,7 +135,7 @@ FullO3CPU<Impl>::FullO3CPU(Params *params)
           params->smtROBPolicy, params->smtROBThreshold,
           params->numberOfThreads),
 
-      scoreboard(params->numberOfThreads,//number of activeThreads
+      scoreboard(params->numberOfThreads,
                  TheISA::NumIntRegs, params->numPhysIntRegs,
                  TheISA::NumFloatRegs, params->numPhysFloatRegs,
                  TheISA::NumMiscRegs * number_of_threads,
@@ -221,6 +221,12 @@ FullO3CPU<Impl>::FullO3CPU(Params *params)
 
 #if !FULL_SYSTEM
     int active_threads = params->workload.size();
+
+    if (active_threads > Impl::MaxThreads) {
+        panic("Workload Size too large. Increase the 'MaxThreads'"
+              "constant in your O3CPU impl. file (e.g. o3/alpha/impl.hh) or "
+              "edit your workload size.");
+    }
 #else
     int active_threads = 1;
 #endif
index e570dbb18dd3ee29daff6f1c93e2ae17b79edc20..60eb76d1784ba2e7f0a0e063b551b5888b486126 100644 (file)
@@ -114,8 +114,6 @@ DefaultFetch<Impl>::DefaultFetch(Params *params)
     if (numThreads > Impl::MaxThreads)
         fatal("numThreads is not a valid value\n");
 
-    DPRINTF(Fetch, "Fetch constructor called\n");
-
     // Set fetch stage's status to inactive.
     _status = Inactive;
 
@@ -128,6 +126,8 @@ DefaultFetch<Impl>::DefaultFetch(Params *params)
     // Figure out fetch policy
     if (policy == "singlethread") {
         fetchPolicy = SingleThread;
+        if (numThreads > 1)
+            panic("Invalid Fetch Policy for a SMT workload.");
     } else if (policy == "roundrobin") {
         fetchPolicy = RoundRobin;
         DPRINTF(Fetch, "Fetch policy set to Round Robin\n");
@@ -559,7 +559,7 @@ DefaultFetch<Impl>::fetchCacheLine(Addr fetch_PC, Fault &ret_fault, unsigned tid
             return false;
         }
 
-        DPRINTF(Fetch, "Doing cache access.\n");
+        DPRINTF(Fetch, "[tid:%i]: Doing cache access.\n", tid);
 
         lastIcacheStall[tid] = curTick;
 
@@ -724,12 +724,15 @@ DefaultFetch<Impl>::tick()
     // Reset the number of the instruction we're fetching.
     numInst = 0;
 
+#if FULL_SYSTEM
     if (fromCommit->commitInfo[0].interruptPending) {
         interruptPending = true;
     }
+
     if (fromCommit->commitInfo[0].clearInterrupt) {
         interruptPending = false;
     }
+#endif
 
     for (threadFetched = 0; threadFetched < numFetchingThreads;
          threadFetched++) {
@@ -903,6 +906,8 @@ DefaultFetch<Impl>::fetch(bool &status_change)
         return;
     }
 
+    DPRINTF(Fetch, "Attempting to fetch from [tid:%i]\n", tid);
+
     // The current PC.
     Addr &fetch_PC = PC[tid];
 
@@ -1279,6 +1284,6 @@ int
 DefaultFetch<Impl>::branchCount()
 {
     list<unsigned>::iterator threads = (*activeThreads).begin();
-    warn("Branch Count Fetch policy unimplemented\n");
+    panic("Branch Count Fetch policy unimplemented\n");
     return *threads;
 }
index d745faf7bdbdf907998baf9b68b2b2d7231c8011..4c69ca3844bcf285745e3b767207ce00c0f97ad5 100644 (file)
@@ -26,6 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Kevin Lim
+ *          Korey Sewell
  */
 
 #ifndef __CPU_O3_INST_QUEUE_HH__
index 1ef1b2cffe8084594fd6a93a1c076aeaa7bd9a5d..b99bd0900008e0d5a250266eeb2bf72d9bc13297 100644 (file)
@@ -26,6 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Kevin Lim
+ *          Korey Sewell
  */
 
 #include <limits>
@@ -125,7 +126,7 @@ InstructionQueue<Impl>::InstructionQueue(Params *params)
             maxEntries[i] = part_amt;
         }
 
-        DPRINTF(Fetch, "IQ sharing policy set to Partitioned:"
+        DPRINTF(IQ, "IQ sharing policy set to Partitioned:"
                 "%i entries per thread.\n",part_amt);
 
     } else if (policy == "threshold") {
@@ -140,7 +141,7 @@ InstructionQueue<Impl>::InstructionQueue(Params *params)
             maxEntries[i] = thresholdIQ;
         }
 
-        DPRINTF(Fetch, "IQ sharing policy set to Threshold:"
+        DPRINTF(IQ, "IQ sharing policy set to Threshold:"
                 "%i entries per thread.\n",thresholdIQ);
    } else {
        assert(0 && "Invalid IQ Sharing Policy.Options Are:{Dynamic,"
index b98d7c4c2a8d7d0cc0e32f469417ded1cbbdd6a2..6f8080ef4498222680dbd8e6078fbc78d72db4fa 100644 (file)
@@ -26,6 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Kevin Lim
+ *          Korey Sewell
  */
 
 #ifndef __CPU_O3_ROB_HH__
index 6277dd68be23e3a883f79efbc0ffd9e87b34d087..d9978b17f7ef4bb2db9c6183a33643b769a95a1f 100644 (file)
@@ -26,6 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Kevin Lim
+ *          Korey Sewell
  */
 
 #include "config/full_system.hh"
index adabe07439b07503549e9fa91f7282ca5769ee46..6f2873d40b59cb8227255c7d8e4853ae4d555da8 100644 (file)
@@ -274,7 +274,7 @@ class MetaSimObject(type):
             cls._values[attr] = value
         else:
             raise AttributeError, \
-                  "Class %s has no parameter %s" % (cls.__name__, attr)
+                  "Class %s has no parameter \'%s\'" % (cls.__name__, attr)
 
     def __getattr__(cls, attr):
         if cls._values.has_key(attr):