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
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")

View file

@ -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)
{

View file

@ -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;