faiss 0.6.0 → 0.6.1

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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -261,6 +261,9 @@ void inner_product_to_L2sqr(
261
261
  */
262
262
  void fvec_add(size_t d, const float* a, const float* b, float* c);
263
263
 
264
+ template <SIMDLevel>
265
+ void fvec_add(size_t d, const float* a, const float* b, float* c);
266
+
264
267
  /** compute c := a + b for a, c vectors and b a scalar
265
268
  *
266
269
  * c and a can overlap
@@ -270,6 +273,9 @@ void fvec_add(size_t d, const float* a, const float* b, float* c);
270
273
  */
271
274
  void fvec_add(size_t d, const float* a, float b, float* c);
272
275
 
276
+ template <SIMDLevel>
277
+ void fvec_add(size_t d, const float* a, float b, float* c);
278
+
273
279
  /** compute c := a - b for vectors
274
280
  *
275
281
  * c and a can overlap, c and b can overlap
@@ -280,6 +286,9 @@ void fvec_add(size_t d, const float* a, float b, float* c);
280
286
  */
281
287
  void fvec_sub(size_t d, const float* a, const float* b, float* c);
282
288
 
289
+ template <SIMDLevel>
290
+ void fvec_sub(size_t d, const float* a, const float* b, float* c);
291
+
283
292
  /***************************************************************************
284
293
  * Compute a subset of distances
285
294
  ***************************************************************************/
@@ -360,7 +369,7 @@ void pairwise_indexed_inner_product(
360
369
  * KNN functions
361
370
  ***************************************************************************/
362
371
 
363
- // threshold on nx above which we switch to BLAS to compute distances
372
+ // threshold on nx * d above which we switch to BLAS to compute distances
364
373
  FAISS_API extern int distance_compute_blas_threshold;
365
374
 
366
375
  // block sizes for BLAS distance computations
@@ -542,6 +551,16 @@ void compute_PQ_dis_tables_dsub2(
542
551
  bool is_inner_product,
543
552
  float* dis_tables);
544
553
 
554
+ template <SIMDLevel>
555
+ void compute_PQ_dis_tables_dsub2(
556
+ size_t d,
557
+ size_t ksub,
558
+ const float* centroids,
559
+ size_t nx,
560
+ const float* x,
561
+ bool is_inner_product,
562
+ float* dis_tables);
563
+
545
564
  /***************************************************************************
546
565
  * Templatized versions of distance functions
547
566
  ***************************************************************************/
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * This is a PRIVATE header. Do not include in public APIs or user code.
15
15
  *
16
- * These wrappers call DISPATCH_SIMDLevel to route to the correct SIMD
16
+ * These wrappers call with_simd_level to route to the correct SIMD
17
17
  * implementation. They are plain inline functions with a _dispatch suffix
18
18
  * (e.g. fvec_L2sqr_dispatch). Internal callers that want inlining include
19
19
  * this header and call the _dispatch variants directly.
@@ -24,30 +24,36 @@
24
24
 
25
25
  #include <faiss/impl/simd_dispatch.h>
26
26
  #include <faiss/utils/distances.h>
27
+ #include <faiss/utils/extra_distances.h>
27
28
 
28
29
  namespace faiss {
29
30
 
30
31
  inline float fvec_L1_dispatch(const float* x, const float* y, size_t d) {
31
- DISPATCH_SIMDLevel(fvec_L1, x, y, d);
32
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
33
+ [&]<SIMDLevel SL>() { return fvec_L1<SL>(x, y, d); });
32
34
  }
33
35
 
34
36
  inline float fvec_Linf_dispatch(const float* x, const float* y, size_t d) {
35
- DISPATCH_SIMDLevel(fvec_Linf, x, y, d);
37
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
38
+ [&]<SIMDLevel SL>() { return fvec_Linf<SL>(x, y, d); });
36
39
  }
37
40
 
38
41
  inline float fvec_norm_L2sqr_dispatch(const float* x, size_t d) {
39
- DISPATCH_SIMDLevel(fvec_norm_L2sqr, x, d);
42
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
43
+ [&]<SIMDLevel SL>() { return fvec_norm_L2sqr<SL>(x, d); });
40
44
  }
41
45
 
42
46
  inline float fvec_L2sqr_dispatch(const float* x, const float* y, size_t d) {
43
- DISPATCH_SIMDLevel(fvec_L2sqr, x, y, d);
47
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
48
+ [&]<SIMDLevel SL>() { return fvec_L2sqr<SL>(x, y, d); });
44
49
  }
45
50
 
46
51
  inline float fvec_inner_product_dispatch(
47
52
  const float* x,
48
53
  const float* y,
49
54
  size_t d) {
50
- DISPATCH_SIMDLevel(fvec_inner_product, x, y, d);
55
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
56
+ [&]<SIMDLevel SL>() { return fvec_inner_product<SL>(x, y, d); });
51
57
  }
52
58
 
53
59
  inline void fvec_inner_product_batch_4_dispatch(
@@ -61,18 +67,10 @@ inline void fvec_inner_product_batch_4_dispatch(
61
67
  float& dis1,
62
68
  float& dis2,
63
69
  float& dis3) {
64
- DISPATCH_SIMDLevel(
65
- fvec_inner_product_batch_4,
66
- x,
67
- y0,
68
- y1,
69
- y2,
70
- y3,
71
- d,
72
- dis0,
73
- dis1,
74
- dis2,
75
- dis3);
70
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
71
+ fvec_inner_product_batch_4<SL>(
72
+ x, y0, y1, y2, y3, d, dis0, dis1, dis2, dis3);
73
+ });
76
74
  }
77
75
 
78
76
  inline void fvec_L2sqr_batch_4_dispatch(
@@ -86,8 +84,9 @@ inline void fvec_L2sqr_batch_4_dispatch(
86
84
  float& dis1,
87
85
  float& dis2,
88
86
  float& dis3) {
89
- DISPATCH_SIMDLevel(
90
- fvec_L2sqr_batch_4, x, y0, y1, y2, y3, d, dis0, dis1, dis2, dis3);
87
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
88
+ fvec_L2sqr_batch_4<SL>(x, y0, y1, y2, y3, d, dis0, dis1, dis2, dis3);
89
+ });
91
90
  }
92
91
 
93
92
  inline void fvec_L2sqr_ny_transposed_dispatch(
@@ -98,8 +97,9 @@ inline void fvec_L2sqr_ny_transposed_dispatch(
98
97
  size_t d,
99
98
  size_t d_offset,
100
99
  size_t ny) {
101
- DISPATCH_SIMDLevel(
102
- fvec_L2sqr_ny_transposed, dis, x, y, y_sqlen, d, d_offset, ny);
100
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
101
+ fvec_L2sqr_ny_transposed<SL>(dis, x, y, y_sqlen, d, d_offset, ny);
102
+ });
103
103
  }
104
104
 
105
105
  inline void fvec_inner_products_ny_dispatch(
@@ -108,7 +108,9 @@ inline void fvec_inner_products_ny_dispatch(
108
108
  const float* y,
109
109
  size_t d,
110
110
  size_t ny) {
111
- DISPATCH_SIMDLevel(fvec_inner_products_ny, ip, x, y, d, ny);
111
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
112
+ fvec_inner_products_ny<SL>(ip, x, y, d, ny);
113
+ });
112
114
  }
113
115
 
114
116
  inline void fvec_L2sqr_ny_dispatch(
@@ -117,7 +119,8 @@ inline void fvec_L2sqr_ny_dispatch(
117
119
  const float* y,
118
120
  size_t d,
119
121
  size_t ny) {
120
- DISPATCH_SIMDLevel(fvec_L2sqr_ny, dis, x, y, d, ny);
122
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
123
+ [&]<SIMDLevel SL>() { fvec_L2sqr_ny<SL>(dis, x, y, d, ny); });
121
124
  }
122
125
 
123
126
  inline size_t fvec_L2sqr_ny_nearest_dispatch(
@@ -126,8 +129,11 @@ inline size_t fvec_L2sqr_ny_nearest_dispatch(
126
129
  const float* y,
127
130
  size_t d,
128
131
  size_t ny) {
129
- DISPATCH_SIMDLevel(
130
- fvec_L2sqr_ny_nearest, distances_tmp_buffer, x, y, d, ny);
132
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
133
+ [&]<SIMDLevel SL>() {
134
+ return fvec_L2sqr_ny_nearest<SL>(
135
+ distances_tmp_buffer, x, y, d, ny);
136
+ });
131
137
  }
132
138
 
133
139
  inline size_t fvec_L2sqr_ny_nearest_y_transposed_dispatch(
@@ -138,15 +144,11 @@ inline size_t fvec_L2sqr_ny_nearest_y_transposed_dispatch(
138
144
  size_t d,
139
145
  size_t d_offset,
140
146
  size_t ny) {
141
- DISPATCH_SIMDLevel(
142
- fvec_L2sqr_ny_nearest_y_transposed,
143
- distances_tmp_buffer,
144
- x,
145
- y,
146
- y_sqlen,
147
- d,
148
- d_offset,
149
- ny);
147
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
148
+ [&]<SIMDLevel SL>() {
149
+ return fvec_L2sqr_ny_nearest_y_transposed<SL>(
150
+ distances_tmp_buffer, x, y, y_sqlen, d, d_offset, ny);
151
+ });
150
152
  }
151
153
 
152
154
  inline void fvec_madd_dispatch(
@@ -155,7 +157,8 @@ inline void fvec_madd_dispatch(
155
157
  float bf,
156
158
  const float* b,
157
159
  float* c) {
158
- DISPATCH_SIMDLevel(fvec_madd, n, a, bf, b, c);
160
+ with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
161
+ [&]<SIMDLevel SL>() { fvec_madd<SL>(n, a, bf, b, c); });
159
162
  }
160
163
 
161
164
  inline int fvec_madd_and_argmin_dispatch(
@@ -164,7 +167,84 @@ inline int fvec_madd_and_argmin_dispatch(
164
167
  float bf,
165
168
  const float* b,
166
169
  float* c) {
167
- DISPATCH_SIMDLevel(fvec_madd_and_argmin, n, a, bf, b, c);
170
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
171
+ [&]<SIMDLevel SL>() {
172
+ return fvec_madd_and_argmin<SL>(n, a, bf, b, c);
173
+ });
174
+ }
175
+
176
+ inline void fvec_sub_dispatch(
177
+ size_t d,
178
+ const float* a,
179
+ const float* b,
180
+ float* c) {
181
+ with_simd_level_256bit(
182
+ [&]<SIMDLevel level>() { fvec_sub<level>(d, a, b, c); });
183
+ }
184
+
185
+ inline void fvec_add_dispatch(
186
+ size_t d,
187
+ const float* a,
188
+ const float* b,
189
+ float* c) {
190
+ with_simd_level_256bit(
191
+ [&]<SIMDLevel level>() { fvec_add<level>(d, a, b, c); });
192
+ }
193
+
194
+ inline void fvec_add_scalar_dispatch(
195
+ size_t d,
196
+ const float* a,
197
+ float b,
198
+ float* c) {
199
+ with_simd_level_256bit(
200
+ [&]<SIMDLevel level>() { fvec_add<level>(d, a, b, c); });
201
+ }
202
+
203
+ inline void compute_PQ_dis_tables_dsub2_dispatch(
204
+ size_t d,
205
+ size_t ksub,
206
+ const float* centroids,
207
+ size_t nx,
208
+ const float* x,
209
+ bool is_inner_product,
210
+ float* dis_tables) {
211
+ with_simd_level_256bit([&]<SIMDLevel level>() {
212
+ compute_PQ_dis_tables_dsub2<level>(
213
+ d, ksub, centroids, nx, x, is_inner_product, dis_tables);
214
+ });
215
+ }
216
+
217
+ /***************************************************************************
218
+ * Dispatching function that takes a lambda directly.
219
+ * The lambda should be templated on VectorDistance, eg.:
220
+ *
221
+ * auto result = with_VectorDistance(
222
+ * metric, metric_arg, [&]<class VD>(VD vd) {
223
+ * return vd(x, y);
224
+ * });
225
+ **************************************************************************/
226
+
227
+ template <typename LambdaType>
228
+ auto with_VectorDistance(
229
+ size_t d,
230
+ MetricType metric,
231
+ float metric_arg,
232
+ LambdaType&& action) {
233
+ auto dispatch_metric = [&]<MetricType mt>() {
234
+ auto call = [&]<SIMDLevel level>() {
235
+ VectorDistance<mt, level> vd = {d, metric_arg};
236
+ return action(vd);
237
+ };
238
+
239
+ constexpr bool has_simd = mt == METRIC_INNER_PRODUCT ||
240
+ mt == METRIC_L2 || mt == METRIC_L1 || mt == METRIC_Linf;
241
+ if constexpr (!has_simd) {
242
+ return call.template operator()<SIMDLevel::NONE>();
243
+ } else {
244
+ return with_simd_level(call);
245
+ }
246
+ };
247
+ return with_metric_type(metric, dispatch_metric);
168
248
  }
169
249
 
170
250
  } // namespace faiss
@@ -7,9 +7,9 @@
7
7
 
8
8
  // -*- c++ -*-
9
9
 
10
- #include <faiss/utils/distances_fused/avx512.h>
10
+ #include <faiss/utils/distances_fused/distances_fused.h>
11
11
 
12
- #ifdef __AVX512F__
12
+ #ifdef COMPILE_SIMD_AVX512
13
13
 
14
14
  #include <immintrin.h>
15
15
 
@@ -78,7 +78,7 @@ void kernel(
78
78
  const float* const __restrict xd_0 = x + i * DIM;
79
79
 
80
80
  // prefetch the next point
81
- _mm_prefetch(xd_0 + DIM * sizeof(float), _MM_HINT_NTA);
81
+ _mm_prefetch((char*)(xd_0 + DIM * sizeof(float)), _MM_HINT_NTA);
82
82
 
83
83
  // load a single point from x
84
84
  // load -2 * value
@@ -262,10 +262,10 @@ void exhaustive_L2sqr_fused_cmax(
262
262
  }
263
263
  }
264
264
 
265
- const size_t nx_p = (nx / NX_POINTS_PER_LOOP) * NX_POINTS_PER_LOOP;
265
+ const idx_t nx_p = (nx / NX_POINTS_PER_LOOP) * NX_POINTS_PER_LOOP;
266
266
  // the main loop.
267
267
  #pragma omp parallel for schedule(dynamic)
268
- for (size_t i = 0; i < nx_p; i += NX_POINTS_PER_LOOP) {
268
+ for (idx_t i = 0; i < nx_p; i += NX_POINTS_PER_LOOP) {
269
269
  kernel<DIM, NX_POINTS_PER_LOOP, NY_POINTS_PER_LOOP>(
270
270
  x, y, y_transposed.data(), ny, res, y_norms, i);
271
271
  }
@@ -283,7 +283,8 @@ void exhaustive_L2sqr_fused_cmax(
283
283
 
284
284
  } // namespace
285
285
 
286
- bool exhaustive_L2sqr_fused_cmax_AVX512(
286
+ template <>
287
+ bool exhaustive_L2sqr_fused_cmax<SIMDLevel::AVX512>(
287
288
  const float* x,
288
289
  const float* y,
289
290
  size_t d,
@@ -343,4 +344,4 @@ bool exhaustive_L2sqr_fused_cmax_AVX512(
343
344
 
344
345
  } // namespace faiss
345
346
 
346
- #endif
347
+ #endif // COMPILE_SIMD_AVX512
@@ -7,13 +7,37 @@
7
7
 
8
8
  #include <faiss/utils/distances_fused/distances_fused.h>
9
9
 
10
- #include <faiss/impl/platform_macros.h> // NOLINT
11
-
12
- #include <faiss/utils/distances_fused/avx512.h> // NOLINT
13
- #include <faiss/utils/distances_fused/simdlib_based.h>
10
+ #include <faiss/impl/simd_dispatch.h>
14
11
 
15
12
  namespace faiss {
16
13
 
14
+ // Scalar fallback: no fused kernel available.
15
+ template <>
16
+ bool exhaustive_L2sqr_fused_cmax<SIMDLevel::NONE>(
17
+ const float*,
18
+ const float*,
19
+ size_t,
20
+ size_t,
21
+ size_t,
22
+ Top1BlockResultHandler<CMax<float, int64_t>>&,
23
+ const float*) {
24
+ return false;
25
+ }
26
+
27
+ #ifdef COMPILE_SIMD_RISCV_RVV
28
+ template <>
29
+ bool exhaustive_L2sqr_fused_cmax<SIMDLevel::RISCV_RVV>(
30
+ const float*,
31
+ const float*,
32
+ size_t,
33
+ size_t,
34
+ size_t,
35
+ Top1BlockResultHandler<CMax<float, int64_t>>&,
36
+ const float*) {
37
+ return false;
38
+ }
39
+ #endif // COMPILE_SIMD_RISCV_RVV
40
+
17
41
  bool exhaustive_L2sqr_fused_cmax(
18
42
  const float* x,
19
43
  const float* y,
@@ -27,16 +51,11 @@ bool exhaustive_L2sqr_fused_cmax(
27
51
  return true;
28
52
  }
29
53
 
30
- #ifdef __AVX512F__
31
- // avx512 kernel
32
- return exhaustive_L2sqr_fused_cmax_AVX512(x, y, d, nx, ny, res, y_norms);
33
- #elif defined(__AVX2__) || defined(__aarch64__)
34
- // avx2 or arm neon kernel
35
- return exhaustive_L2sqr_fused_cmax_simdlib(x, y, d, nx, ny, res, y_norms);
36
- #else
37
- // not supported, please use a general-purpose kernel
38
- return false;
39
- #endif
54
+ return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A0>(
55
+ [&]<SIMDLevel SL>() {
56
+ return exhaustive_L2sqr_fused_cmax<SL>(
57
+ x, y, d, nx, ny, res, y_norms);
58
+ });
40
59
  }
41
60
 
42
61
  } // namespace faiss
@@ -21,8 +21,8 @@
21
21
  #pragma once
22
22
 
23
23
  #include <faiss/impl/ResultHandler.h>
24
-
25
24
  #include <faiss/utils/Heap.h>
25
+ #include <faiss/utils/simd_levels.h>
26
26
 
27
27
  namespace faiss {
28
28
 
@@ -37,4 +37,15 @@ bool exhaustive_L2sqr_fused_cmax(
37
37
  Top1BlockResultHandler<CMax<float, int64_t>>& res,
38
38
  const float* y_norms);
39
39
 
40
+ // Per-SIMD-level implementation (defined in per-SIMD TUs).
41
+ template <SIMDLevel>
42
+ bool exhaustive_L2sqr_fused_cmax(
43
+ const float* x,
44
+ const float* y,
45
+ size_t d,
46
+ size_t nx,
47
+ size_t ny,
48
+ Top1BlockResultHandler<CMax<float, int64_t>>& res,
49
+ const float* y_norms);
50
+
40
51
  } // namespace faiss