pub fn detect_backend() -> SimdBackend {
#[cfg(target_arch = "x86_64")]
{
#[cfg(any(feature = "simd", feature = "sim-avx512"))]
if is_x86_feature_detected!("avx512f") {
return SimdBackend::Avx512;
}
#[cfg(any(feature = "simd", feature = "sim-avx2"))]
if is_x86_feature_detected!("avx2") && is_x86_feature_detected!("fma") {
return SimdBackend::Avx2;
}
#[cfg(feature = "simd")]
return SimdBackend::Sse2;
}
#[cfg(all(target_arch = "aarch64", any(feature = "simd", feature = "sim-neon")))]
return SimdBackend::Neon;
#[allow(unreachable_code)]
SimdBackend::Scalar
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SimdBackend {
Scalar,
Sse2,
Avx2,
Avx512,
Neon,
}
impl SimdBackend {
pub fn width(self) -> usize {
match self {
SimdBackend::Scalar => 1,
SimdBackend::Sse2 => 4,
SimdBackend::Avx2 => 8,
SimdBackend::Avx512 => 16,
SimdBackend::Neon => 4,
}
}
pub fn as_str(self) -> &'static str {
match self {
SimdBackend::Scalar => "scalar",
SimdBackend::Sse2 => "sse2",
SimdBackend::Avx2 => "avx2",
SimdBackend::Avx512 => "avx512",
SimdBackend::Neon => "neon",
}
}
}