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:
parent
e2805f825a
commit
48333e7e3f
3 changed files with 36 additions and 4 deletions
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue