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 <rekai.gonzalezalberquilla@arm.com>
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/2321
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Radhika Jagtap 2016-08-16 14:14:58 +01:00 committed by Andreas Sandberg
parent e2805f825a
commit 48333e7e3f
3 changed files with 36 additions and 4 deletions

View file

@ -80,3 +80,10 @@ class TraceCPU(BaseCPU):
# false by default # false by default
enableEarlyExit = Param.Bool(False, "Exit when any one Trace CPU "\ enableEarlyExit = Param.Bool(False, "Exit when any one Trace CPU "\
"completes execution") "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")

View file

@ -62,13 +62,15 @@ TraceCPU::TraceCPU(TraceCPUParams *params)
oneTraceComplete(false), oneTraceComplete(false),
traceOffset(0), traceOffset(0),
execCompleteEvent(nullptr), execCompleteEvent(nullptr),
enableEarlyExit(params->enableEarlyExit) enableEarlyExit(params->enableEarlyExit),
progressMsgInterval(params->progressMsgInterval),
progressMsgThreshold(params->progressMsgInterval)
{ {
// Increment static counter for number of Trace CPUs. // Increment static counter for number of Trace CPUs.
++TraceCPU::numTraceCPUs; ++TraceCPU::numTraceCPUs;
// Check that the python parameters for sizes of ROB, store buffer and load // Check that the python parameters for sizes of ROB, store buffer and
// buffer do not overflow the corresponding C++ variables. // load buffer do not overflow the corresponding C++ variables.
fatal_if(params->sizeROB > UINT16_MAX, "ROB size set to %d exceeds the " fatal_if(params->sizeROB > UINT16_MAX, "ROB size set to %d exceeds the "
"max. value of %d.\n", params->sizeROB, UINT16_MAX); "max. value of %d.\n", params->sizeROB, UINT16_MAX);
fatal_if(params->sizeStoreBuffer > UINT16_MAX, "ROB size set to %d " fatal_if(params->sizeStoreBuffer > UINT16_MAX, "ROB size set to %d "
@ -90,6 +92,16 @@ TraceCPUParams::create()
return new TraceCPU(this); 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 void
TraceCPU::takeOverFrom(BaseCPU *oldCPU) TraceCPU::takeOverFrom(BaseCPU *oldCPU)
{ {

View file

@ -177,7 +177,7 @@ class TraceCPU : public BaseCPU
* Set the no. of ops when elastic data generator completes executing a * Set the no. of ops when elastic data generator completes executing a
* node. * node.
*/ */
void updateNumOps(uint64_t rob_num) { numOps = rob_num; } void updateNumOps(uint64_t rob_num);
/* Pure virtual function in BaseCPU. Do nothing. */ /* Pure virtual function in BaseCPU. Do nothing. */
void wakeup(ThreadID tid = 0) void wakeup(ThreadID tid = 0)
@ -1122,6 +1122,19 @@ class TraceCPU : public BaseCPU
*/ */
const bool enableEarlyExit; 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 numSchedDcacheEvent;
Stats::Scalar numSchedIcacheEvent; Stats::Scalar numSchedIcacheEvent;