faiss 0.6.4 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +1 -1
  4. data/lib/faiss/version.rb +1 -1
  5. data/vendor/faiss/faiss/AutoTune.cpp +175 -0
  6. data/vendor/faiss/faiss/Clustering.cpp +150 -60
  7. data/vendor/faiss/faiss/Clustering.h +29 -0
  8. data/vendor/faiss/faiss/IVFlib.cpp +99 -0
  9. data/vendor/faiss/faiss/IVFlib.h +15 -0
  10. data/vendor/faiss/faiss/Index.cpp +44 -0
  11. data/vendor/faiss/faiss/Index.h +19 -14
  12. data/vendor/faiss/faiss/IndexBinary.cpp +8 -0
  13. data/vendor/faiss/faiss/IndexBinary.h +8 -0
  14. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +82 -4
  15. data/vendor/faiss/faiss/IndexBinaryHNSW.h +19 -0
  16. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +34 -0
  17. data/vendor/faiss/faiss/IndexFastScan.cpp +33 -17
  18. data/vendor/faiss/faiss/IndexFastScan.h +6 -3
  19. data/vendor/faiss/faiss/IndexFlat.cpp +56 -0
  20. data/vendor/faiss/faiss/IndexFlat.h +31 -0
  21. data/vendor/faiss/faiss/IndexFlatCodes.cpp +6 -1
  22. data/vendor/faiss/faiss/IndexHNSW.cpp +456 -10
  23. data/vendor/faiss/faiss/IndexHNSW.h +38 -0
  24. data/vendor/faiss/faiss/IndexIDMap.cpp +32 -0
  25. data/vendor/faiss/faiss/IndexIDMap.h +7 -0
  26. data/vendor/faiss/faiss/IndexIVF.cpp +281 -31
  27. data/vendor/faiss/faiss/IndexIVF.h +53 -1
  28. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +46 -14
  29. data/vendor/faiss/faiss/IndexIVFFastScan.h +4 -2
  30. data/vendor/faiss/faiss/IndexIVFFlat.cpp +33 -0
  31. data/vendor/faiss/faiss/IndexIVFFlat.h +16 -0
  32. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +1 -0
  33. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +3 -20
  34. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +50 -14
  35. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -2
  36. data/vendor/faiss/faiss/IndexIVFSQFastScan.cpp +855 -0
  37. data/vendor/faiss/faiss/IndexIVFSQFastScan.h +145 -0
  38. data/vendor/faiss/faiss/IndexNNDescent.cpp +0 -3
  39. data/vendor/faiss/faiss/IndexPiPNN.cpp +201 -0
  40. data/vendor/faiss/faiss/IndexPiPNN.h +83 -0
  41. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +6 -3
  42. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +10 -4
  43. data/vendor/faiss/faiss/IndexReplicas.cpp +20 -0
  44. data/vendor/faiss/faiss/IndexReplicas.h +9 -0
  45. data/vendor/faiss/faiss/IndexSQFastScan.cpp +648 -0
  46. data/vendor/faiss/faiss/IndexSQFastScan.h +129 -0
  47. data/vendor/faiss/faiss/IndexShards.cpp +10 -0
  48. data/vendor/faiss/faiss/IndexShards.h +5 -0
  49. data/vendor/faiss/faiss/SuperKMeans.cpp +57 -15
  50. data/vendor/faiss/faiss/SuperKMeans.h +9 -4
  51. data/vendor/faiss/faiss/VectorTransform.cpp +3 -2
  52. data/vendor/faiss/faiss/clone_index.cpp +24 -0
  53. data/vendor/faiss/faiss/gpu/Dataset.h +112 -0
  54. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +16 -13
  55. data/vendor/faiss/faiss/gpu/GpuCloner.h +4 -0
  56. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +3 -0
  57. data/vendor/faiss/faiss/gpu/GpuIndex.h +4 -13
  58. data/vendor/faiss/faiss/gpu/GpuIndexBinaryCagra.h +26 -13
  59. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +45 -22
  60. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +11 -0
  61. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +6 -0
  62. data/vendor/faiss/faiss/gpu/test/TestGpuDatasetHeader.cpp +18 -0
  63. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +215 -0
  64. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +98 -0
  65. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +11 -0
  66. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +1 -1
  67. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +11 -0
  68. data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +92 -0
  69. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +4 -0
  70. data/vendor/faiss/faiss/gpu_metal/MetalIndexBinaryFlat.h +69 -0
  71. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +38 -0
  72. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +106 -0
  73. data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +10 -0
  74. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +2 -0
  75. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +1 -6
  76. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +134 -45
  77. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +36 -0
  78. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +286 -136
  79. data/vendor/faiss/faiss/impl/DistanceComputer.cpp +63 -0
  80. data/vendor/faiss/faiss/impl/DistanceComputer.h +3 -29
  81. data/vendor/faiss/faiss/impl/HNSW.cpp +46 -10
  82. data/vendor/faiss/faiss/impl/HNSW.h +72 -0
  83. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +6 -19
  84. data/vendor/faiss/faiss/impl/NNDescent.cpp +2 -1
  85. data/vendor/faiss/faiss/impl/NSG.cpp +3 -2
  86. data/vendor/faiss/faiss/impl/Panorama.h +3 -2
  87. data/vendor/faiss/faiss/impl/PiPNN.cpp +822 -0
  88. data/vendor/faiss/faiss/impl/PiPNN.h +122 -0
  89. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +54 -11
  90. data/vendor/faiss/faiss/impl/RaBitQUtils.h +1 -1
  91. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +81 -57
  92. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +15 -0
  93. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +29 -0
  94. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +1 -6
  95. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +0 -4
  96. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +0 -4
  97. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +5 -2
  98. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +0 -4
  99. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +0 -4
  100. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +0 -4
  101. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +0 -4
  102. data/vendor/faiss/faiss/impl/expanded_scanners.h +88 -0
  103. data/vendor/faiss/faiss/impl/fast_scan/FastScanDistancePostProcessing.h +4 -0
  104. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +61 -64
  105. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +13 -14
  106. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +17 -129
  107. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +25 -19
  108. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.cpp +5 -0
  109. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +0 -4
  110. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +0 -4
  111. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +0 -88
  112. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +0 -4
  113. data/vendor/faiss/faiss/impl/fast_scan/kernels_neon.h +155 -0
  114. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +22 -1
  115. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd512.h +3 -2
  116. data/vendor/faiss/faiss/impl/fast_scan/simd_result_handlers.h +41 -23
  117. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +0 -4
  118. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +0 -4
  119. data/vendor/faiss/faiss/impl/index_read.cpp +172 -0
  120. data/vendor/faiss/faiss/impl/index_write.cpp +95 -0
  121. data/vendor/faiss/faiss/impl/pipnn/HashPrune.cpp +159 -0
  122. data/vendor/faiss/faiss/impl/pipnn/HashPrune.h +69 -0
  123. data/vendor/faiss/faiss/impl/pipnn/Partition.cpp +587 -0
  124. data/vendor/faiss/faiss/impl/pipnn/Partition.h +93 -0
  125. data/vendor/faiss/faiss/impl/pipnn/kernels.cpp +326 -0
  126. data/vendor/faiss/faiss/impl/pipnn/kernels.h +92 -0
  127. data/vendor/faiss/faiss/impl/platform_macros.h +45 -0
  128. data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +0 -4
  129. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +79 -4
  130. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +6 -0
  131. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +0 -4
  132. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +0 -4
  133. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +0 -4
  134. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx2.h +4 -0
  135. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx512.h +4 -1
  136. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +19 -0
  137. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +6 -6
  138. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +131 -6
  139. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +0 -4
  140. data/vendor/faiss/faiss/impl/pq_code_distance/pq_rvv_kernel.h +89 -0
  141. data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +21 -10
  142. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +45 -18
  143. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +2 -1
  144. data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +0 -4
  145. data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +0 -4
  146. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +0 -4
  147. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +0 -4
  148. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +5 -1
  149. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +28 -52
  150. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +59 -11
  151. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +226 -77
  152. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +482 -103
  153. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +2 -149
  154. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +3 -698
  155. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +66 -57
  156. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +101 -96
  157. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +3185 -144
  158. data/vendor/faiss/faiss/impl/scalar_quantizer/sq8_coefficients.h +48 -0
  159. data/vendor/faiss/faiss/impl/scalar_quantizer/sq8_rvv_kernel.h +546 -0
  160. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +2 -2
  161. data/vendor/faiss/faiss/impl/simd_dispatch.h +7 -0
  162. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx2.h +14 -0
  163. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +7 -8
  164. data/vendor/faiss/faiss/impl/sq_fastscan_utils.h +232 -0
  165. data/vendor/faiss/faiss/index_factory.cpp +76 -0
  166. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +3 -1
  167. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +3 -2
  168. data/vendor/faiss/faiss/utils/AlignedTable.h +6 -1
  169. data/vendor/faiss/faiss/utils/Heap.cpp +4 -3
  170. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +16 -5
  171. data/vendor/faiss/faiss/utils/bf16.h +36 -0
  172. data/vendor/faiss/faiss/utils/distances.cpp +226 -15
  173. data/vendor/faiss/faiss/utils/distances.h +34 -0
  174. data/vendor/faiss/faiss/utils/distances_dispatch.h +6 -4
  175. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +2 -5
  176. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +0 -14
  177. data/vendor/faiss/faiss/utils/distances_fused/rvv.cpp +25 -0
  178. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +0 -4
  179. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +0 -4
  180. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +2 -1
  181. data/vendor/faiss/faiss/utils/distances_simd.cpp +9 -0
  182. data/vendor/faiss/faiss/utils/fp16-fp16c.h +4 -0
  183. data/vendor/faiss/faiss/utils/fp16-inl.h +26 -52
  184. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +0 -4
  185. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +0 -4
  186. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_vpopcnt.cpp +0 -4
  187. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +33 -5
  188. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_vpopcnt.h +15 -30
  189. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +0 -4
  190. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +2 -1
  191. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +0 -4
  192. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +0 -4
  193. data/vendor/faiss/faiss/utils/pq_code_distance.h +8 -4
  194. data/vendor/faiss/faiss/utils/prefetch.h +1 -26
  195. data/vendor/faiss/faiss/utils/quantize_lut.cpp +26 -27
  196. data/vendor/faiss/faiss/utils/quantize_lut.h +11 -0
  197. data/vendor/faiss/faiss/utils/rabitq_simd.h +51 -16
  198. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +9 -4
  199. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +37 -5
  200. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +64 -5
  201. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +64 -5
  202. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +353 -71
  203. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv_kernel.h +68 -0
  204. data/vendor/faiss/faiss/utils/simd_impl/exhaustive_L2sqr_blas_cmax.h +93 -0
  205. data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels.h +76 -0
  206. data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels_avx2.cpp +52 -0
  207. data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels_avx512.cpp +52 -0
  208. data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels_neon.cpp +48 -0
  209. data/vendor/faiss/faiss/utils/simd_impl/masked_sum-avx2.h +44 -0
  210. data/vendor/faiss/faiss/utils/simd_impl/masked_sum-avx512.h +43 -0
  211. data/vendor/faiss/faiss/utils/simd_impl/masked_sum.h +38 -0
  212. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +0 -4
  213. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +0 -4
  214. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +54 -15
  215. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +38 -21
  216. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_vpopcnt.cpp +51 -14
  217. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +297 -10
  218. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +0 -4
  219. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +0 -4
  220. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +0 -4
  221. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_sve.cpp +0 -4
  222. data/vendor/faiss/faiss/utils/simd_levels.cpp +19 -3
  223. data/vendor/faiss/faiss/utils/simd_levels.h +74 -1
  224. data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +0 -4
  225. data/vendor/faiss/faiss/utils/transpose/transpose-avx512-inl.h +0 -4
  226. data/vendor/faiss/faiss/utils/utils.cpp +80 -0
  227. data/vendor/faiss/faiss/utils/utils.h +24 -0
  228. metadata +33 -1
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  #include <faiss/utils/distances.h>
9
+ #include <faiss/utils/simd_impl/masked_sum-avx2.h>
9
10
 
10
11
  #include <immintrin.h>
11
12
 
@@ -105,6 +106,19 @@ void fvec_madd<SIMDLevel::AVX2>(
105
106
  }
106
107
  }
107
108
 
109
+ template <>
110
+ float fvec_masked_sum<SIMDLevel::AVX2>(
111
+ const float* x,
112
+ const uint8_t* bits,
113
+ size_t d) {
114
+ return masked_sum<SIMDLevel::AVX2>(x, bits, d);
115
+ }
116
+
117
+ // Internal linkage: the same template is compiled with other -m flags in
118
+ // the other per-SIMD distances TU, and a shared symbol would let the linker
119
+ // hand one level the other's code.
120
+ namespace {
121
+
108
122
  template <size_t DIM>
109
123
  void fvec_L2sqr_ny_y_transposed_D(
110
124
  float* distances,
@@ -181,6 +195,8 @@ void fvec_L2sqr_ny_y_transposed_D(
181
195
  }
182
196
  }
183
197
 
198
+ } // namespace
199
+
184
200
  template <>
185
201
  void fvec_L2sqr_ny_transposed<SIMDLevel::AVX2>(
186
202
  float* dis,
@@ -199,8 +215,12 @@ void fvec_L2sqr_ny_transposed<SIMDLevel::AVX2>(
199
215
  switch (d) {
200
216
  DISPATCH(1)
201
217
  DISPATCH(2)
218
+ DISPATCH(3)
202
219
  DISPATCH(4)
220
+ DISPATCH(6)
203
221
  DISPATCH(8)
222
+ DISPATCH(12)
223
+ DISPATCH(16)
204
224
  default:
205
225
  return fvec_L2sqr_ny_transposed<SIMDLevel::NONE>(
206
226
  dis, x, y, y_sqlen, d, d_offset, ny);
@@ -1060,6 +1080,11 @@ size_t fvec_L2sqr_ny_nearest<SIMDLevel::AVX2>(
1060
1080
  &fvec_L2sqr_ny_nearest_D8<SIMDLevel::AVX2>);
1061
1081
  }
1062
1082
 
1083
+ // Internal linkage: the same template is compiled with other -m flags in
1084
+ // the other per-SIMD distances TU, and a shared symbol would let the linker
1085
+ // hand one level the other's code.
1086
+ namespace {
1087
+
1063
1088
  template <size_t DIM>
1064
1089
  size_t fvec_L2sqr_ny_nearest_y_transposed_D(
1065
1090
  float* /*distances_tmp_buffer*/,
@@ -1176,6 +1201,8 @@ size_t fvec_L2sqr_ny_nearest_y_transposed_D(
1176
1201
  return current_min_index;
1177
1202
  }
1178
1203
 
1204
+ } // namespace
1205
+
1179
1206
  template <>
1180
1207
  size_t fvec_L2sqr_ny_nearest_y_transposed<SIMDLevel::AVX2>(
1181
1208
  float* distances_tmp_buffer,
@@ -1213,9 +1240,11 @@ int fvec_madd_and_argmin<SIMDLevel::AVX2>(
1213
1240
  return fvec_madd_and_argmin_sse(n, a, bf, b, c);
1214
1241
  }
1215
1242
 
1216
- template <>
1217
- void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
1218
- const float* x,
1243
+ namespace {
1244
+
1245
+ template <class QueryTiles>
1246
+ void exhaustive_L2sqr_blas_cmax_avx2(
1247
+ QueryTiles& queries,
1219
1248
  const float* y,
1220
1249
  size_t d,
1221
1250
  size_t nx,
@@ -1235,7 +1264,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
1235
1264
  std::unique_ptr<float[]> x_norms(new float[nx]);
1236
1265
  std::unique_ptr<float[]> del2;
1237
1266
 
1238
- fvec_norms_L2sqr(x_norms.get(), x, d, nx);
1267
+ queries.prepare_norms(nx, x_norms.get());
1239
1268
 
1240
1269
  if (!y_norms) {
1241
1270
  float* y_norms2 = new float[ny];
@@ -1250,6 +1279,8 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
1250
1279
  i1 = nx;
1251
1280
  }
1252
1281
 
1282
+ const float* xt = queries.tile(i0, i1, x_norms.get());
1283
+
1253
1284
  res.begin_multiple(i0, i1);
1254
1285
 
1255
1286
  for (size_t j0 = 0; j0 < ny; j0 += bs_y) {
@@ -1269,7 +1300,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
1269
1300
  &one,
1270
1301
  y + j0 * d,
1271
1302
  &di,
1272
- x + i0 * d,
1303
+ xt,
1273
1304
  &di,
1274
1305
  &zero,
1275
1306
  ip_block.get(),
@@ -1427,4 +1458,32 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
1427
1458
  }
1428
1459
  }
1429
1460
 
1461
+ } // namespace
1462
+
1463
+ template <>
1464
+ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
1465
+ const float* x,
1466
+ const float* y,
1467
+ size_t d,
1468
+ size_t nx,
1469
+ size_t ny,
1470
+ Top1BlockResultHandler<CMax<float, int64_t>>& res,
1471
+ const float* y_norms) {
1472
+ Fp32QueryTiles queries{x, d};
1473
+ exhaustive_L2sqr_blas_cmax_avx2(queries, y, d, nx, ny, res, y_norms);
1474
+ }
1475
+
1476
+ template <>
1477
+ void exhaustive_L2sqr_blas_cmax_fp16<SIMDLevel::AVX2>(
1478
+ const uint16_t* x,
1479
+ const float* y,
1480
+ size_t d,
1481
+ size_t nx,
1482
+ size_t ny,
1483
+ Top1BlockResultHandler<CMax<float, int64_t>>& res,
1484
+ const float* y_norms) {
1485
+ Fp16QueryTiles queries(x, d, nx);
1486
+ exhaustive_L2sqr_blas_cmax_avx2(queries, y, d, nx, ny, res, y_norms);
1487
+ }
1488
+
1430
1489
  } // namespace faiss
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  #include <faiss/utils/distances.h>
9
+ #include <faiss/utils/simd_impl/masked_sum-avx512.h>
9
10
 
10
11
  #include <immintrin.h>
11
12
 
@@ -78,6 +79,19 @@ void fvec_madd<SIMDLevel::AVX512>(
78
79
  }
79
80
  }
80
81
 
82
+ template <>
83
+ float fvec_masked_sum<SIMDLevel::AVX512>(
84
+ const float* x,
85
+ const uint8_t* bits,
86
+ size_t d) {
87
+ return masked_sum<SIMDLevel::AVX512>(x, bits, d);
88
+ }
89
+
90
+ // Internal linkage: the same template is compiled with other -m flags in
91
+ // the other per-SIMD distances TU, and a shared symbol would let the linker
92
+ // hand one level the other's code.
93
+ namespace {
94
+
81
95
  template <size_t DIM>
82
96
  void fvec_L2sqr_ny_y_transposed_D(
83
97
  float* distances,
@@ -151,6 +165,8 @@ void fvec_L2sqr_ny_y_transposed_D(
151
165
  }
152
166
  }
153
167
 
168
+ } // namespace
169
+
154
170
  template <>
155
171
  void fvec_L2sqr_ny_transposed<SIMDLevel::AVX512>(
156
172
  float* dis,
@@ -169,8 +185,12 @@ void fvec_L2sqr_ny_transposed<SIMDLevel::AVX512>(
169
185
  switch (d) {
170
186
  DISPATCH(1)
171
187
  DISPATCH(2)
188
+ DISPATCH(3)
172
189
  DISPATCH(4)
190
+ DISPATCH(6)
173
191
  DISPATCH(8)
192
+ DISPATCH(12)
193
+ DISPATCH(16)
174
194
  default:
175
195
  return fvec_L2sqr_ny_transposed<SIMDLevel::NONE>(
176
196
  dis, x, y, y_sqlen, d, d_offset, ny);
@@ -983,6 +1003,11 @@ size_t fvec_L2sqr_ny_nearest<SIMDLevel::AVX512>(
983
1003
  &fvec_L2sqr_ny_nearest_D8<SIMDLevel::AVX512>);
984
1004
  }
985
1005
 
1006
+ // Internal linkage: the same template is compiled with other -m flags in
1007
+ // the other per-SIMD distances TU, and a shared symbol would let the linker
1008
+ // hand one level the other's code.
1009
+ namespace {
1010
+
986
1011
  template <size_t DIM>
987
1012
  size_t fvec_L2sqr_ny_nearest_y_transposed_D(
988
1013
  float* /* distances_tmp_buffer */,
@@ -1096,6 +1121,8 @@ size_t fvec_L2sqr_ny_nearest_y_transposed_D(
1096
1121
  return current_min_index;
1097
1122
  }
1098
1123
 
1124
+ } // namespace
1125
+
1099
1126
  template <>
1100
1127
  size_t fvec_L2sqr_ny_nearest_y_transposed<SIMDLevel::AVX512>(
1101
1128
  float* distances_tmp_buffer,
@@ -1133,9 +1160,11 @@ int fvec_madd_and_argmin<SIMDLevel::AVX512>(
1133
1160
  return fvec_madd_and_argmin_sse(n, a, bf, b, c);
1134
1161
  }
1135
1162
 
1136
- template <>
1137
- void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
1138
- const float* x,
1163
+ namespace {
1164
+
1165
+ template <class QueryTiles>
1166
+ void exhaustive_L2sqr_blas_cmax_avx512(
1167
+ QueryTiles& queries,
1139
1168
  const float* y,
1140
1169
  size_t d,
1141
1170
  size_t nx,
@@ -1154,7 +1183,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
1154
1183
  std::unique_ptr<float[]> x_norms(new float[nx]);
1155
1184
  std::unique_ptr<float[]> del2;
1156
1185
 
1157
- fvec_norms_L2sqr(x_norms.get(), x, d, nx);
1186
+ queries.prepare_norms(nx, x_norms.get());
1158
1187
 
1159
1188
  if (!y_norms) {
1160
1189
  float* y_norms2 = new float[ny];
@@ -1169,6 +1198,8 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
1169
1198
  i1 = nx;
1170
1199
  }
1171
1200
 
1201
+ const float* xt = queries.tile(i0, i1, x_norms.get());
1202
+
1172
1203
  res.begin_multiple(i0, i1);
1173
1204
 
1174
1205
  for (size_t j0 = 0; j0 < ny; j0 += bs_y) {
@@ -1188,7 +1219,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
1188
1219
  &one,
1189
1220
  y + j0 * d,
1190
1221
  &di,
1191
- x + i0 * d,
1222
+ xt,
1192
1223
  &di,
1193
1224
  &zero,
1194
1225
  ip_block.get(),
@@ -1340,4 +1371,32 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
1340
1371
  }
1341
1372
  }
1342
1373
 
1374
+ } // namespace
1375
+
1376
+ template <>
1377
+ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
1378
+ const float* x,
1379
+ const float* y,
1380
+ size_t d,
1381
+ size_t nx,
1382
+ size_t ny,
1383
+ Top1BlockResultHandler<CMax<float, int64_t>>& res,
1384
+ const float* y_norms) {
1385
+ Fp32QueryTiles queries{x, d};
1386
+ exhaustive_L2sqr_blas_cmax_avx512(queries, y, d, nx, ny, res, y_norms);
1387
+ }
1388
+
1389
+ template <>
1390
+ void exhaustive_L2sqr_blas_cmax_fp16<SIMDLevel::AVX512>(
1391
+ const uint16_t* x,
1392
+ const float* y,
1393
+ size_t d,
1394
+ size_t nx,
1395
+ size_t ny,
1396
+ Top1BlockResultHandler<CMax<float, int64_t>>& res,
1397
+ const float* y_norms) {
1398
+ Fp16QueryTiles queries(x, d, nx);
1399
+ exhaustive_L2sqr_blas_cmax_avx512(queries, y, d, nx, ny, res, y_norms);
1400
+ }
1401
+
1343
1402
  } // namespace faiss