in benchmarking/utils/monsoon_power.py [0:0]
def _retrievePowerData(power_data, start_idx, end_idx, num_iters):
data = {}
if start_idx < 0 or end_idx < 0:
return data
# get base current. It is just an approximation
THRESHOLD = 150
num = len(power_data)
i = end_idx
sum = 0
count = 0
for i in range(end_idx, num):
if power_data[i]["current"] < THRESHOLD:
sum += power_data[i]["current"]
count += 1
base_current = sum / count if count > 0 else 0
energy = 0
prev_time = power_data[start_idx - 1]["time"]
for i in range(start_idx, end_idx):
entry = power_data[i]
curr_time = entry["time"]
energy += (
entry["voltage"]
* (entry["current"] - base_current)
* (curr_time - prev_time)
)
prev_time = curr_time
total_time = power_data[end_idx]["time"] - power_data[start_idx]["time"]
power = energy / total_time
energy_per_inference = energy / num_iters
latency = total_time * 1000 * 1000 / num_iters
data["energy"] = _composeStructuredData(energy_per_inference, "energy", "mJ")
data["power"] = _composeStructuredData(power, "power", "mW")
data["latency"] = _composeStructuredData(latency, "latency", "uS")
getLogger().info("Base current: {} mA".format(base_current))
getLogger().info("Energy per inference: {} mJ".format(energy_per_inference))
getLogger().info("Power: {} mW".format(power))
getLogger().info("Latency per inference: {} uS".format(latency))
return data