use super::resources::ResourceMapping;
use super::workload::WorkloadSpec;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SimdWidth {
Auto,
Sse2,
Avx2,
Avx512,
Neon,
Wasm,
}
#[derive(Debug, Clone, PartialEq)]
pub enum GpuDevice {
Auto,
Id(u32),
Cuda(u32),
Wgpu(u32),
}
#[derive(Debug, Clone, PartialEq)]
pub struct KernelSpec {
pub name: String,
pub block_size: (u32, u32, u32),
pub grid_size: Option<(u32, u32, u32)>,
pub shared_mem: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ExecutionStrategy {
Sequential,
Simd { width: SimdWidth },
Parallel { threads: usize, chunk_size: usize },
Gpu {
device: GpuDevice,
kernel: Option<KernelSpec>,
},
Distributed { nodes: Vec<String> },
Hybrid { cpu_fraction: f64 },
}
impl ExecutionStrategy {
pub fn simd_auto() -> Self {
ExecutionStrategy::Simd {
width: SimdWidth::Auto,
}
}
pub fn simd(width: SimdWidth) -> Self {
ExecutionStrategy::Simd { width }
}
pub fn parallel(threads: usize) -> Self {
ExecutionStrategy::Parallel {
threads,
chunk_size: 1024,
}
}
pub fn gpu_auto() -> Self {
ExecutionStrategy::Gpu {
device: GpuDevice::Auto,
kernel: None,
}
}
pub fn gpu(device: GpuDevice) -> Self {
ExecutionStrategy::Gpu {
device,
kernel: None,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct StrategyLayer {
pub strategy: ExecutionStrategy,
pub workload: Option<WorkloadSpec>,
pub resources: ResourceMapping,
pub priority: i32,
}
impl StrategyLayer {
pub fn new(strategy: ExecutionStrategy) -> Self {
Self {
strategy,
workload: None,
resources: ResourceMapping::default(),
priority: 0,
}
}
pub fn priority(mut self, priority: i32) -> Self {
self.priority = priority;
self
}
}