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
@@ -0,0 +1,355 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #ifdef COMPILE_SIMD_AVX2
9
+
10
+ #include <faiss/utils/rabitq_simd.h>
11
+ #include <immintrin.h>
12
+
13
+ namespace faiss::rabitq {
14
+
15
+ namespace {
16
+
17
+ inline __m256i get_lookup_256() {
18
+ return _mm256_setr_epi8(
19
+ /* 0 */ 0,
20
+ /* 1 */ 1,
21
+ /* 2 */ 1,
22
+ /* 3 */ 2,
23
+ /* 4 */ 1,
24
+ /* 5 */ 2,
25
+ /* 6 */ 2,
26
+ /* 7 */ 3,
27
+ /* 8 */ 1,
28
+ /* 9 */ 2,
29
+ /* a */ 2,
30
+ /* b */ 3,
31
+ /* c */ 2,
32
+ /* d */ 3,
33
+ /* e */ 3,
34
+ /* f */ 4,
35
+ /* 0 */ 0,
36
+ /* 1 */ 1,
37
+ /* 2 */ 1,
38
+ /* 3 */ 2,
39
+ /* 4 */ 1,
40
+ /* 5 */ 2,
41
+ /* 6 */ 2,
42
+ /* 7 */ 3,
43
+ /* 8 */ 1,
44
+ /* 9 */ 2,
45
+ /* a */ 2,
46
+ /* b */ 3,
47
+ /* c */ 2,
48
+ /* d */ 3,
49
+ /* e */ 3,
50
+ /* f */ 4);
51
+ }
52
+
53
+ inline __m256i popcount_256(__m256i v) {
54
+ const __m256i lookup = get_lookup_256();
55
+ const __m256i low_mask = _mm256_set1_epi8(0x0f);
56
+
57
+ const __m256i lo = _mm256_and_si256(v, low_mask);
58
+ const __m256i hi = _mm256_and_si256(_mm256_srli_epi16(v, 4), low_mask);
59
+ const __m256i popcnt_lo = _mm256_shuffle_epi8(lookup, lo);
60
+ const __m256i popcnt_hi = _mm256_shuffle_epi8(lookup, hi);
61
+ const __m256i popcnt = _mm256_add_epi8(popcnt_lo, popcnt_hi);
62
+ return _mm256_sad_epu8(_mm256_setzero_si256(), popcnt);
63
+ }
64
+
65
+ inline uint64_t reduce_add_256(__m256i v) {
66
+ alignas(32) uint64_t lanes[4];
67
+ _mm256_store_si256((__m256i*)lanes, v);
68
+ return lanes[0] + lanes[1] + lanes[2] + lanes[3];
69
+ }
70
+
71
+ inline __m128i popcount_128(__m128i v) {
72
+ uint64_t lane0 = _mm_extract_epi64(v, 0);
73
+ uint64_t lane1 = _mm_extract_epi64(v, 1);
74
+ uint64_t pop0 = popcount64(lane0);
75
+ uint64_t pop1 = popcount64(lane1);
76
+ return _mm_set_epi64x(pop1, pop0);
77
+ }
78
+
79
+ inline uint64_t reduce_add_128(__m128i v) {
80
+ alignas(16) uint64_t lanes[2];
81
+ _mm_store_si128((__m128i*)lanes, v);
82
+ return lanes[0] + lanes[1];
83
+ }
84
+
85
+ } // namespace
86
+
87
+ template <>
88
+ uint64_t bitwise_and_dot_product<SIMDLevel::AVX2>(
89
+ const uint8_t* query,
90
+ const uint8_t* data,
91
+ size_t size,
92
+ size_t qb) {
93
+ uint64_t sum = 0;
94
+ size_t offset = 0;
95
+ if (size_t step = 256 / 8; offset + step <= size) {
96
+ __m256i sum_256 = _mm256_setzero_si256();
97
+ for (; offset + step <= size; offset += step) {
98
+ __m256i v_x = _mm256_loadu_si256((const __m256i*)(data + offset));
99
+ for (int j = 0; j < qb; j++) {
100
+ __m256i v_q = _mm256_loadu_si256(
101
+ (const __m256i*)(query + j * size + offset));
102
+ __m256i v_and = _mm256_and_si256(v_q, v_x);
103
+ __m256i v_popcnt = popcount_256(v_and);
104
+ __m256i v_shifted = _mm256_slli_epi64(v_popcnt, j);
105
+ sum_256 = _mm256_add_epi64(sum_256, v_shifted);
106
+ }
107
+ }
108
+ sum += reduce_add_256(sum_256);
109
+ }
110
+ __m128i sum_128 = _mm_setzero_si128();
111
+ for (size_t step = 128 / 8; offset + step <= size; offset += step) {
112
+ __m128i v_x = _mm_loadu_si128((const __m128i*)(data + offset));
113
+ for (int j = 0; j < qb; j++) {
114
+ __m128i v_q = _mm_loadu_si128(
115
+ (const __m128i*)(query + j * size + offset));
116
+ __m128i v_and = _mm_and_si128(v_q, v_x);
117
+ __m128i v_popcnt = popcount_128(v_and);
118
+ __m128i v_shifted = _mm_slli_epi64(v_popcnt, j);
119
+ sum_128 = _mm_add_epi64(sum_128, v_shifted);
120
+ }
121
+ }
122
+ sum += reduce_add_128(sum_128);
123
+ for (size_t step = 64 / 8; offset + step <= size; offset += step) {
124
+ const uint64_t yv = *(const uint64_t*)(data + offset);
125
+ for (int j = 0; j < qb; j++) {
126
+ const uint64_t qv = *(const uint64_t*)(query + j * size + offset);
127
+ sum += popcount64(qv & yv) << j;
128
+ }
129
+ }
130
+ for (; offset < size; ++offset) {
131
+ const uint8_t yv = *(data + offset);
132
+ for (int j = 0; j < qb; j++) {
133
+ const uint8_t qv = *(query + j * size + offset);
134
+ sum += popcount32(qv & yv) << j;
135
+ }
136
+ }
137
+ return sum;
138
+ }
139
+
140
+ template <>
141
+ uint64_t bitwise_xor_dot_product<SIMDLevel::AVX2>(
142
+ const uint8_t* query,
143
+ const uint8_t* data,
144
+ size_t size,
145
+ size_t qb) {
146
+ uint64_t sum = 0;
147
+ size_t offset = 0;
148
+ if (size_t step = 256 / 8; offset + step <= size) {
149
+ __m256i sum_256 = _mm256_setzero_si256();
150
+ for (; offset + step <= size; offset += step) {
151
+ __m256i v_x = _mm256_loadu_si256((const __m256i*)(data + offset));
152
+ for (int j = 0; j < qb; j++) {
153
+ __m256i v_q = _mm256_loadu_si256(
154
+ (const __m256i*)(query + j * size + offset));
155
+ __m256i v_xor = _mm256_xor_si256(v_q, v_x);
156
+ __m256i v_popcnt = popcount_256(v_xor);
157
+ __m256i v_shifted = _mm256_slli_epi64(v_popcnt, j);
158
+ sum_256 = _mm256_add_epi64(sum_256, v_shifted);
159
+ }
160
+ }
161
+ sum += reduce_add_256(sum_256);
162
+ }
163
+ __m128i sum_128 = _mm_setzero_si128();
164
+ for (size_t step = 128 / 8; offset + step <= size; offset += step) {
165
+ __m128i v_x = _mm_loadu_si128((const __m128i*)(data + offset));
166
+ for (int j = 0; j < qb; j++) {
167
+ __m128i v_q = _mm_loadu_si128(
168
+ (const __m128i*)(query + j * size + offset));
169
+ __m128i v_xor = _mm_xor_si128(v_q, v_x);
170
+ __m128i v_popcnt = popcount_128(v_xor);
171
+ __m128i v_shifted = _mm_slli_epi64(v_popcnt, j);
172
+ sum_128 = _mm_add_epi64(sum_128, v_shifted);
173
+ }
174
+ }
175
+ sum += reduce_add_128(sum_128);
176
+ for (size_t step = 64 / 8; offset + step <= size; offset += step) {
177
+ const auto yv = *(const uint64_t*)(data + offset);
178
+ for (int j = 0; j < qb; j++) {
179
+ const auto qv = *(const uint64_t*)(query + j * size + offset);
180
+ sum += popcount64(qv ^ yv) << j;
181
+ }
182
+ }
183
+ for (; offset < size; ++offset) {
184
+ const auto yv = *(data + offset);
185
+ for (int j = 0; j < qb; j++) {
186
+ const auto qv = *(query + j * size + offset);
187
+ sum += popcount32(qv ^ yv) << j;
188
+ }
189
+ }
190
+ return sum;
191
+ }
192
+
193
+ template <>
194
+ uint64_t popcount<SIMDLevel::AVX2>(const uint8_t* data, size_t size) {
195
+ uint64_t sum = 0;
196
+ size_t offset = 0;
197
+ if (offset + 256 / 8 <= size) {
198
+ __m256i sum_256 = _mm256_setzero_si256();
199
+ for (size_t end; (end = offset + 256 / 8) <= size; offset = end) {
200
+ __m256i v_x = _mm256_loadu_si256((const __m256i*)(data + offset));
201
+ __m256i v_popcnt = popcount_256(v_x);
202
+ sum_256 = _mm256_add_epi64(sum_256, v_popcnt);
203
+ }
204
+ sum += reduce_add_256(sum_256);
205
+ }
206
+ __m128i sum_128 = _mm_setzero_si128();
207
+ for (size_t step = 128 / 8; offset + step <= size; offset += step) {
208
+ __m128i v_x = _mm_loadu_si128((const __m128i*)(data + offset));
209
+ sum_128 = _mm_add_epi64(sum_128, popcount_128(v_x));
210
+ }
211
+ sum += reduce_add_128(sum_128);
212
+ for (size_t step = 64 / 8; offset + step <= size; offset += step) {
213
+ const auto yv = *(const uint64_t*)(data + offset);
214
+ sum += popcount64(yv);
215
+ }
216
+ for (; offset < size; ++offset) {
217
+ const auto yv = *(data + offset);
218
+ sum += popcount32(yv);
219
+ }
220
+ return sum;
221
+ }
222
+
223
+ } // namespace faiss::rabitq
224
+
225
+ namespace faiss::rabitq::multibit {
226
+
227
+ namespace {
228
+
229
+ inline float hsum_avx2(__m256 v) {
230
+ __m128 hi = _mm256_extractf128_ps(v, 1);
231
+ __m128 lo = _mm256_castps256_ps128(v);
232
+ lo = _mm_add_ps(lo, hi);
233
+ __m128 shuf = _mm_movehdup_ps(lo);
234
+ lo = _mm_add_ps(lo, shuf);
235
+ shuf = _mm_movehl_ps(shuf, lo);
236
+ return _mm_cvtss_f32(_mm_add_ss(lo, shuf));
237
+ }
238
+
239
+ inline float ip_1exbit_avx2(
240
+ const uint8_t* __restrict sign_bits,
241
+ const uint8_t* __restrict ex_code,
242
+ const float* __restrict rotated_q,
243
+ size_t d,
244
+ float cb) {
245
+ __m256 acc = _mm256_setzero_ps();
246
+ const __m256 v_cb = _mm256_set1_ps(cb);
247
+ const __m256 v_two = _mm256_set1_ps(2.0f);
248
+ const __m256 v_one = _mm256_set1_ps(1.0f);
249
+ const __m256i bit_pos = _mm256_setr_epi32(1, 2, 4, 8, 16, 32, 64, 128);
250
+ const __m256i zero = _mm256_setzero_si256();
251
+
252
+ size_t i = 0;
253
+ for (; i + 8 <= d; i += 8) {
254
+ uint8_t sb = sign_bits[i / 8];
255
+ uint8_t eb = ex_code[i / 8];
256
+
257
+ __m256i sb_cmp = _mm256_cmpgt_epi32(
258
+ _mm256_and_si256(_mm256_set1_epi32(sb), bit_pos), zero);
259
+ __m256 sb_f = _mm256_and_ps(_mm256_castsi256_ps(sb_cmp), v_one);
260
+
261
+ __m256i eb_cmp = _mm256_cmpgt_epi32(
262
+ _mm256_and_si256(_mm256_set1_epi32(eb), bit_pos), zero);
263
+ __m256 eb_f = _mm256_and_ps(_mm256_castsi256_ps(eb_cmp), v_one);
264
+
265
+ __m256 recon = _mm256_add_ps(_mm256_fmadd_ps(sb_f, v_two, eb_f), v_cb);
266
+ __m256 rq = _mm256_loadu_ps(rotated_q + i);
267
+ acc = _mm256_fmadd_ps(rq, recon, acc);
268
+ }
269
+
270
+ float result = hsum_avx2(acc);
271
+ result += ip_scalar(sign_bits, ex_code, rotated_q, i, d, 1, cb);
272
+ return result;
273
+ }
274
+
275
+ #ifdef __BMI2__
276
+ inline float ip_bitplane_avx2(
277
+ const uint8_t* __restrict sign_bits,
278
+ const uint8_t* __restrict ex_code,
279
+ const float* __restrict rotated_q,
280
+ size_t d,
281
+ size_t ex_bits,
282
+ float cb) {
283
+ __m256 acc = _mm256_setzero_ps();
284
+ const __m256 v_one = _mm256_set1_ps(1.0f);
285
+ const __m256i bit_pos = _mm256_setr_epi32(1, 2, 4, 8, 16, 32, 64, 128);
286
+ const __m256i zero = _mm256_setzero_si256();
287
+ const __m256 v_cb = _mm256_set1_ps(cb);
288
+
289
+ uint64_t pext_masks[7];
290
+ __m256 v_weights[8];
291
+ for (size_t b = 0; b < ex_bits; b++) {
292
+ uint64_t m = 0;
293
+ for (int j = 0; j < 8; j++) {
294
+ m |= (1ULL << (b + j * ex_bits));
295
+ }
296
+ pext_masks[b] = m;
297
+ v_weights[b] = _mm256_set1_ps(static_cast<float>(1u << b));
298
+ }
299
+ v_weights[ex_bits] = _mm256_set1_ps(static_cast<float>(1u << ex_bits));
300
+
301
+ size_t i = 0;
302
+ for (; i + 8 <= d; i += 8) {
303
+ __m256i sb_cmp = _mm256_cmpgt_epi32(
304
+ _mm256_and_si256(_mm256_set1_epi32(sign_bits[i / 8]), bit_pos),
305
+ zero);
306
+ __m256 recon = _mm256_mul_ps(
307
+ _mm256_and_ps(_mm256_castsi256_ps(sb_cmp), v_one),
308
+ v_weights[ex_bits]);
309
+
310
+ uint64_t ex64 = 0;
311
+ memcpy(&ex64, ex_code + (i / 8) * ex_bits, sizeof(uint64_t));
312
+
313
+ for (size_t b = 0; b < ex_bits; b++) {
314
+ auto plane = static_cast<uint8_t>(_pext_u64(ex64, pext_masks[b]));
315
+ __m256i p_cmp = _mm256_cmpgt_epi32(
316
+ _mm256_and_si256(_mm256_set1_epi32(plane), bit_pos), zero);
317
+ __m256 p_f = _mm256_and_ps(_mm256_castsi256_ps(p_cmp), v_one);
318
+ recon = _mm256_fmadd_ps(p_f, v_weights[b], recon);
319
+ }
320
+
321
+ __m256 rq = _mm256_loadu_ps(rotated_q + i);
322
+ acc = _mm256_fmadd_ps(rq, _mm256_add_ps(recon, v_cb), acc);
323
+ }
324
+
325
+ float result = hsum_avx2(acc);
326
+ result += ip_scalar(sign_bits, ex_code, rotated_q, i, d, ex_bits, cb);
327
+ return result;
328
+ }
329
+ #endif // __BMI2__
330
+
331
+ } // namespace
332
+
333
+ template <>
334
+ float compute_inner_product<SIMDLevel::AVX2>(
335
+ const uint8_t* __restrict sign_bits,
336
+ const uint8_t* __restrict ex_code,
337
+ const float* __restrict rotated_q,
338
+ size_t d,
339
+ size_t ex_bits,
340
+ float cb) {
341
+ if (ex_bits == 1) {
342
+ return ip_1exbit_avx2(sign_bits, ex_code, rotated_q, d, cb);
343
+ }
344
+
345
+ #ifdef __BMI2__
346
+ if (ex_bits <= 7) {
347
+ return ip_bitplane_avx2(sign_bits, ex_code, rotated_q, d, ex_bits, cb);
348
+ }
349
+ #endif
350
+ return ip_scalar(sign_bits, ex_code, rotated_q, 0, d, ex_bits, cb);
351
+ }
352
+
353
+ } // namespace faiss::rabitq::multibit
354
+
355
+ #endif // COMPILE_SIMD_AVX2