summaryrefslogtreecommitdiff
path: root/src/energy/trackers/perf.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/energy/trackers/perf.rs')
-rw-r--r--src/energy/trackers/perf.rs106
1 files changed, 26 insertions, 80 deletions
diff --git a/src/energy/trackers/perf.rs b/src/energy/trackers/perf.rs
index 96c73d9..8862e91 100644
--- a/src/energy/trackers/perf.rs
+++ b/src/energy/trackers/perf.rs
@@ -2,34 +2,30 @@ use std::collections::HashMap;
use burn::tensor::Tensor;
use perf_event::{
- events::{Event, Hardware, Software},
- Builder, Counter, Group,
+ events::{Event, Hardware},
+ Builder, Counter,
};
use crate::freq::FrequencyKHZ;
use std::sync::{Arc, RwLock};
use crate::energy::Estimator;
-use crate::model::ArrayBackend;
+use crate::model::BurnBackend;
pub struct PerfEstimator {
registry: HashMap<u64, Counters>,
- model_p: crate::model::Net<ArrayBackend>,
- model_e: crate::model::Net<ArrayBackend>,
- device: <ArrayBackend as burn::prelude::Backend>::Device,
+ model: crate::model::Net<BurnBackend>,
+ device: <BurnBackend as burn::prelude::Backend>::Device,
shared_cpu_current_frequencies: Arc<RwLock<Vec<FrequencyKHZ>>>,
}
impl PerfEstimator {
pub fn new(shared_cpu_current_frequencies: Arc<RwLock<Vec<FrequencyKHZ>>>) -> Self {
- // let model_p = crate::model::load_model("perf_pcore.pt");
- let model_p = crate::model::load_model("perf.pt");
- let model_e = crate::model::load_model("perf.pt");
+ let model = crate::model::load_model("perf.pt");
// let model_e = crate::model::load_model("perf_ecore.pt");
Self {
registry: Default::default(),
- model_p,
- model_e,
+ model,
device: Default::default(),
shared_cpu_current_frequencies,
}
@@ -37,67 +33,41 @@ impl PerfEstimator {
}
struct Counters {
- group: Group,
counters: Vec<Counter>,
old_time: u64,
old_total_energy: f64,
cpu: i32,
- running_on_e_core: bool,
}
static EVENT_TYPES_P: &[Event] = &[
- Event::Hardware(Hardware::BRANCH_INSTRUCTIONS),
Event::Hardware(Hardware::BRANCH_MISSES),
Event::Hardware(Hardware::CACHE_MISSES),
Event::Hardware(Hardware::CACHE_REFERENCES),
Event::Hardware(Hardware::CPU_CYCLES),
Event::Hardware(Hardware::INSTRUCTIONS),
+ #[cfg(not(feature = "amd"))]
Event::Hardware(Hardware::REF_CPU_CYCLES),
];
-static EVENT_TYPES_E: &[Event] = &[
- Event::Hardware(Hardware::BRANCH_MISSES),
- Event::Hardware(Hardware::CACHE_MISSES),
- Event::Hardware(Hardware::CACHE_REFERENCES),
- Event::Hardware(Hardware::CPU_CYCLES),
- Event::Hardware(Hardware::INSTRUCTIONS),
- // Event::Hardware(Hardware::REF_CPU_CYCLES),
-];
impl Estimator for PerfEstimator {
- fn start_trace(&mut self, pid: u64, cpu: i32, running_on_e_core: bool) -> Result<(), ()> {
- let mut group = match Group::new_with_pid_and_cpu(pid as i32, -1) {
- Ok(counters) => counters,
- Err(e) => {
- eprintln!(
- "Failed to create performance counter group for PID {}: {}",
- pid, e
- );
- return Err(());
- }
- };
-
- let counters: Result<Vec<_>, _> = if running_on_e_core || true {
- // println!("starting e core counter");
- EVENT_TYPES_E
- } else {
- EVENT_TYPES_P
- }
- .iter()
- .map(|kind| {
- Builder::new()
- // .group(&mut group)
- .kind(kind.clone())
- .observe_pid(pid as i32)
- .inherit_thread(true)
- .build()
- })
- .collect();
+ fn start_trace(&mut self, pid: u64, cpu: i32) -> Result<(), ()> {
+ let counters: Result<Vec<_>, _> = EVENT_TYPES_P
+ .iter()
+ .map(|kind| {
+ Builder::new()
+ // .group(&mut group)
+ .kind(kind.clone())
+ .observe_pid(pid as i32)
+ .inherit_thread(true)
+ .build()
+ })
+ .collect();
let mut counters = match counters {
Ok(counters) => counters,
Err(e) => {
eprintln!(
- "Failed to create performance counter group for PID {}: {}",
+ "Failed to create performance counter for PID {}: {}",
pid, e
);
return Err(());
@@ -118,11 +88,9 @@ impl Estimator for PerfEstimator {
let old_time = counters[0].read_count_and_time().unwrap().time_running;
let counters = Counters {
counters,
- group,
old_time,
old_total_energy: 0.,
cpu,
- running_on_e_core,
};
self.registry.insert(pid, counters);
Ok(())
@@ -132,20 +100,12 @@ impl Estimator for PerfEstimator {
self.registry.remove(&pid);
}
- fn update_information(&mut self, pid: u64, cpu: i32, is_ecore: bool) {
- let mut core_type_changed = false;
+ fn update_information(&mut self, pid: u64, cpu: i32) {
if let Some(info) = self.registry.get_mut(&pid) {
info.cpu = cpu;
- info.running_on_e_core = is_ecore;
- core_type_changed = is_ecore != info.running_on_e_core;
} else {
eprintln!("Tried to update an unknown task")
}
- if core_type_changed {
- // println!("migrating task to {}", cpu);
- // self.stop_trace(pid);
- // self.start_trace(pid, cpu, is_ecore);
- }
}
fn read_consumption(&mut self, pid: u64) -> Option<f64> {
@@ -154,13 +114,6 @@ impl Estimator for PerfEstimator {
return None;
};
- // let counts = match counters.group.read() {
- // Ok(counts) => counts,
- // Err(e) => {
- // println!("failed to read group: {e}");
- // return None;
- // }
- // };
let time_running_ns = counters.counters[0]
.read_count_and_time()
.unwrap()
@@ -172,7 +125,6 @@ impl Estimator for PerfEstimator {
counters.old_time = time_running_ns;
let mut values = vec![
- //if counters.running_on_e_core { 1. } else { 0. },
(self.shared_cpu_current_frequencies.read().unwrap()[counters.cpu as usize] / 1000)
as f64,
];
@@ -181,21 +133,15 @@ impl Estimator for PerfEstimator {
let count: u64 = ty.read().unwrap();
values.push((count as f64) * correction_factor);
}
+ #[cfg(feature = "amd")]
values.push(values[4]);
- let result = if counters.running_on_e_core {
- &self.model_e
- } else {
- &self.model_p
- }
- .forward(Tensor::from_floats(&values.as_slice()[0..], &self.device));
+ let result = self
+ .model
+ .forward(Tensor::from_floats(&values.as_slice()[0..], &self.device));
let energy = result.into_scalar() as f64;
- if counters.running_on_e_core {
- // dbg!(energy);
- }
counters.old_total_energy += energy / correction_factor;
- counters.group.reset().unwrap();
for counter in counters.counters.iter_mut() {
counter.reset().unwrap();
}