mod binary;
mod cosine;
mod distance;
mod dot_product;
mod int4;
mod normalize;
mod quantized;
mod tier;
#[cfg(test)]
mod tests;
pub use binary::BinaryVector;
pub use cosine::{batch_cosine_similarity, cosine_similarity};
pub use distance::{euclidean_distance, squared_euclidean_distance};
pub use dot_product::{
DotBatch4Kernel, DotKernel, batch_dot_product, dot_product, dot_product_batch4,
resolved_dot_product_batch4_kernel, resolved_dot_product_kernel,
};
pub use int4::{Int4Params, Int4Vector};
pub use normalize::normalize;
pub use quantized::{
I8DotKernel, QuantizationParams, QuantizedVector, cosine_similarity_i8, dot_product_i8,
dot_product_i8_raw, resolved_i8_dot_kernel,
};
pub use tier::{
NormalizationHint, PreparedQuery, PreparedQueryWithMeta, QuantizationTier, QuantizedData,
approximate_cosine_distance, approximate_cosine_distance_prepared,
approximate_cosine_distance_prepared_with_meta, approximate_dot_product,
approximate_dot_product_prepared, batch_approximate_cosine_distance_prepared,
batch_approximate_cosine_distance_prepared_into, is_unit_norm, prepare_query,
prepare_query_with_norm, try_approximate_cosine_distance_prepared,
try_approximate_dot_product_prepared,
};
use std::sync::OnceLock;
#[derive(Debug, Clone, Copy)]
pub struct SimdConfig {
pub avx512f_enabled: bool,
pub avx2_enabled: bool,
pub fma_enabled: bool,
pub avx512vnni_enabled: bool,
pub neon_enabled: bool,
}
impl Default for SimdConfig {
fn default() -> Self {
Self::detect()
}
}
impl SimdConfig {
pub fn detect() -> Self {
#[cfg(target_arch = "x86_64")]
{
let avx512f_enabled = is_x86_feature_detected!("avx512f");
Self {
avx512f_enabled,
avx2_enabled: is_x86_feature_detected!("avx2"),
fma_enabled: is_x86_feature_detected!("fma"),
avx512vnni_enabled: avx512f_enabled
&& is_x86_feature_detected!("avx512bw")
&& is_x86_feature_detected!("avx512vnni"),
neon_enabled: false,
}
}
#[cfg(target_arch = "aarch64")]
{
Self {
avx512f_enabled: false,
avx2_enabled: false,
fma_enabled: false,
avx512vnni_enabled: false,
neon_enabled: true,
}
}
#[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
{
Self {
avx512f_enabled: false,
avx2_enabled: false,
fma_enabled: false,
avx512vnni_enabled: false,
neon_enabled: false,
}
}
}
#[inline]
pub fn simd_available(&self) -> bool {
self.avx512f_enabled || self.avx512vnni_enabled || self.avx2_enabled || self.neon_enabled
}
#[cfg(test)]
pub fn scalar_only() -> Self {
Self {
avx512f_enabled: false,
avx2_enabled: false,
fma_enabled: false,
avx512vnni_enabled: false,
neon_enabled: false,
}
}
}
static SIMD_CONFIG: OnceLock<SimdConfig> = OnceLock::new();
#[inline]
pub fn simd_config() -> SimdConfig {
*SIMD_CONFIG.get_or_init(SimdConfig::detect)
}