mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-11-04 09:02:12 +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:
		@@ -2,6 +2,7 @@
 | 
			
		||||
from __future__ import division
 | 
			
		||||
import os
 | 
			
		||||
import math
 | 
			
		||||
import time
 | 
			
		||||
from tempfile import mktemp
 | 
			
		||||
from base64 import b64encode
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
@@ -319,10 +320,18 @@ class EnergyModelInstrument(Instrument):
 | 
			
		||||
                                 one of the values in ``device.core_names``. """),
 | 
			
		||||
        Parameter('performance_metric', kind=caseless_string, mandatory=True,
 | 
			
		||||
                  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
 | 
			
		||||
                                 ``{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,
 | 
			
		||||
                  description="""Power model specfies power in milliWatts. This is a scaling factor that
 | 
			
		||||
                                 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
 | 
			
		||||
                                 be supported by the cores. If this is not specified, all available
 | 
			
		||||
                                 frequencies for the core (as read from cpufreq) will be used."""),
 | 
			
		||||
 | 
			
		||||
        Parameter('idle_workload', kind=str, default='idle',
 | 
			
		||||
                  description="Workload to be used while measuring idle power."),
 | 
			
		||||
        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?'
 | 
			
		||||
                raise ConfigError(message.format(capability))
 | 
			
		||||
        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:
 | 
			
		||||
            raise ConfigError('The Device does not appear to have core_names configured.')
 | 
			
		||||
        elif len(device_cores) != 2:
 | 
			
		||||
@@ -386,6 +396,12 @@ class EnergyModelInstrument(Instrument):
 | 
			
		||||
            else:
 | 
			
		||||
                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):
 | 
			
		||||
        self.setup_measurement(context.spec.cluster)
 | 
			
		||||
 | 
			
		||||
@@ -403,6 +419,10 @@ class EnergyModelInstrument(Instrument):
 | 
			
		||||
                power_metric += metric.value * self.power_scaling_factor
 | 
			
		||||
            elif (cluster == 'little') and metric.name in self.little_power_metrics:
 | 
			
		||||
                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)):
 | 
			
		||||
            message = 'Incomplete results for {} iteration{}'
 | 
			
		||||
@@ -466,12 +486,24 @@ class EnergyModelInstrument(Instrument):
 | 
			
		||||
    def initialize_result_tracking(self):
 | 
			
		||||
        self.freq_data = []
 | 
			
		||||
        self.idle_data = []
 | 
			
		||||
        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]
 | 
			
		||||
        self.big_power_metrics = []
 | 
			
		||||
        self.little_power_metrics = []
 | 
			
		||||
        self.big_energy_metrics = []
 | 
			
		||||
        self.little_energy_metrics = []
 | 
			
		||||
        if 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):
 | 
			
		||||
        self.measured_cores = None
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user