changeset 40c951e58c2b in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=40c951e58c2b
description:
        cpu: Support exit when any one Trace CPU completes replay

        This change adds a Trace CPU param to exit simulation early,
        i.e. when the first (any one) trace execution is complete. With
        this change the user gets a choice to configure exit as either
        when the last CPU finishes (default) or first CPU finishes
        replay. Configuring an early exit enables simulating and
        measuring stats strictly when memory-system resources are being
        stressed by all Trace CPUs.

        Change-Id: I3998045fdcc5cd343e1ca92d18dd7f7ecdba8f1d
        Reviewed-by: Nikos Nikoleris <[email protected]>

diffstat:

 src/cpu/trace/TraceCPU.py  |   5 +++++
 src/cpu/trace/trace_cpu.cc |  27 +++++++++++++++++++++------
 src/cpu/trace/trace_cpu.hh |   6 ++++++
 3 files changed, 32 insertions(+), 6 deletions(-)

diffs (79 lines):

diff -r a96d6787b385 -r 40c951e58c2b src/cpu/trace/TraceCPU.py
--- a/src/cpu/trace/TraceCPU.py Thu Sep 15 18:01:16 2016 +0100
+++ b/src/cpu/trace/TraceCPU.py Thu Sep 15 18:01:20 2016 +0100
@@ -75,3 +75,8 @@
     # frequency as was used for generating the traces.
     freqMultiplier = Param.Float(1.0, "Multiplier scale the Trace CPU "\
                                  "frequency up or down")
+
+    # Enable exiting when any one Trace CPU completes execution which is set to
+    # false by default
+    enableEarlyExit = Param.Bool(False, "Exit when any one Trace CPU "\
+                                 "completes execution")
diff -r a96d6787b385 -r 40c951e58c2b src/cpu/trace/trace_cpu.cc
--- a/src/cpu/trace/trace_cpu.cc        Thu Sep 15 18:01:16 2016 +0100
+++ b/src/cpu/trace/trace_cpu.cc        Thu Sep 15 18:01:20 2016 +0100
@@ -61,7 +61,8 @@
         dcacheNextEvent(this),
         oneTraceComplete(false),
         traceOffset(0),
-        execCompleteEvent(nullptr)
+        execCompleteEvent(nullptr),
+        enableEarlyExit(params->enableEarlyExit)
 {
     // Increment static counter for number of Trace CPUs.
     ++TraceCPU::numTraceCPUs;
@@ -137,10 +138,16 @@
     // events using a relative tick delta
     dcacheGen.adjustInitTraceOffset(traceOffset);
 
-    // The static counter for number of Trace CPUs is correctly set at this
-    // point so create an event and pass it.
-    execCompleteEvent = new CountedExitEvent("end of all traces reached.",
-                                                numTraceCPUs);
+    // If the Trace CPU simulation is configured to exit on any one trace
+    // completion then we don't need a counted event to count down all Trace
+    // CPUs in the system. If not then instantiate a counted event.
+    if (!enableEarlyExit) {
+        // The static counter for number of Trace CPUs is correctly set at
+        // this point so create an event and pass it.
+        execCompleteEvent = new CountedExitEvent("end of all traces reached.",
+                                                 numTraceCPUs);
+    }
+
 }
 
 void
@@ -191,7 +198,15 @@
         // Schedule event to indicate execution is complete as both
         // instruction and data access traces have been played back.
         inform("%s: Execution complete.\n", name());
-        schedule(*execCompleteEvent, curTick());
+        // If the replay is configured to exit early, that is when any one
+        // execution is complete then exit immediately and return. Otherwise,
+        // schedule the counted exit that counts down completion of each Trace
+        // CPU.
+        if (enableEarlyExit) {
+            exitSimLoop("End of trace reached");
+        } else {
+            schedule(*execCompleteEvent, curTick());
+        }
     }
 }
 
diff -r a96d6787b385 -r 40c951e58c2b src/cpu/trace/trace_cpu.hh
--- a/src/cpu/trace/trace_cpu.hh        Thu Sep 15 18:01:16 2016 +0100
+++ b/src/cpu/trace/trace_cpu.hh        Thu Sep 15 18:01:20 2016 +0100
@@ -1116,6 +1116,12 @@
     */
     CountedExitEvent *execCompleteEvent;
 
+    /**
+     * Exit when any one Trace CPU completes its execution. If this is
+     * configured true then the execCompleteEvent is not scheduled.
+     */
+    const bool enableEarlyExit;
+
     Stats::Scalar numSchedDcacheEvent;
     Stats::Scalar numSchedIcacheEvent;
 
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to