sim: Convert power modelling framework to new-style stats

Change-Id: I1dd3ea3d37bb4464637222aa5bc5d88cc7d9b66a
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21143
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
This commit is contained in:
Andreas Sandberg
2019-09-23 18:21:20 +01:00
parent 7e52bf014a
commit 911c095935
6 changed files with 90 additions and 81 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2014 ARM Limited
* Copyright (c) 2013-2014, 2019 ARM Limited
* Copyright (c) 2013 Cornell University
* All rights reserved
*
@@ -55,20 +55,21 @@
#include "sim/clocked_object.hh"
#include "sim/voltage_domain.hh"
void
ClockDomain::regStats()
ClockDomain::ClockDomainStats::ClockDomainStats(ClockDomain &cd)
: Stats::Group(&cd),
ADD_STAT(clock, "Clock period in ticks")
{
SimObject::regStats();
using namespace Stats;
// Expose the current clock period as a stat for observability in
// the dumps
currentClock
.scalar(_clockPeriod)
.name(params()->name + ".clock")
.desc("Clock period in ticks")
;
clock.scalar(cd._clockPeriod);
}
ClockDomain::ClockDomain(const Params *p, VoltageDomain *voltage_domain)
: SimObject(p),
_clockPeriod(0),
_voltageDomain(voltage_domain),
stats(*this)
{
}
double

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2014 ARM Limited
* Copyright (c) 2013-2014, 2019 ARM Limited
* Copyright (c) 2013 Cornell University
* All rights reserved
*
@@ -72,14 +72,6 @@ class Clocked;
*/
class ClockDomain : public SimObject
{
private:
/**
* Stat to report clock period of clock domain
*/
Stats::Value currentClock;
protected:
/**
@@ -108,12 +100,7 @@ class ClockDomain : public SimObject
public:
typedef ClockDomainParams Params;
ClockDomain(const Params *p, VoltageDomain *voltage_domain) :
SimObject(p),
_clockPeriod(0),
_voltageDomain(voltage_domain) {}
void regStats();
ClockDomain(const Params *p, VoltageDomain *voltage_domain);
/**
* Get the clock period.
@@ -157,6 +144,16 @@ class ClockDomain : public SimObject
void addDerivedDomain(DerivedClockDomain *clock_domain)
{ children.push_back(clock_domain); }
private:
struct ClockDomainStats : public Stats::Group
{
ClockDomainStats(ClockDomain &cd);
/**
* Stat to report clock period of clock domain
*/
Stats::Value clock;
} stats;
};
/**

View File

@@ -46,7 +46,8 @@
ClockedObject::ClockedObject(const ClockedObjectParams *p) :
SimObject(p), Clocked(*p->clk_domain),
_currPwrState(p->default_p_state),
prvEvalTick(0)
prvEvalTick(0),
stats(*this)
{
// Register the power_model with the object
for (auto & power_model: p->power_model)
@@ -103,7 +104,7 @@ ClockedObject::pwrState(Enums::PwrState p)
_currPwrState = p;
numPwrStateTransitions++;
stats.numPwrStateTransitions++;
}
void
@@ -112,13 +113,13 @@ ClockedObject::computeStats()
// Calculate time elapsed from last (valid) state change
Tick elapsed_time = curTick() - prvEvalTick;
pwrStateResidencyTicks[_currPwrState] += elapsed_time;
stats.pwrStateResidencyTicks[_currPwrState] += elapsed_time;
// Time spent in CLK_GATED state, this might change depending on
// transition to other low power states in respective simulation
// objects.
if (_currPwrState == Enums::PwrState::CLK_GATED) {
pwrStateClkGateDist.sample(elapsed_time);
stats.pwrStateClkGateDist.sample(elapsed_time);
}
prvEvalTick = curTick();
@@ -130,7 +131,7 @@ ClockedObject::pwrStateWeights() const
// Get residency stats
std::vector<double> ret;
Stats::VCounter residencies;
pwrStateResidencyTicks.value(residencies);
stats.pwrStateResidencyTicks.value(residencies);
// Account for current state too!
Tick elapsed_time = curTick() - prvEvalTick;
@@ -139,38 +140,45 @@ ClockedObject::pwrStateWeights() const
ret.resize(Enums::PwrState::Num_PwrState);
for (unsigned i = 0; i < Enums::PwrState::Num_PwrState; i++)
ret[i] = residencies[i] / \
(pwrStateResidencyTicks.total() + elapsed_time);
(stats.pwrStateResidencyTicks.total() + elapsed_time);
return ret;
}
void
ClockedObject::regStats()
ClockedObject::ClockedObjectStats::ClockedObjectStats(ClockedObject &co)
: Stats::Group(&co),
clockedObject(co),
ADD_STAT(numPwrStateTransitions,
"Number of power state transitions"),
ADD_STAT(pwrStateClkGateDist,
"Distribution of time spent in the clock gated state"),
ADD_STAT(pwrStateResidencyTicks,
"Cumulative time (in ticks) in various power states")
{
SimObject::regStats();
}
void
ClockedObject::ClockedObjectStats::regStats()
{
Stats::Group::regStats();
using namespace Stats;
numPwrStateTransitions
.name(params()->name + ".numPwrStateTransitions")
.desc("Number of power state transitions")
.flags(nozero)
;
const ClockedObjectParams *p = clockedObject.params();
numPwrStateTransitions.flags(nozero);
// Each sample is time in ticks
unsigned num_bins = std::max(params()->p_state_clk_gate_bins, 10U);
unsigned num_bins = std::max(p->p_state_clk_gate_bins, 10U);
pwrStateClkGateDist
.init(params()->p_state_clk_gate_min, params()->p_state_clk_gate_max,
(params()->p_state_clk_gate_max / num_bins))
.name(params()->name + ".pwrStateClkGateDist")
.desc("Distribution of time spent in the clock gated state")
.init(p->p_state_clk_gate_min, p->p_state_clk_gate_max,
(p->p_state_clk_gate_max / num_bins))
.flags(pdf | nozero | nonan)
;
pwrStateResidencyTicks
.init(Enums::PwrState::Num_PwrState)
.name(params()->name + ".pwrStateResidencyTicks")
.desc("Cumulative time (in ticks) in various power states")
.flags(nozero)
;
for (int i = 0; i < Enums::PwrState::Num_PwrState; i++) {
@@ -178,6 +186,12 @@ ClockedObject::regStats()
}
numPwrStateTransitions = 0;
}
void
ClockedObject::ClockedObjectStats::preDumpStats()
{
Stats::Group::preDumpStats();
/**
* For every stats dump, the power state residency and other distribution
@@ -187,5 +201,5 @@ ClockedObject::regStats()
* next dump window which might have rather unpleasant effects (like
* perturbing the distribution stats).
*/
registerDumpCallback(new ClockedObjectDumpCallback(this));
clockedObject.computeStats();
}

View File

@@ -270,7 +270,6 @@ class ClockedObject : public SimObject, public Clocked
void computeStats();
void pwrState(Enums::PwrState);
void regStats() override;
protected:
@@ -279,18 +278,18 @@ class ClockedObject : public SimObject, public Clocked
Tick prvEvalTick;
Stats::Scalar numPwrStateTransitions;
Stats::Distribution pwrStateClkGateDist;
Stats::Vector pwrStateResidencyTicks;
struct ClockedObjectStats : public Stats::Group
{
ClockedObjectStats(ClockedObject &co);
};
void regStats() override;
void preDumpStats() override;
class ClockedObjectDumpCallback : public Callback
{
ClockedObject *co;
public:
ClockedObjectDumpCallback(ClockedObject *co_t) : co(co_t) {}
virtual void process() { co->computeStats(); };
ClockedObject &clockedObject;
Stats::Scalar numPwrStateTransitions;
Stats::Distribution pwrStateClkGateDist;
Stats::Vector pwrStateResidencyTicks;
} stats;
};
#endif //__SIM_CLOCKED_OBJECT_HH__

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2014 ARM Limited
* Copyright (c) 2012-2014, 2019 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -49,7 +49,7 @@
#include "sim/sim_object.hh"
VoltageDomain::VoltageDomain(const Params *p)
: SimObject(p), voltageOpPoints(p->voltage), _perfLevel(0)
: SimObject(p), voltageOpPoints(p->voltage), _perfLevel(0), stats(*this)
{
fatal_if(voltageOpPoints.empty(), "DVFS: Empty set of voltages for "\
"voltage domain %s\n", name());
@@ -127,18 +127,6 @@ VoltageDomain::startup() {
}
}
void
VoltageDomain::regStats()
{
SimObject::regStats();
currentVoltage
.method(this, &VoltageDomain::voltage)
.name(params()->name + ".voltage")
.desc("Voltage in Volts")
;
}
VoltageDomain *
VoltageDomainParams::create()
{
@@ -157,3 +145,10 @@ VoltageDomain::unserialize(CheckpointIn &cp)
UNSERIALIZE_SCALAR(_perfLevel);
perfLevel(_perfLevel);
}
VoltageDomain::VoltageDomainStats::VoltageDomainStats(VoltageDomain &vd)
: Stats::Group(&vd),
ADD_STAT(voltage, "Voltage in Volts")
{
voltage.method(&vd, &VoltageDomain::voltage);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 ARM Limited
* Copyright (c) 2012, 2019 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -126,8 +126,6 @@ class VoltageDomain : public SimObject
*/
bool sanitiseVoltages();
void regStats() override;
void serialize(CheckpointOut &cp) const override;
void unserialize(CheckpointIn &cp) override;
@@ -143,10 +141,15 @@ class VoltageDomain : public SimObject
const Voltages voltageOpPoints;
PerfLevel _perfLevel;
/**
* Stat for reporting voltage of the domain
*/
Stats::Value currentVoltage;
struct VoltageDomainStats : public Stats::Group
{
VoltageDomainStats(VoltageDomain &vd);
/**
* Stat for reporting voltage of the domain
*/
Stats::Value voltage;
} stats;
/**
* List of associated SrcClockDomains that are connected to this voltage