use ruda_core::ir::ElemType;
use ruda::runtime::{backend::Runtime, client::ComputeClient, server::RudaDim};
const CPU_CHAIN_DEPTH: usize = 64;
const PROBE_UNITS_PER_RUDA: u32 = 256;
#[derive(Clone, Copy)]
pub struct LaunchConfig {
pub ruda_dim: RudaDim,
pub ruda_count: usize,
pub vector_size: usize,
pub plane_size: usize,
}
impl LaunchConfig {
pub(super) fn for_device<R: Runtime>(client: &ComputeClient<R>, dtype: ElemType) -> Self {
let hardware = &client.properties().hardware;
let plane_size = hardware.plane_size_max.max(1);
let vector_size = client
.io_optimized_vector_sizes(dtype.size())
.next()
.unwrap_or(1);
let (units, ruda_count) = match hardware.num_cpu_cores {
Some(cores) => (cores, CPU_CHAIN_DEPTH as u32),
None => {
let sms = hardware.num_streaming_multiprocessors.unwrap_or(64);
(
PROBE_UNITS_PER_RUDA,
(sms * 32).min(hardware.max_ruda_count.0),
)
}
};
Self {
ruda_dim: RudaDim::new(client.properties(), units as usize),
ruda_count: ruda_count as usize,
vector_size,
plane_size: plane_size as usize,
}
}
pub(super) fn with_units<R: Runtime>(self, client: &ComputeClient<R>, units: u32) -> Self {
Self {
ruda_dim: RudaDim::new(client.properties(), units as usize),
..self
}
}
}