#[derive(Clone, Copy, Debug, PartialEq)]
pub struct WidthPolicy {
pub serial_below_ns: f64,
pub entry_base_ns: f64,
pub entry_per_thread_ns: f64,
}
impl Default for WidthPolicy {
fn default() -> Self {
Self {
serial_below_ns: 50_000.0,
entry_base_ns: 5_000.0,
entry_per_thread_ns: 5_000.0,
}
}
}
pub(crate) fn width_for(serial_ns: f64, policy: &WidthPolicy, budget: usize) -> usize {
if budget == 1 || serial_ns.is_nan() || serial_ns < policy.serial_below_ns {
return 1;
}
let cost = |k: usize| {
if k == 1 {
serial_ns
} else {
policy.entry_base_ns + policy.entry_per_thread_ns * k as f64 + serial_ns / k as f64
}
};
(1..=budget)
.min_by(|&a, &b| cost(a).total_cmp(&cost(b)))
.unwrap_or(1)
}