#[derive(Debug, Clone, Copy, Default, serde::Serialize)]
pub enum PowerMode {
#[default]
Balanced,
HighPerformance,
PowerSaving,
}
#[derive(Debug, Clone, Copy, serde::Serialize)]
pub struct WorkloadHints {
pub power_mode: PowerMode,
pub max_cpu_usage: Option<f32>,
pub thread_count: Option<usize>,
pub min_chunk_size: Option<usize>,
pub prefer_gpu: bool,
pub prefer_hybrid: bool,
pub enable_gpu: bool,
pub policy: crate::decision::Policy,
}
impl Default for WorkloadHints {
fn default() -> Self {
Self {
power_mode: PowerMode::Balanced,
max_cpu_usage: None,
thread_count: None,
min_chunk_size: None, prefer_gpu: true,
prefer_hybrid: false,
enable_gpu: true,
policy: crate::decision::Policy::Balanced,
}
}
}
pub struct Scheduler;
impl Scheduler {
pub fn calculate_chunk_size(len: usize, num_threads: usize, hints: &WorkloadHints) -> usize {
if len < 8192 && hints.thread_count.is_none() {
return len; }
if let Some(min) = hints.min_chunk_size {
return (min + 15) & !15;
}
let base_chunk = len.div_ceil(num_threads);
let floor = 8192;
let chunk_size = base_chunk.max(floor);
(chunk_size + 15) & !15
}
}