@@ -30,7 +30,7 @@ class PMTObserver(BenchmarkObserver):
30
30
31
31
"""
32
32
33
- def __init__ (self , observable = None ):
33
+ def __init__ (self , observable = None , use_continuous_observer = False , continuous_duration = 1 ):
34
34
if not pmt :
35
35
raise ImportError ("could not import pmt" )
36
36
@@ -54,6 +54,9 @@ def __init__(self, observable=None):
54
54
self .begin_states = [None ] * len (self .pms )
55
55
self .initialize_results (self .pm_names )
56
56
57
+ if use_continuous_observer :
58
+ self .continuous_observer = ContinuousObserver ("pmt" , [], self , continuous_duration = continuous_duration )
59
+
57
60
def initialize_results (self , pm_names ):
58
61
self .results = dict ()
59
62
for pm_name in pm_names :
@@ -82,3 +85,37 @@ def get_results(self):
82
85
averages = {key : np .average (values ) for key , values in self .results .items ()}
83
86
self .initialize_results (self .pm_names )
84
87
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