@@ -30,7 +30,7 @@ class PMTObserver(BenchmarkObserver):
3030
3131 """
3232
33- def __init__ (self , observable = None ):
33+ def __init__ (self , observable = None , use_continuous_observer = False , continuous_duration = 1 ):
3434 if not pmt :
3535 raise ImportError ("could not import pmt" )
3636
@@ -54,6 +54,9 @@ def __init__(self, observable=None):
5454 self .begin_states = [None ] * len (self .pms )
5555 self .initialize_results (self .pm_names )
5656
57+ if use_continuous_observer :
58+ self .continuous_observer = ContinuousObserver ("pmt" , [], self , continuous_duration = continuous_duration )
59+
5760 def initialize_results (self , pm_names ):
5861 self .results = dict ()
5962 for pm_name in pm_names :
@@ -82,3 +85,37 @@ def get_results(self):
8285 averages = {key : np .average (values ) for key , values in self .results .items ()}
8386 self .initialize_results (self .pm_names )
8487 return averages
88+
89+
90+ class PMTContinuousObserver (ContinuousObserver ):
91+ """Generic observer that measures power while and continuous benchmarking.
92+
93+ To support continuous benchmarking an Observer should support:
94+ a .read_power() method, which the ContinuousObserver can call to read power in Watt
95+ """
96+ def before_start (self ):
97+ pass
98+
99+ def after_start (self ):
100+ self .parent .after_start ()
101+
102+ def during (self ):
103+ pass
104+
105+ def after_finish (self ):
106+ self .parent .after_finish ()
107+
108+ def get_results (self ):
109+ average_kernel_execution_time_ms = self .results ["time" ]
110+
111+ averages = {key : np .average (values ) for key , values in self .results .items ()}
112+ self .parent .initialize_results (self .pm_names )
113+
114+ # correct energy measurement, because current _energy number is collected over the entire duration
115+ # we estimate energy as the average power over the continuous duration times the kernel execution time
116+ for pm_name in pm_names :
117+ energy_result_name = f"{ pm_name } _energy"
118+ power_result_name = f"{ pm_name } _power"
119+ averages [energy_result_name ] = averages [power_result_name ] * (average_kernel_execution_time_ms / 1e3 )
120+
121+ return averages
0 commit comments