lattice_embed/simd/
mod.rs1mod binary;
17mod cosine;
18mod distance;
19mod dot_product;
20mod int4;
21mod normalize;
22mod quantized;
23mod tier;
24
25#[cfg(test)]
26mod tests;
27
28pub use binary::BinaryVector;
30pub use cosine::{
31 batch_cosine_one_vs_many, batch_cosine_similarity, cosine_similarity, cosine_similarity_fused,
32};
33pub use distance::{euclidean_distance, squared_euclidean_distance};
34pub use dot_product::{
35 DotBatch4Kernel, DotKernel, batch_dot_product, dot_product, dot_product_batch4,
36 resolved_dot_product_batch4_kernel, resolved_dot_product_kernel,
37};
38pub use int4::{Int4Params, Int4Vector};
39pub use normalize::normalize;
40pub use quantized::{
41 I8DotKernel, QuantizationParams, QuantizedVector, cosine_similarity_i8, dot_product_i8,
42 dot_product_i8_raw, resolved_i8_dot_kernel,
43};
44pub use tier::{
45 NormalizationHint, PreparedQuery, PreparedQueryWithMeta, QuantizationTier, QuantizedData,
46 approximate_cosine_distance, approximate_cosine_distance_prepared,
47 approximate_cosine_distance_prepared_with_meta, approximate_dot_product,
48 approximate_dot_product_prepared, approximate_int4_batch_prepared,
49 approximate_int4_batch_prepared_into, approximate_int8_batch_prepared,
50 approximate_int8_batch_prepared_into, batch_approximate_cosine_distance_prepared,
51 batch_approximate_cosine_distance_prepared_into, is_unit_norm, prepare_query,
52 prepare_query_with_norm, try_approximate_cosine_distance_prepared,
53 try_approximate_dot_product_prepared,
54};
55
56use std::sync::OnceLock;
57
58#[derive(Debug, Clone, Copy)]
62pub struct SimdConfig {
63 pub avx512f_enabled: bool,
65 pub avx2_enabled: bool,
67 pub fma_enabled: bool,
69 pub avx512vnni_enabled: bool,
71 pub neon_enabled: bool,
73 pub dotprod_enabled: bool,
78}
79
80impl Default for SimdConfig {
81 fn default() -> Self {
82 Self::detect()
83 }
84}
85
86impl SimdConfig {
87 pub fn detect() -> Self {
89 #[cfg(target_arch = "x86_64")]
90 {
91 let avx512f_enabled = is_x86_feature_detected!("avx512f");
92
93 Self {
94 avx512f_enabled,
95 avx2_enabled: is_x86_feature_detected!("avx2"),
96 fma_enabled: is_x86_feature_detected!("fma"),
97 avx512vnni_enabled: avx512f_enabled
98 && is_x86_feature_detected!("avx512bw")
99 && is_x86_feature_detected!("avx512vnni"),
100 neon_enabled: false,
101 dotprod_enabled: false,
102 }
103 }
104 #[cfg(target_arch = "aarch64")]
105 {
106 Self {
110 avx512f_enabled: false,
111 avx2_enabled: false,
112 fma_enabled: false,
113 avx512vnni_enabled: false,
114 neon_enabled: true,
115 dotprod_enabled: std::arch::is_aarch64_feature_detected!("dotprod"),
116 }
117 }
118 #[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
119 {
120 Self {
121 avx512f_enabled: false,
122 avx2_enabled: false,
123 fma_enabled: false,
124 avx512vnni_enabled: false,
125 neon_enabled: false,
126 dotprod_enabled: false,
127 }
128 }
129 }
130
131 #[inline]
133 pub fn simd_available(&self) -> bool {
134 self.avx512f_enabled || self.avx512vnni_enabled || self.avx2_enabled || self.neon_enabled
135 }
136
137 #[cfg(test)]
139 pub fn scalar_only() -> Self {
140 Self {
141 avx512f_enabled: false,
142 avx2_enabled: false,
143 fma_enabled: false,
144 avx512vnni_enabled: false,
145 neon_enabled: false,
146 dotprod_enabled: false,
147 }
148 }
149}
150
151static SIMD_CONFIG: OnceLock<SimdConfig> = OnceLock::new();
153
154#[inline]
158pub fn simd_config() -> SimdConfig {
159 *SIMD_CONFIG.get_or_init(SimdConfig::detect)
160}