summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/benchmark.rs22
-rw-r--r--src/e_core_selector.rs31
-rw-r--r--src/energy.rs25
-rw-r--r--src/energy/budget.rs6
-rw-r--r--src/energy/trackers/perf.rs3
5 files changed, 16 insertions, 71 deletions
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);
}