use super::backend::BackendUnavailable;
use super::coverage::{Coverage, Dispatch, Fidelity};
use super::formula::{Formula, Precision};
use super::manifest::Manifest;
#[cfg(all(feature = "accelerate", target_os = "macos"))]
#[allow(unsafe_code)]
mod kernels;
#[cfg(all(feature = "accelerate", target_os = "macos"))]
pub(super) use kernels::{batch_norm_f32, batch_norm_f64, gemm_f32, gemm_f64, map_f32, map_f64};
pub(super) struct Accelerate;
impl Manifest for Accelerate {
const DISPATCH: Dispatch = Dispatch::Offered;
fn coverage(formula: Formula) -> Coverage {
match formula {
Formula::Gemm | Formula::Map => Coverage::Serves {
fidelity: Fidelity::Envelope,
precisions: Precision::ALL,
},
Formula::BatchNormTraining => Coverage::Serves {
fidelity: Fidelity::Envelope,
precisions: Precision::ALL,
},
Formula::WindowProduct | Formula::ReduceWindow | Formula::BatchNormInference => {
Coverage::Absent
}
}
}
fn compiled() -> bool {
cfg!(all(feature = "accelerate", target_os = "macos"))
}
fn status() -> Result<(), BackendUnavailable> {
if !cfg!(feature = "accelerate") {
return Err(BackendUnavailable::NotCompiled);
}
if !cfg!(target_os = "macos") {
return Err(BackendUnavailable::PlatformUnsupported);
}
Ok(())
}
}