use jxr_core::BackendRequest;
use crate::CudaError;
pub const CUDA_AUTO_THRESHOLD: u64 = 16_384;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CudaRouteDecision {
Cpu,
Cuda,
}
pub fn plan_cuda_route(
request: BackendRequest,
reconstructed_coefficients: u64,
cuda_usable: bool,
resident_output: bool,
) -> Result<CudaRouteDecision, CudaError> {
if resident_output {
return match request {
BackendRequest::Cpu => Err(CudaError::ResidentOutputRequiresCuda),
BackendRequest::Metal => Err(CudaError::UnsupportedBackend { request }),
BackendRequest::Auto | BackendRequest::Cuda if !cuda_usable => {
Err(CudaError::Unavailable)
}
BackendRequest::Auto | BackendRequest::Cuda => Ok(CudaRouteDecision::Cuda),
};
}
match request {
BackendRequest::Metal => Err(CudaError::UnsupportedBackend { request }),
BackendRequest::Cuda if !cuda_usable => Err(CudaError::Unavailable),
BackendRequest::Cuda => Ok(CudaRouteDecision::Cuda),
BackendRequest::Auto
if cuda_usable && reconstructed_coefficients >= CUDA_AUTO_THRESHOLD =>
{
Ok(CudaRouteDecision::Cuda)
}
BackendRequest::Cpu | BackendRequest::Auto => Ok(CudaRouteDecision::Cpu),
}
}