changeset d65768b9ffc2 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=d65768b9ffc2
description:
energy: Tighter checking of levels for DFS systems
There are cases where users might by accident / intention specify less
voltage
operating points thatn frequency points. We consider one of these cases
special: giving only a single voltage to a voltage domain effectively
renders
it as a static domain. This patch adds additional logic in the
auxiliary parts
of the functionality to handle these cases properly (simple driver
asking for
N>1 operating levels, we should return the same voltage for all of
them) and
adds error checking code in the voltage domain.
diffstat:
src/sim/dvfs_handler.hh | 30 ++++++++++++++++++++++++++++--
src/sim/voltage_domain.hh | 4 ++++
2 files changed, 32 insertions(+), 2 deletions(-)
diffs (61 lines):
diff -r 3064e1beeb49 -r d65768b9ffc2 src/sim/dvfs_handler.hh
--- a/src/sim/dvfs_handler.hh Fri Jul 25 13:36:23 2014 +0100
+++ b/src/sim/dvfs_handler.hh Tue Aug 12 19:00:44 2014 +0100
@@ -137,7 +137,15 @@
*/
Tick clkPeriodAtPerfLevel(DomainID domain_id, PerfLevel perf_level) const
{
- return findDomain(domain_id)->clkPeriodAtPerfLevel(perf_level);
+ SrcClockDomain *d = findDomain(domain_id);
+ assert(d);
+ PerfLevel n = d->numPerfLevels();
+ if (perf_level < n)
+ return d->clkPeriodAtPerfLevel(perf_level);
+
+ warn("DVFSHandler %s reads illegal frequency level %u from "\
+ "SrcClockDomain %s. Returning 0\n", name(), perf_level,
d->name());
+ return Tick(0);
}
/**
@@ -150,7 +158,25 @@
*/
double voltageAtPerfLevel(DomainID domain_id, PerfLevel perf_level) const
{
- return findDomain(domain_id)->voltageDomain()->voltage(perf_level);
+ VoltageDomain *d = findDomain(domain_id)->voltageDomain();
+ assert(d);
+ PerfLevel n = d->numVoltages();
+ if (perf_level < n)
+ return d->voltage(perf_level);
+
+ // Request outside of the range of the voltage domain
+ if (n == 1) {
+ DPRINTF(DVFS, "DVFS: Request for perf-level %i for single-point "\
+ "voltage domain %s. Returning voltage at level 0: %.2f "\
+ "V\n", perf_level, d->name(), d->voltage(0));
+ // Special case for single point voltage domain -> same voltage for
+ // all points
+ return d->voltage(0);
+ }
+
+ warn("DVFSHandler %s reads illegal voltage level %u from "\
+ "VoltageDomain %s. Returning 0 V\n", name(), perf_level,
d->name());
+ return 0.;
}
/**
diff -r 3064e1beeb49 -r d65768b9ffc2 src/sim/voltage_domain.hh
--- a/src/sim/voltage_domain.hh Fri Jul 25 13:36:23 2014 +0100
+++ b/src/sim/voltage_domain.hh Tue Aug 12 19:00:44 2014 +0100
@@ -77,6 +77,10 @@
*/
double voltage(PerfLevel perf_level) const
{
+ chatty_assert(perf_level < numVoltages(), "VoltageDomain %s "\
+ "request for voltage perf level %u is outside "\
+ "of numVoltages %u", name(), perf_level,
+ numVoltages());
return voltageOpPoints[perf_level];
}
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev