Skip to content

Commit 4ccecdf

Browse files
base implementation for pmt continuous observer
1 parent f307f50 commit 4ccecdf

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

kernel_tuner/observers/pmt.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)