diff options
author | Dennis Kobert <dennis@kobert.dev> | 2025-02-27 17:31:40 +0100 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2025-02-27 17:32:20 +0100 |
commit | e8e609fffd0103dc72b75a341b8fa7fedb86ed29 (patch) | |
tree | df2c1a3bd11a3c21bbb5aabfc27cd0cb106b5415 /src | |
parent | cdcac5f6fece648b63c594e438c697501b4a6470 (diff) |
Add perf energy estimator
Diffstat (limited to 'src')
-rw-r--r-- | src/mock.rs | 1 | ||||
-rw-r--r-- | src/mock/perf.rs | 56 |
2 files changed, 57 insertions, 0 deletions
diff --git a/src/mock.rs b/src/mock.rs index 81bc32c..c5f8b34 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -1,5 +1,6 @@ use iocuddle::*; use rand::Rng; +mod perf; pub trait KernelModule { fn start_trace(&mut self, _pid: u64) {} diff --git a/src/mock/perf.rs b/src/mock/perf.rs new file mode 100644 index 0000000..4bf87c9 --- /dev/null +++ b/src/mock/perf.rs @@ -0,0 +1,56 @@ +use std::collections::HashMap; + +use events::Event; +use perf_event::events::Hardware; +use perf_event::*; + +struct PerfEstimator { + registry: HashMap<u64, Counters>, +} + +struct Counters { + group: Group, + counters: Vec<Counter>, +} + +static EVENT_TYPES: &[(f32, Event)] = &[ + (1.0, Event::Hardware(Hardware::CPU_CYCLES)), + (2.0, Event::Hardware(Hardware::INSTRUCTIONS)), +]; + +impl super::KernelModule for PerfEstimator { + fn start_trace(&mut self, pid: u64) { + let mut group = Group::new().expect("failed to create Group"); + let counters = EVENT_TYPES + .iter() + .map(|(_, kind)| { + Builder::new() + .group(&mut group) + .kind(kind.clone()) + .build() + .unwrap() + }) + .collect(); + + group.enable().unwrap(); + let counters = Counters { counters, group }; + self.registry.insert(pid, counters); + } + + fn stop_trace(&mut self, pid: u64) { + self.registry.remove(&pid); + } + + fn read_consumption(&mut self, pid: u64) -> u64 { + let Some(counters) = self.registry.get_mut(&pid) else { + return 0; + }; + let mut sum = 0; + let counts = counters.group.read().unwrap(); + for ((factor, ty), count) in EVENT_TYPES.iter().zip(counts.iter()) { + sum += *factor as u64 * count.1; + } + + sum + } +} |