#![allow(unsafe_code)]
use crate::codec::dispatch::{current, DispatchKind};
use crate::codec::kernels;
use crate::errors::CodecError;
pub mod scalar {
pub use crate::codec::kernels::scalar::{
apply_residual_into, compute_residual_into, cosine, dequantize_into, quantize_into,
};
}
pub fn quantize_into(
entries: &[f32],
values: &[f32],
indices: &mut [u8],
) -> Result<(), CodecError> {
match current() {
#[cfg(target_arch = "x86_64")]
DispatchKind::Avx2 => {
unsafe { kernels::avx2::quantize_into(entries, values, indices) }
}
#[cfg(target_arch = "aarch64")]
DispatchKind::Neon => {
unsafe { kernels::neon::quantize_into(entries, values, indices) }
}
DispatchKind::Scalar => kernels::scalar::quantize_into(entries, values, indices),
}
}
pub fn dequantize_into(
entries: &[f32],
indices: &[u8],
values: &mut [f32],
) -> Result<(), CodecError> {
match current() {
#[cfg(target_arch = "x86_64")]
DispatchKind::Avx2 => {
unsafe { kernels::avx2::dequantize_into(entries, indices, values) }
}
#[cfg(target_arch = "aarch64")]
DispatchKind::Neon => {
unsafe { kernels::neon::dequantize_into(entries, indices, values) }
}
DispatchKind::Scalar => kernels::scalar::dequantize_into(entries, indices, values),
}
}
#[must_use]
pub fn cosine(a: &[f32], b: &[f32]) -> f32 {
match current() {
#[cfg(target_arch = "x86_64")]
DispatchKind::Avx2 => {
unsafe { kernels::avx2::cosine(a, b) }
}
#[cfg(target_arch = "aarch64")]
DispatchKind::Neon => {
unsafe { kernels::neon::cosine(a, b) }
}
DispatchKind::Scalar => kernels::scalar::cosine(a, b),
}
}
pub fn compute_residual_into(original: &[f32], reconstructed: &[f32], out: &mut [u8]) {
match current() {
#[cfg(target_arch = "x86_64")]
DispatchKind::Avx2 => {
unsafe { kernels::avx2::compute_residual_into(original, reconstructed, out) }
}
#[cfg(target_arch = "aarch64")]
DispatchKind::Neon => {
unsafe { kernels::neon::compute_residual_into(original, reconstructed, out) }
}
DispatchKind::Scalar => {
kernels::scalar::compute_residual_into(original, reconstructed, out);
}
}
}
pub fn apply_residual_into(values: &mut [f32], residual: &[u8]) -> Result<(), CodecError> {
match current() {
#[cfg(target_arch = "x86_64")]
DispatchKind::Avx2 => {
unsafe { kernels::avx2::apply_residual_into(values, residual) }
}
#[cfg(target_arch = "aarch64")]
DispatchKind::Neon => {
unsafe { kernels::neon::apply_residual_into(values, residual) }
}
DispatchKind::Scalar => kernels::scalar::apply_residual_into(values, residual),
}
}