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
@@ -30,6 +30,8 @@ uint64_t SIMDConfig::supported_simd_levels = 0;
30
30
  // Microarchitecture flags (x86). Default false; set by
31
31
  // detect_x86_uarch_flags() at load time.
32
32
  bool SIMDConfig::avx512_split = false;
33
+ bool SIMDConfig::scalar_gather = false;
34
+ bool SIMDConfig::sq_avx512_4_accumulators = false;
33
35
 
34
36
  // Resolved here rather than in the header so that dependents, which never see
35
37
  // FAISS_ENABLE_DD, still get the answer for the faiss they link against.
@@ -137,6 +139,13 @@ void detect_x86_uarch_flags() {
137
139
  // AMD Zen 4 / Zen 4c (Bergamo) is family 0x19 and splits AVX-512.
138
140
  // (Zen 5, family 0x1A, has a native 512-bit datapath and is excluded.)
139
141
  SIMDConfig::avx512_split = is_amd && display_family == 0x19u;
142
+ // Measured on Milan, Bergamo (0x19) and Turin (0x1A); other AMD families
143
+ // keep the gather kernels.
144
+ SIMDConfig::scalar_gather =
145
+ is_amd && (display_family == 0x19u || display_family == 0x1Au);
146
+ // Measured on Bergamo (0x19) and Turin (0x1A). Intel Skylake and Sapphire
147
+ // Rapids are faster with one accumulator.
148
+ SIMDConfig::sq_avx512_4_accumulators = SIMDConfig::scalar_gather;
140
149
  }
141
150
 
142
151
  #else // Not x86-64
@@ -191,6 +200,8 @@ SIMDConfig::SIMDConfig(const char** faiss_simd_level_env) {
191
200
  if (!env_var) {
192
201
  level = auto_detect_simd_level();
193
202
  } else {
203
+ // The microarchitecture flags describe the CPU, not the forced level.
204
+ detect_x86_uarch_flags();
194
205
  // Forcing a level the CPU lacks is allowed. Forcing one the binary
195
206
  // does not hold is not: dispatch would fall to NONE and skip every
196
207
  // level between. Walk down to the nearest compiled level instead.
@@ -274,7 +285,9 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
274
285
 
275
286
  #if defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_AVX512)
276
287
  bool has_avx2 = (ebx7 & (1 << 5)) != 0;
277
- if (has_avx2) {
288
+ // The AVX2 and higher SIMD files compile with -mbmi2.
289
+ bool has_bmi2 = (ebx7 & (1 << 8)) != 0;
290
+ if (has_avx2 && has_bmi2) {
278
291
  supported_simd_levels |= (1 << static_cast<int>(SIMDLevel::AVX2));
279
292
  detected_level = SIMDLevel::AVX2;
280
293
  }
@@ -282,7 +295,7 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
282
295
  #if defined(COMPILE_SIMD_AVX512)
283
296
  bool cpu_has_avx512f = (ebx7 & (1 << 16)) != 0;
284
297
  bool os_supports_avx512 = (xcr0 & 0xE0) == 0xE0;
285
- bool has_avx512f = cpu_has_avx512f && os_supports_avx512;
298
+ bool has_avx512f = cpu_has_avx512f && os_supports_avx512 && has_bmi2;
286
299
  if (has_avx512f) {
287
300
  bool has_avx512cd = (ebx7 & (1 << 28)) != 0;
288
301
  bool has_avx512vl = (ebx7 & (1 << 31)) != 0;
@@ -342,7 +355,10 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
342
355
  #endif
343
356
 
344
357
  #if defined(__riscv) && defined(COMPILE_SIMD_RISCV_RVV)
345
- // RVV is always available on RISC-V builds compiled with rv64gcv.
358
+ // RVV is always available on RISC-V builds compiled with
359
+ // rv64gcv_zvfhmin: that ISA (including Zvfhmin, used by the QT_fp16
360
+ // kernels) is the minimum requirement to run such binaries at all,
361
+ // so no runtime feature check is needed beyond the build contract.
346
362
  supported_simd_levels |= (1 << static_cast<int>(SIMDLevel::RISCV_RVV));
347
363
  detected_level = SIMDLevel::RISCV_RVV;
348
364
  #endif
@@ -26,7 +26,11 @@ enum class SIMDLevel {
26
26
  ARM_NEON,
27
27
  ARM_SVE, // Scalable Vector Extension (ARMv8.2+)
28
28
  // riscv
29
- RISCV_RVV, // RISC-V Vector Extension (rv64gcv)
29
+ // RISC-V Vector Extension. The minimum ISA for this level is rv64gcv
30
+ // plus Zvfhmin (FP16 vector conversion), which the QT_fp16 kernels
31
+ // require; RVV translation units are compiled with
32
+ // -march=rv64gcv_zvfhmin.
33
+ RISCV_RVV,
30
34
 
31
35
  // Appended to preserve the numeric values of the existing public enum.
32
36
  // AVX-512 core features plus AVX512_VPOPCNTDQ and AVX512_BITALG
@@ -36,6 +40,65 @@ enum class SIMDLevel {
36
40
  COUNT
37
41
  };
38
42
 
43
+ /***************************************************************
44
+ * FAISS_SIMD_TU(L): 1 if the library contains SIMD level L
45
+ * (COMPILE_SIMD_L) and the current translation unit can use the
46
+ * instructions of L (compiler macro), else 0. Use it to guard level
47
+ * code in headers that common files also include, for example
48
+ * `#if FAISS_SIMD_TU(AVX512)`. It is function-like, so a header that
49
+ * uses it without including this file fails to compile.
50
+ ***************************************************************/
51
+ #ifdef SWIG
52
+ #define FAISS_SIMD_TU(level) 0
53
+ #else
54
+
55
+ #if defined(COMPILE_SIMD_AVX2) && defined(__AVX2__)
56
+ #define FAISS_SIMD_TU_AVX2 1
57
+ #else
58
+ #define FAISS_SIMD_TU_AVX2 0
59
+ #endif
60
+
61
+ #if defined(COMPILE_SIMD_AVX512) && defined(__AVX512F__)
62
+ #define FAISS_SIMD_TU_AVX512 1
63
+ #else
64
+ #define FAISS_SIMD_TU_AVX512 0
65
+ #endif
66
+
67
+ #if defined(COMPILE_SIMD_AVX512_VPOPCNT) && defined(__AVX512VPOPCNTDQ__)
68
+ #define FAISS_SIMD_TU_AVX512_VPOPCNT 1
69
+ #else
70
+ #define FAISS_SIMD_TU_AVX512_VPOPCNT 0
71
+ #endif
72
+
73
+ #if defined(COMPILE_SIMD_AVX512_SPR) && defined(__AVX512FP16__)
74
+ #define FAISS_SIMD_TU_AVX512_SPR 1
75
+ #else
76
+ #define FAISS_SIMD_TU_AVX512_SPR 0
77
+ #endif
78
+
79
+ // __aarch64__ is not defined by MSVC, which cannot compile the NEON code.
80
+ #if defined(COMPILE_SIMD_ARM_NEON) && defined(__aarch64__)
81
+ #define FAISS_SIMD_TU_ARM_NEON 1
82
+ #else
83
+ #define FAISS_SIMD_TU_ARM_NEON 0
84
+ #endif
85
+
86
+ #if defined(COMPILE_SIMD_ARM_SVE) && defined(__ARM_FEATURE_SVE)
87
+ #define FAISS_SIMD_TU_ARM_SVE 1
88
+ #else
89
+ #define FAISS_SIMD_TU_ARM_SVE 0
90
+ #endif
91
+
92
+ #if defined(COMPILE_SIMD_RISCV_RVV) && defined(__riscv_vector)
93
+ #define FAISS_SIMD_TU_RISCV_RVV 1
94
+ #else
95
+ #define FAISS_SIMD_TU_RISCV_RVV 0
96
+ #endif
97
+
98
+ #define FAISS_SIMD_TU(level) FAISS_SIMD_TU_##level
99
+
100
+ #endif // SWIG
101
+
39
102
  /***************************************************************
40
103
  * SINGLE_SIMD_LEVEL: the SIMD level for code without explicit SL context.
41
104
  *
@@ -183,6 +246,16 @@ struct FAISS_API SIMDConfig {
183
246
  /// 256-bit kernel.
184
247
  static bool avx512_split;
185
248
 
249
+ /// Scalar table lookups beat gathers (AMD Zen 3, Zen 4 and Zen 5,
250
+ /// families 0x19 and 0x1A), so the 8-bit PQ code-distance kernels use
251
+ /// the scalar path instead of gathers.
252
+ static bool scalar_gather;
253
+
254
+ /// Same CPUs as scalar_gather. The AVX-512 QT_fp16, QT_bf16 and QT_8bit
255
+ /// inner-product distance loops use four accumulators per code at a
256
+ /// large d.
257
+ static bool sq_avx512_4_accumulators;
258
+
186
259
  static SIMDLevel auto_detect_simd_level();
187
260
 
188
261
  /// Whether this faiss build dispatches SIMD at runtime.
@@ -10,8 +10,6 @@
10
10
  // This file contains transposing kernels for AVX2 for
11
11
  // tiny float/int32 matrices, such as 8x2.
12
12
 
13
- #ifdef __AVX2__
14
-
15
13
  #include <immintrin.h>
16
14
 
17
15
  namespace faiss {
@@ -161,5 +159,3 @@ inline void transpose_8x8(
161
159
  }
162
160
 
163
161
  } // namespace faiss
164
-
165
- #endif
@@ -10,8 +10,6 @@
10
10
  // This file contains transposing kernels for AVX512 for // tiny float/int32
11
11
  // matrices, such as 16x2.
12
12
 
13
- #ifdef __AVX512F__
14
-
15
13
  #include <immintrin.h>
16
14
 
17
15
  namespace faiss {
@@ -172,5 +170,3 @@ inline void transpose_16x8(
172
170
  }
173
171
 
174
172
  } // namespace faiss
175
-
176
- #endif
@@ -28,14 +28,19 @@
28
28
  #include <omp.h>
29
29
 
30
30
  #include <algorithm>
31
+ #include <atomic>
31
32
  #include <set>
32
33
  #include <type_traits>
33
34
  #include <unordered_set>
35
+ #include <utility>
34
36
  #include <vector>
35
37
 
36
38
  #include <faiss/impl/AuxIndexStructures.h>
37
39
  #include <faiss/impl/FaissAssert.h>
40
+ #include <faiss/impl/simd_dispatch.h>
38
41
  #include <faiss/utils/random.h>
42
+ #include <faiss/utils/simd_impl/fp16_kernels.h>
43
+ #include <faiss/utils/sorting.h>
39
44
 
40
45
  #ifndef FINTEGER
41
46
  #define FINTEGER long
@@ -175,6 +180,18 @@ uint64_t get_cycles() {
175
180
  #endif
176
181
  }
177
182
 
183
+ namespace {
184
+ std::atomic<bool> search_stats_enabled{true};
185
+ } // namespace
186
+
187
+ void set_search_stats_enabled(bool enabled) {
188
+ search_stats_enabled.store(enabled, std::memory_order_relaxed);
189
+ }
190
+
191
+ bool get_search_stats_enabled() {
192
+ return search_stats_enabled.load(std::memory_order_relaxed);
193
+ }
194
+
178
195
  #ifdef __linux__
179
196
 
180
197
  size_t get_mem_usage_kb() {
@@ -461,6 +478,51 @@ void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs) {
461
478
  }
462
479
  }
463
480
 
481
+ size_t find_duplicate_codes(
482
+ size_t n,
483
+ size_t code_size,
484
+ const uint8_t* codes,
485
+ int64_t* rep) {
486
+ constexpr int64_t nbucket = 1 << 16;
487
+ std::vector<uint64_t> hash(n), bucket(n);
488
+ // the low bits of a checksum only depend on the low bits of its inputs
489
+ #pragma omp parallel for
490
+ for (int64_t i = 0; i < int64_t(n); i++) {
491
+ hash[i] = SplitMix64RandomGenerator(
492
+ bvec_checksum(code_size, codes + i * code_size))
493
+ .next();
494
+ bucket[i] = hash[i] % nbucket;
495
+ }
496
+ std::vector<int64_t> lims(nbucket + 1), order(n);
497
+ bucket_sort(n, bucket.data(), nbucket, lims.data(), order.data());
498
+
499
+ size_t n_distinct = 0;
500
+ #pragma omp parallel for schedule(dynamic) reduction(+ : n_distinct)
501
+ for (int64_t b = 0; b < nbucket; b++) {
502
+ int64_t* begin = order.data() + lims[b];
503
+ int64_t* end = order.data() + lims[b + 1];
504
+ std::sort(begin, end, [&](int64_t x, int64_t y) {
505
+ return std::pair(hash[x], x) < std::pair(hash[y], y);
506
+ });
507
+ const int64_t* group = begin;
508
+ for (const int64_t* r = begin; r < end; r++) {
509
+ if (hash[*r] != hash[*group]) {
510
+ group = r;
511
+ }
512
+ const int64_t* q = group;
513
+ while (q < r &&
514
+ memcmp(codes + *q * code_size,
515
+ codes + *r * code_size,
516
+ code_size) != 0) {
517
+ q++;
518
+ }
519
+ rep[*r] = *q;
520
+ n_distinct += q == r;
521
+ }
522
+ }
523
+ return n_distinct;
524
+ }
525
+
464
526
  const float* fvecs_maybe_subsample(
465
527
  size_t d,
466
528
  size_t* n,
@@ -626,6 +688,24 @@ void CombinerRangeKNN<T>::write_result(T* D_res, int64_t* I_res) {
626
688
  template struct CombinerRangeKNN<float>;
627
689
  template struct CombinerRangeKNN<int16_t>;
628
690
 
691
+ void fp16_to_fp32(size_t n, const uint16_t* x, float* out) {
692
+ // below this many values, stay on the calling thread
693
+ constexpr size_t block = size_t(1) << 16;
694
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_BASE>([&]<SIMDLevel SL>() {
695
+ if (n <= block) {
696
+ detail::fp16_to_fp32_kernel<SL>(n, x, out);
697
+ return;
698
+ }
699
+ const int64_t nblock = static_cast<int64_t>((n + block - 1) / block);
700
+ #pragma omp parallel for
701
+ for (int64_t b = 0; b < nblock; b++) {
702
+ const size_t j0 = static_cast<size_t>(b) * block;
703
+ detail::fp16_to_fp32_kernel<SL>(
704
+ std::min(block, n - j0), x + j0, out + j0);
705
+ }
706
+ });
707
+ }
708
+
629
709
  void CodeSet::insert(size_t n, const uint8_t* codes, bool* inserted) {
630
710
  for (size_t i = 0; i < n; i++) {
631
711
  auto res = s.insert(
@@ -48,6 +48,14 @@ size_t get_mem_usage_kb();
48
48
 
49
49
  uint64_t get_cycles();
50
50
 
51
+ /** Enable or disable the collection of global search statistics (enabled by
52
+ * default). The flag is process-wide. When it is disabled, searches may skip
53
+ * updates to global stats objects, so their values are unspecified. At the
54
+ * moment, the flag controls hnsw_stats and rabitq_stats.
55
+ */
56
+ void set_search_stats_enabled(bool enabled);
57
+ bool get_search_stats_enabled();
58
+
51
59
  /***************************************************************************
52
60
  * Misc matrix and vector manipulation functions
53
61
  ***************************************************************************/
@@ -122,6 +130,14 @@ uint64_t bvec_checksum(size_t n, const uint8_t* a);
122
130
  */
123
131
  void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs);
124
132
 
133
+ /// rep[i]: lowest row whose code equals code i (codes: n x code_size).
134
+ /// Returns the number of distinct codes.
135
+ size_t find_duplicate_codes(
136
+ size_t n,
137
+ size_t code_size,
138
+ const uint8_t* codes,
139
+ int64_t* rep);
140
+
125
141
  /** random subsamples a set of vectors if there are too many of them
126
142
  *
127
143
  * @param d dimension of the vectors
@@ -156,6 +172,14 @@ void binary_to_real(size_t d, const uint8_t* x_in, float* x_out);
156
172
  */
157
173
  void real_to_binary(size_t d, const float* x_in, uint8_t* x_out);
158
174
 
175
+ /** Convert packed IEEE binary16 values to fp32 (exact).
176
+ *
177
+ * @param n number of values
178
+ * @param x input fp16 values, size n
179
+ * @param out output fp32 values, size n
180
+ */
181
+ void fp16_to_fp32(size_t n, const uint16_t* x, float* out);
182
+
159
183
  /** A reasonable hashing function */
160
184
  uint64_t hash_bytes(const uint8_t* bytes, int64_t n);
161
185
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faiss
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -123,6 +123,8 @@ files:
123
123
  - vendor/faiss/faiss/IndexIVFRaBitQ.h
124
124
  - vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp
125
125
  - vendor/faiss/faiss/IndexIVFRaBitQFastScan.h
126
+ - vendor/faiss/faiss/IndexIVFSQFastScan.cpp
127
+ - vendor/faiss/faiss/IndexIVFSQFastScan.h
126
128
  - vendor/faiss/faiss/IndexIVFSpectralHash.cpp
127
129
  - vendor/faiss/faiss/IndexIVFSpectralHash.h
128
130
  - vendor/faiss/faiss/IndexLSH.cpp
@@ -139,6 +141,8 @@ files:
139
141
  - vendor/faiss/faiss/IndexPQ.h
140
142
  - vendor/faiss/faiss/IndexPQFastScan.cpp
141
143
  - vendor/faiss/faiss/IndexPQFastScan.h
144
+ - vendor/faiss/faiss/IndexPiPNN.cpp
145
+ - vendor/faiss/faiss/IndexPiPNN.h
142
146
  - vendor/faiss/faiss/IndexPreTransform.cpp
143
147
  - vendor/faiss/faiss/IndexPreTransform.h
144
148
  - vendor/faiss/faiss/IndexRaBitQ.cpp
@@ -151,6 +155,8 @@ files:
151
155
  - vendor/faiss/faiss/IndexReplicas.h
152
156
  - vendor/faiss/faiss/IndexRowwiseMinMax.cpp
153
157
  - vendor/faiss/faiss/IndexRowwiseMinMax.h
158
+ - vendor/faiss/faiss/IndexSQFastScan.cpp
159
+ - vendor/faiss/faiss/IndexSQFastScan.h
154
160
  - vendor/faiss/faiss/IndexScalarQuantizer.cpp
155
161
  - vendor/faiss/faiss/IndexScalarQuantizer.h
156
162
  - vendor/faiss/faiss/IndexShards.cpp
@@ -183,6 +189,7 @@ files:
183
189
  - vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h
184
190
  - vendor/faiss/faiss/factory_tools.cpp
185
191
  - vendor/faiss/faiss/factory_tools.h
192
+ - vendor/faiss/faiss/gpu/Dataset.h
186
193
  - vendor/faiss/faiss/gpu/GpuAutoTune.cpp
187
194
  - vendor/faiss/faiss/gpu/GpuAutoTune.h
188
195
  - vendor/faiss/faiss/gpu/GpuCloner.cpp
@@ -216,6 +223,7 @@ files:
216
223
  - vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp
217
224
  - vendor/faiss/faiss/gpu/perf/WriteIndex.cpp
218
225
  - vendor/faiss/faiss/gpu/test/TestCodePacking.cpp
226
+ - vendor/faiss/faiss/gpu/test/TestGpuDatasetHeader.cpp
219
227
  - vendor/faiss/faiss/gpu/test/TestGpuIcmEncoder.cpp
220
228
  - vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp
221
229
  - vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp
@@ -240,6 +248,7 @@ files:
240
248
  - vendor/faiss/faiss/gpu_metal/MetalDistance.h
241
249
  - vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h
242
250
  - vendor/faiss/faiss/gpu_metal/MetalIndex.h
251
+ - vendor/faiss/faiss/gpu_metal/MetalIndexBinaryFlat.h
243
252
  - vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h
244
253
  - vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h
245
254
  - vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h
@@ -263,6 +272,7 @@ files:
263
272
  - vendor/faiss/faiss/impl/CodePacker.h
264
273
  - vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp
265
274
  - vendor/faiss/faiss/impl/CodePackerRaBitQ.h
275
+ - vendor/faiss/faiss/impl/DistanceComputer.cpp
266
276
  - vendor/faiss/faiss/impl/DistanceComputer.h
267
277
  - vendor/faiss/faiss/impl/EDENQuantizer.h
268
278
  - vendor/faiss/faiss/impl/FaissAssert.h
@@ -285,6 +295,8 @@ files:
285
295
  - vendor/faiss/faiss/impl/PanoramaStats.h
286
296
  - vendor/faiss/faiss/impl/PdxLayout.cpp
287
297
  - vendor/faiss/faiss/impl/PdxLayout.h
298
+ - vendor/faiss/faiss/impl/PiPNN.cpp
299
+ - vendor/faiss/faiss/impl/PiPNN.h
288
300
  - vendor/faiss/faiss/impl/PolysemousTraining.cpp
289
301
  - vendor/faiss/faiss/impl/PolysemousTraining.h
290
302
  - vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp
@@ -338,6 +350,7 @@ files:
338
350
  - vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp
339
351
  - vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp
340
352
  - vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp
353
+ - vendor/faiss/faiss/impl/fast_scan/kernels_neon.h
341
354
  - vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h
342
355
  - vendor/faiss/faiss/impl/fast_scan/kernels_simd512.h
343
356
  - vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h
@@ -362,6 +375,12 @@ files:
362
375
  - vendor/faiss/faiss/impl/mapped_io.cpp
363
376
  - vendor/faiss/faiss/impl/mapped_io.h
364
377
  - vendor/faiss/faiss/impl/maybe_owned_vector.h
378
+ - vendor/faiss/faiss/impl/pipnn/HashPrune.cpp
379
+ - vendor/faiss/faiss/impl/pipnn/HashPrune.h
380
+ - vendor/faiss/faiss/impl/pipnn/Partition.cpp
381
+ - vendor/faiss/faiss/impl/pipnn/Partition.h
382
+ - vendor/faiss/faiss/impl/pipnn/kernels.cpp
383
+ - vendor/faiss/faiss/impl/pipnn/kernels.h
365
384
  - vendor/faiss/faiss/impl/platform_macros.h
366
385
  - vendor/faiss/faiss/impl/polysemous_training/avx512.cpp
367
386
  - vendor/faiss/faiss/impl/polysemous_training/dispatch.h
@@ -378,6 +397,7 @@ files:
378
397
  - vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h
379
398
  - vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h
380
399
  - vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp
400
+ - vendor/faiss/faiss/impl/pq_code_distance/pq_rvv_kernel.h
381
401
  - vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h
382
402
  - vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp
383
403
  - vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp
@@ -400,6 +420,8 @@ files:
400
420
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h
401
421
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp
402
422
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp
423
+ - vendor/faiss/faiss/impl/scalar_quantizer/sq8_coefficients.h
424
+ - vendor/faiss/faiss/impl/scalar_quantizer/sq8_rvv_kernel.h
403
425
  - vendor/faiss/faiss/impl/scalar_quantizer/training.cpp
404
426
  - vendor/faiss/faiss/impl/scalar_quantizer/training.h
405
427
  - vendor/faiss/faiss/impl/simd_dispatch.h
@@ -410,6 +432,7 @@ files:
410
432
  - vendor/faiss/faiss/impl/simdlib/simdlib_emulated.h
411
433
  - vendor/faiss/faiss/impl/simdlib/simdlib_neon.h
412
434
  - vendor/faiss/faiss/impl/simdlib/simdlib_ppc64.h
435
+ - vendor/faiss/faiss/impl/sq_fastscan_utils.h
413
436
  - vendor/faiss/faiss/impl/svs_io.cpp
414
437
  - vendor/faiss/faiss/impl/svs_io.h
415
438
  - vendor/faiss/faiss/impl/zerocopy_io.cpp
@@ -459,6 +482,7 @@ files:
459
482
  - vendor/faiss/faiss/utils/distances_fused/avx512.cpp
460
483
  - vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp
461
484
  - vendor/faiss/faiss/utils/distances_fused/distances_fused.h
485
+ - vendor/faiss/faiss/utils/distances_fused/rvv.cpp
462
486
  - vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp
463
487
  - vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp
464
488
  - vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h
@@ -504,10 +528,18 @@ files:
504
528
  - vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp
505
529
  - vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp
506
530
  - vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp
531
+ - vendor/faiss/faiss/utils/simd_impl/distances_rvv_kernel.h
507
532
  - vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h
508
533
  - vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h
509
534
  - vendor/faiss/faiss/utils/simd_impl/exhaustive_L2sqr_blas_cmax.h
535
+ - vendor/faiss/faiss/utils/simd_impl/fp16_kernels.h
536
+ - vendor/faiss/faiss/utils/simd_impl/fp16_kernels_avx2.cpp
537
+ - vendor/faiss/faiss/utils/simd_impl/fp16_kernels_avx512.cpp
538
+ - vendor/faiss/faiss/utils/simd_impl/fp16_kernels_neon.cpp
510
539
  - vendor/faiss/faiss/utils/simd_impl/hamming_impl.h
540
+ - vendor/faiss/faiss/utils/simd_impl/masked_sum-avx2.h
541
+ - vendor/faiss/faiss/utils/simd_impl/masked_sum-avx512.h
542
+ - vendor/faiss/faiss/utils/simd_impl/masked_sum.h
511
543
  - vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp
512
544
  - vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp
513
545
  - vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h