From 48333e7e3f5282bd2b5505b400ad5b06d6785371 Mon Sep 17 00:00:00 2001 From: Radhika Jagtap Date: Tue, 16 Aug 2016 14:14:58 +0100 Subject: [PATCH] cpu: Print progress messages in Trace CPU This change adds the ability to print a message at intervals of committed instruction count to indicate progress in the trace replay. Change-Id: I8363502354c42bfc52936d2627986598b63a5797 Reviewed-by: Rekai Gonzalez Alberquilla Signed-off-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/2321 Reviewed-by: Jason Lowe-Power --- src/cpu/trace/TraceCPU.py | 7 +++++++ src/cpu/trace/trace_cpu.cc | 18 +++++++++++++++--- src/cpu/trace/trace_cpu.hh | 15 ++++++++++++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/cpu/trace/TraceCPU.py b/src/cpu/trace/TraceCPU.py index 3ec5795e3..e108b1a50 100644 --- a/src/cpu/trace/TraceCPU.py +++ b/src/cpu/trace/TraceCPU.py @@ -80,3 +80,10 @@ class TraceCPU(BaseCPU): # false by default enableEarlyExit = Param.Bool(False, "Exit when any one Trace CPU "\ "completes execution") + + # If progress msg interval is set to a non-zero value, it is treated as + # the interval of committed instructions at which an info message is + # printed. + progressMsgInterval = Param.Unsigned(0, "Interval of committed "\ + "instructions at which to print a"\ + " progress msg") diff --git a/src/cpu/trace/trace_cpu.cc b/src/cpu/trace/trace_cpu.cc index 44da7df1e..7b59b49e0 100644 --- a/src/cpu/trace/trace_cpu.cc +++ b/src/cpu/trace/trace_cpu.cc @@ -62,13 +62,15 @@ TraceCPU::TraceCPU(TraceCPUParams *params) oneTraceComplete(false), traceOffset(0), execCompleteEvent(nullptr), - enableEarlyExit(params->enableEarlyExit) + enableEarlyExit(params->enableEarlyExit), + progressMsgInterval(params->progressMsgInterval), + progressMsgThreshold(params->progressMsgInterval) { // Increment static counter for number of Trace CPUs. ++TraceCPU::numTraceCPUs; - // Check that the python parameters for sizes of ROB, store buffer and load - // buffer do not overflow the corresponding C++ variables. + // Check that the python parameters for sizes of ROB, store buffer and + // load buffer do not overflow the corresponding C++ variables. fatal_if(params->sizeROB > UINT16_MAX, "ROB size set to %d exceeds the " "max. value of %d.\n", params->sizeROB, UINT16_MAX); fatal_if(params->sizeStoreBuffer > UINT16_MAX, "ROB size set to %d " @@ -90,6 +92,16 @@ TraceCPUParams::create() return new TraceCPU(this); } +void +TraceCPU::updateNumOps(uint64_t rob_num) +{ + numOps = rob_num; + if (progressMsgInterval != 0 && numOps.value() >= progressMsgThreshold) { + inform("%s: %i insts committed\n", name(), progressMsgThreshold); + progressMsgThreshold += progressMsgInterval; + } +} + void TraceCPU::takeOverFrom(BaseCPU *oldCPU) { diff --git a/src/cpu/trace/trace_cpu.hh b/src/cpu/trace/trace_cpu.hh index 846a3e7c5..07c739c57 100644 --- a/src/cpu/trace/trace_cpu.hh +++ b/src/cpu/trace/trace_cpu.hh @@ -177,7 +177,7 @@ class TraceCPU : public BaseCPU * Set the no. of ops when elastic data generator completes executing a * node. */ - void updateNumOps(uint64_t rob_num) { numOps = rob_num; } + void updateNumOps(uint64_t rob_num); /* Pure virtual function in BaseCPU. Do nothing. */ void wakeup(ThreadID tid = 0) @@ -1122,6 +1122,19 @@ class TraceCPU : public BaseCPU */ const bool enableEarlyExit; + /** + * Interval of committed instructions specified by the user at which a + * progress info message is printed + */ + const uint64_t progressMsgInterval; + + /* + * The progress msg threshold is kept updated to the next multiple of the + * progress msg interval. As soon as the threshold is reached, an info + * message is printed. + */ + uint64_t progressMsgThreshold; + Stats::Scalar numSchedDcacheEvent; Stats::Scalar numSchedIcacheEvent;