diff options
-rw-r--r-- | energy-monitor/src/energy.rs | 12 | ||||
-rw-r--r-- | src/benchmark.rs | 22 | ||||
-rw-r--r-- | src/e_core_selector.rs | 31 | ||||
-rw-r--r-- | src/energy.rs | 25 | ||||
-rw-r--r-- | src/energy/budget.rs | 6 | ||||
-rw-r--r-- | src/energy/trackers/perf.rs | 3 |
6 files changed, 16 insertions, 83 deletions
diff --git a/energy-monitor/src/energy.rs b/energy-monitor/src/energy.rs index a0a6ce1..cd090bd 100644 --- a/energy-monitor/src/energy.rs +++ b/energy-monitor/src/energy.rs @@ -69,18 +69,6 @@ pub fn request_all_processes( Ok(result) } -pub fn request_rapl(stream: &mut std::os::unix::net::UnixStream) -> io::Result<f64> { - // Write -1 to get all processes - stream.write_all(b"rapl\n")?; - - let mut reader = BufReader::new(stream); - - let mut out = String::new(); - reader.read_line(&mut out)?; - - let number = out.parse().unwrap_or_default(); - Ok(number) -} pub fn set_power_limit(stream: &mut std::os::unix::net::UnixStream, limit: u32) -> io::Result<()> { // Write -1 to get all processes stream.write_all(format!("limit {limit}\n").as_bytes())?; diff --git a/src/benchmark.rs b/src/benchmark.rs index c6795df..435ad38 100644 --- a/src/benchmark.rs +++ b/src/benchmark.rs @@ -18,7 +18,7 @@ use std::{fs::File, sync::atomic::AtomicI32}; const SLICE_US: u64 = 5000; const LOG_INTERVAL_MS: u64 = 10; -const RESHUFFLE_ROUNDS: usize = 1000; // Number of rounds before changing cpu +const ROUNDS_PER_CPU: usize = 1000; // Number of rounds before changing cpu type Pid = i32; static CPU: AtomicI32 = AtomicI32::new(0); @@ -30,22 +30,6 @@ pub struct BenchmarkScheduler<'a> { e_cores: Range<i32>, } -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum Mode { - ECores, - PCores, -} - -impl From<char> for Mode { - fn from(value: char) -> Self { - match value { - 'p' => Mode::PCores, - 'e' => Mode::ECores, - _ => panic!("{} is not a valid benchmarking mode", value), - } - } -} - // Represents a single measurement point in time struct Measurement { timestamp: Instant, @@ -327,8 +311,8 @@ fn run_measurement_loop(log_path: String, p_core: i32, e_core: i32) -> Result<() // println!("Took initial measurement"); - // Monitor for several rounds before reshuffling - for round in 0..RESHUFFLE_ROUNDS { + // Monitor for several rounds before changing CPU + for round in 0..ROUNDS_PER_CPU { group.enable().unwrap(); group.reset().unwrap(); // Wait for the sampling interval diff --git a/src/e_core_selector.rs b/src/e_core_selector.rs deleted file mode 100644 index 48bfa8c..0000000 --- a/src/e_core_selector.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::ops::Range; - -pub trait ECoreSelector { - fn next_core(&mut self, previous_cpu: i32) -> i32; -} - -pub struct RoundRobinSelector { - offset: u32, - num_cores: u32, - last_used: u32, -} - -impl RoundRobinSelector { - pub fn new(e_cores: &Range<i32>) -> RoundRobinSelector { - Self { - offset: e_cores.start as u32, - num_cores: e_cores.len() as u32, - last_used: 0, - } - } -} - -impl ECoreSelector for RoundRobinSelector { - fn next_core(&mut self, previous_cpu: i32) -> i32 { - if (self.offset..(self.offset + self.num_cores)).contains(&(previous_cpu as u32)) { - return previous_cpu; - } - self.last_used += 1; - (self.offset + (self.last_used % self.num_cores.max(1))) as i32 - } -} diff --git a/src/energy.rs b/src/energy.rs index 754ecac..8d479ae 100644 --- a/src/energy.rs +++ b/src/energy.rs @@ -28,9 +28,9 @@ pub enum Request { } pub struct TaskInfo { pub cpu: AtomicI32, - pub budget: AtomicI64, + pub budget_mj: AtomicI64, pub last_total_runtime: AtomicU64, - pub power_draw: AtomicU64, + pub power_draw_mw: AtomicU64, pub running_on_e_core: AtomicBool, pub last_scheduled: AtomicI64, } @@ -40,7 +40,7 @@ impl TaskInfo { self.cpu.load(Relaxed) } pub fn read_budget(&self) -> i64 { - self.budget.load(Relaxed) + self.budget_mj.load(Relaxed) } pub fn read_time_since_last_schedule(&self) -> Option<Duration> { let old_time = self.last_scheduled.load(Relaxed); @@ -65,11 +65,11 @@ impl TaskInfo { self.last_scheduled.store(last_scheduled, Relaxed); } pub fn set_budget(&self, budget: i64) { - self.budget.store(budget, Relaxed); + self.budget_mj.store(budget, Relaxed); } pub fn add_budget(&self, budget: i64) { - self.budget.fetch_add(budget, Relaxed); - self.budget.fetch_min(budget::MAX_BUDGET_MJ, Relaxed); + self.budget_mj.fetch_add(budget, Relaxed); + self.budget_mj.fetch_min(budget::MAX_BUDGET_MJ, Relaxed); } pub fn set_running_on_e_core(&self, running_on_e_core: bool) { self.running_on_e_core.store(running_on_e_core, Relaxed); @@ -78,16 +78,16 @@ impl TaskInfo { new_running_time - self.last_total_runtime.swap(new_running_time, Relaxed) } pub fn update_budget(&self, running_time: Duration) -> i64 { - let power_draw = self.power_draw.load(Relaxed); - self.budget.fetch_sub( + let power_draw = self.power_draw_mw.load(Relaxed); + self.budget_mj.fetch_sub( (power_draw as f64 * running_time.as_secs_f64()) as i64, Relaxed, ); - self.budget.fetch_max(-budget::MAX_BUDGET_MJ, Relaxed) + self.budget_mj.fetch_max(-budget::MAX_BUDGET_MJ, Relaxed) } // Set powerdraw in milli watt pub fn set_power_draw(&self, power_draw_mw: u64) { - self.power_draw.store(power_draw_mw, Relaxed); + self.power_draw_mw.store(power_draw_mw, Relaxed); } } @@ -95,11 +95,11 @@ impl Default for TaskInfo { fn default() -> Self { Self { cpu: Default::default(), - budget: AtomicI64::new(budget::MAX_BUDGET_MJ), + budget_mj: AtomicI64::new(budget::MAX_BUDGET_MJ), last_total_runtime: Default::default(), running_on_e_core: Default::default(), last_scheduled: AtomicI64::new(-1), - power_draw: AtomicU64::new(DEFAULT_POWER_DRAW_MW), + power_draw_mw: AtomicU64::new(DEFAULT_POWER_DRAW_MW), } } } @@ -260,7 +260,6 @@ impl EnergyService { .map(|info| info.tree_energy_j) .unwrap_or(0.); let elapsed = self.last_measurement.elapsed(); - let mut i = 0; for pid in &self.active_processes { let mut process_info = self.process_info.write().unwrap(); if let Some(info) = process_info.get_mut(pid) { diff --git a/src/energy/budget.rs b/src/energy/budget.rs index d7c38c3..8c2ebe9 100644 --- a/src/energy/budget.rs +++ b/src/energy/budget.rs @@ -43,10 +43,6 @@ impl SimpleCappingPolicy { } else { self.last_ratio = 0.99 * self.last_ratio + 0.01 * ratio.clamp(0.001, 100.0); } - let a = (((self.last_ratio * base_energy_per_process) * 1000.) as i64).min(MAX_BUDGET_MJ); - // println!( - // "budget: {a} ration: {ratio} actual_energy: {actual_energy} energy_cap: {energy_cap}" - // ); - a + (((self.last_ratio * base_energy_per_process) * 1000.) as i64).min(MAX_BUDGET_MJ) } } diff --git a/src/energy/trackers/perf.rs b/src/energy/trackers/perf.rs index 8862e91..50812d5 100644 --- a/src/energy/trackers/perf.rs +++ b/src/energy/trackers/perf.rs @@ -22,7 +22,6 @@ pub struct PerfEstimator { impl PerfEstimator { pub fn new(shared_cpu_current_frequencies: Arc<RwLock<Vec<FrequencyKHZ>>>) -> Self { let model = crate::model::load_model("perf.pt"); - // let model_e = crate::model::load_model("perf_ecore.pt"); Self { registry: Default::default(), model, @@ -55,7 +54,6 @@ impl Estimator for PerfEstimator { .iter() .map(|kind| { Builder::new() - // .group(&mut group) .kind(kind.clone()) .observe_pid(pid as i32) .inherit_thread(true) @@ -129,7 +127,6 @@ impl Estimator for PerfEstimator { as f64, ]; for ty in counters.counters.iter_mut() { - // let count: u64 = counts[ty]; let count: u64 = ty.read().unwrap(); values.push((count as f64) * correction_factor); } |