summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2025-02-27 17:31:40 +0100
committerDennis Kobert <dennis@kobert.dev>2025-02-27 17:32:20 +0100
commite8e609fffd0103dc72b75a341b8fa7fedb86ed29 (patch)
treedf2c1a3bd11a3c21bbb5aabfc27cd0cb106b5415 /src
parentcdcac5f6fece648b63c594e438c697501b4a6470 (diff)
Add perf energy estimator
Diffstat (limited to 'src')
-rw-r--r--src/mock.rs1
-rw-r--r--src/mock/perf.rs56
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
+ }
+}