mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-02-21 20:38:57 +00:00
energy_model: added energy_metric
It is now possible to specify energy_metric instead of power_metric for cases where continuous power is not available but energy can be measured.
This commit is contained in:
parent
c5b884cf81
commit
68ae8b9277
@ -2,6 +2,7 @@
|
|||||||
from __future__ import division
|
from __future__ import division
|
||||||
import os
|
import os
|
||||||
import math
|
import math
|
||||||
|
import time
|
||||||
from tempfile import mktemp
|
from tempfile import mktemp
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
@ -319,10 +320,18 @@ class EnergyModelInstrument(Instrument):
|
|||||||
one of the values in ``device.core_names``. """),
|
one of the values in ``device.core_names``. """),
|
||||||
Parameter('performance_metric', kind=caseless_string, mandatory=True,
|
Parameter('performance_metric', kind=caseless_string, mandatory=True,
|
||||||
description="""Metric to be used as the performance indicator."""),
|
description="""Metric to be used as the performance indicator."""),
|
||||||
Parameter('power_metric', kind=list_or_caseless_string, mandatory=True,
|
Parameter('power_metric', kind=list_or_caseless_string,
|
||||||
description="""Metric to be used as the power indicator. The value may contain a
|
description="""Metric to be used as the power indicator. The value may contain a
|
||||||
``{core}`` format specifier that will be replaced with names of big
|
``{core}`` format specifier that will be replaced with names of big
|
||||||
and little cores to drive the name of the metric for that cluster."""),
|
and little cores to drive the name of the metric for that cluster.
|
||||||
|
Ether this or ``energy_metric`` must be specified but not both."""),
|
||||||
|
Parameter('energy_metric', kind=list_or_caseless_string,
|
||||||
|
description="""Metric to be used as the energy indicator. The value may contain a
|
||||||
|
``{core}`` format specifier that will be replaced with names of big
|
||||||
|
and little cores to drive the name of the metric for that cluster.
|
||||||
|
this metric will be used to derive power by deviding through by
|
||||||
|
execution time. Either this or ``power_metric`` must be specified, but
|
||||||
|
not both."""),
|
||||||
Parameter('power_scaling_factor', kind=float, default=1.0,
|
Parameter('power_scaling_factor', kind=float, default=1.0,
|
||||||
description="""Power model specfies power in milliWatts. This is a scaling factor that
|
description="""Power model specfies power in milliWatts. This is a scaling factor that
|
||||||
power_metric values will be multiplied by to get milliWatts."""),
|
power_metric values will be multiplied by to get milliWatts."""),
|
||||||
@ -334,7 +343,6 @@ class EnergyModelInstrument(Instrument):
|
|||||||
description="""List of frequencies to be used for little cores. These frequencies must
|
description="""List of frequencies to be used for little cores. These frequencies must
|
||||||
be supported by the cores. If this is not specified, all available
|
be supported by the cores. If this is not specified, all available
|
||||||
frequencies for the core (as read from cpufreq) will be used."""),
|
frequencies for the core (as read from cpufreq) will be used."""),
|
||||||
|
|
||||||
Parameter('idle_workload', kind=str, default='idle',
|
Parameter('idle_workload', kind=str, default='idle',
|
||||||
description="Workload to be used while measuring idle power."),
|
description="Workload to be used while measuring idle power."),
|
||||||
Parameter('idle_workload_params', kind=dict, default={},
|
Parameter('idle_workload_params', kind=dict, default={},
|
||||||
@ -354,6 +362,8 @@ class EnergyModelInstrument(Instrument):
|
|||||||
message = 'The Device does not appear to support {}; does it have the right module installed?'
|
message = 'The Device does not appear to support {}; does it have the right module installed?'
|
||||||
raise ConfigError(message.format(capability))
|
raise ConfigError(message.format(capability))
|
||||||
device_cores = set(self.device.core_names)
|
device_cores = set(self.device.core_names)
|
||||||
|
if (self.power_metric and self.energy_metric) or not (self.power_metric or self.energy_metric):
|
||||||
|
raise ConfigError('Either power_metric or energy_metric must be specified (but not both).')
|
||||||
if not device_cores:
|
if not device_cores:
|
||||||
raise ConfigError('The Device does not appear to have core_names configured.')
|
raise ConfigError('The Device does not appear to have core_names configured.')
|
||||||
elif len(device_cores) != 2:
|
elif len(device_cores) != 2:
|
||||||
@ -386,6 +396,12 @@ class EnergyModelInstrument(Instrument):
|
|||||||
else:
|
else:
|
||||||
idle_state.disable = 1
|
idle_state.disable = 1
|
||||||
|
|
||||||
|
def fast_start(self, context): # pylint: disable=unused-argument
|
||||||
|
self.start_time = time.time()
|
||||||
|
|
||||||
|
def fast_stop(self, context): # pylint: disable=unused-argument
|
||||||
|
self.run_time = time.time() - self.start_time
|
||||||
|
|
||||||
def on_iteration_start(self, context):
|
def on_iteration_start(self, context):
|
||||||
self.setup_measurement(context.spec.cluster)
|
self.setup_measurement(context.spec.cluster)
|
||||||
|
|
||||||
@ -403,6 +419,10 @@ class EnergyModelInstrument(Instrument):
|
|||||||
power_metric += metric.value * self.power_scaling_factor
|
power_metric += metric.value * self.power_scaling_factor
|
||||||
elif (cluster == 'little') and metric.name in self.little_power_metrics:
|
elif (cluster == 'little') and metric.name in self.little_power_metrics:
|
||||||
power_metric += metric.value * self.power_scaling_factor
|
power_metric += metric.value * self.power_scaling_factor
|
||||||
|
elif (cluster == 'big') and metric.name in self.big_energy_metrics:
|
||||||
|
power_metric += metric.value / self.run_time * self.power_scaling_factor
|
||||||
|
elif (cluster == 'little') and metric.name in self.little_energy_metrics:
|
||||||
|
power_metric += metric.value / self.run_time * self.power_scaling_factor
|
||||||
|
|
||||||
if not (power_metric and (perf_metric or not is_freq_iteration)):
|
if not (power_metric and (perf_metric or not is_freq_iteration)):
|
||||||
message = 'Incomplete results for {} iteration{}'
|
message = 'Incomplete results for {} iteration{}'
|
||||||
@ -466,12 +486,24 @@ class EnergyModelInstrument(Instrument):
|
|||||||
def initialize_result_tracking(self):
|
def initialize_result_tracking(self):
|
||||||
self.freq_data = []
|
self.freq_data = []
|
||||||
self.idle_data = []
|
self.idle_data = []
|
||||||
if isinstance(self.power_metric, basestring):
|
self.big_power_metrics = []
|
||||||
self.big_power_metrics = [self.power_metric.format(core=self.big_core)]
|
self.little_power_metrics = []
|
||||||
self.little_power_metrics = [self.power_metric.format(core=self.little_core)]
|
self.big_energy_metrics = []
|
||||||
else:
|
self.little_energy_metrics = []
|
||||||
self.big_power_metrics = [pm.format(core=self.big_core) for pm in self.power_metric]
|
if self.power_metric:
|
||||||
self.little_power_metrics = [pm.format(core=self.little_core) for pm in self.power_metric]
|
if isinstance(self.power_metric, basestring):
|
||||||
|
self.big_power_metrics = [self.power_metric.format(core=self.big_core)]
|
||||||
|
self.little_power_metrics = [self.power_metric.format(core=self.little_core)]
|
||||||
|
else:
|
||||||
|
self.big_power_metrics = [pm.format(core=self.big_core) for pm in self.power_metric]
|
||||||
|
self.little_power_metrics = [pm.format(core=self.little_core) for pm in self.power_metric]
|
||||||
|
else: # must be energy_metric
|
||||||
|
if isinstance(self.energy_metric, basestring):
|
||||||
|
self.big_energy_metrics = [self.energy_metric.format(core=self.big_core)]
|
||||||
|
self.little_energy_metrics = [self.energy_metric.format(core=self.little_core)]
|
||||||
|
else:
|
||||||
|
self.big_energy_metrics = [em.format(core=self.big_core) for em in self.energy_metric]
|
||||||
|
self.little_energy_metrics = [em.format(core=self.little_core) for em in self.energy_metric]
|
||||||
|
|
||||||
def configure_clusters(self):
|
def configure_clusters(self):
|
||||||
self.measured_cores = None
|
self.measured_cores = None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user