#[derive(Debug, Default, Clone, Copy)]
pub struct EnergyCounter {
begin: Option<u64>,
end: Option<u64>,
}
impl EnergyCounter {
pub fn update(&mut self, value: u64) {
if self.begin.is_none() {
self.begin = Some(value);
} else {
self.end = Some(value);
}
}
pub fn reset(&mut self) {
self.begin = self.end;
}
pub fn diff(&self) -> Option<u64> {
match (self.begin, self.end) {
(Some(begin), Some(end)) => Some(end.saturating_sub(begin)),
_ => None,
}
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct VramCounter {
pub min: Option<u64>,
pub max: Option<u64>,
}
impl VramCounter {
pub fn update(&mut self, value: u64) {
self.min = Some(if let Some(min) = self.min {
min.min(value)
} else {
value
});
self.max = Some(if let Some(max) = self.max {
max.max(value)
} else {
value
});
}
pub fn reset(&mut self) {
self.min = None;
self.max = None;
}
}
#[derive(Debug, Clone, Copy)]
pub struct PowerMeasurement {
pub timestamp: u128,
pub power: u32,
}
#[derive(Debug, Default, Clone)]
pub struct PowerCounter(Vec<PowerMeasurement>);
impl PowerCounter {
pub fn push(&mut self, value: PowerMeasurement) {
self.0.push(value);
}
pub fn reset(&mut self) {
self.0 = Vec::new();
}
pub fn compute_energy(&self) -> u64 {
let mut energy_nj: u64 = 0;
for power in self.0.windows(2) {
let p1 = power[0];
let p2 = power[1];
let duration_us = u64::try_from(p2.timestamp - p1.timestamp).unwrap_or(u64::MAX);
let avg_power_mw = u64::from(p1.power.midpoint(p2.power));
energy_nj += avg_power_mw * duration_us;
}
energy_nj / 1_000_000
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct UtilizationCounter {
pub min: Option<u32>,
pub max: Option<u32>,
}
impl UtilizationCounter {
pub fn update(&mut self, value: u32) {
self.min = Some(if let Some(min) = self.min {
min.min(value)
} else {
value
});
self.max = Some(if let Some(max) = self.max {
max.max(value)
} else {
value
});
}
pub fn reset(&mut self) {
self.min = None;
self.max = None;
}
}
#[derive(Debug, Default, Clone)]
pub struct Counter {
pub energy: Option<EnergyCounter>,
pub vram: Option<VramCounter>,
pub utilization: Option<UtilizationCounter>,
pub power: Option<PowerCounter>,
}