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,120 @@
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_ARM_NEON
9
+
10
+ #define THE_LEVEL_TO_DISPATCH SIMDLevel::ARM_NEON
11
+ #include <faiss/impl/fast_scan/dispatching.h> // IWYU pragma: keep
12
+ #include <faiss/impl/fast_scan/rabitq_dispatching.h> // IWYU pragma: keep
13
+
14
+ #include <faiss/impl/fast_scan/decompose_qbs.h>
15
+
16
+ namespace faiss {
17
+
18
+ using namespace simd_result_handlers;
19
+
20
+ template <>
21
+ void accumulate_to_mem_impl<SIMDLevel::ARM_NEON>(
22
+ int nq,
23
+ size_t ntotal2,
24
+ int nsq,
25
+ const uint8_t* codes,
26
+ const uint8_t* LUT,
27
+ uint16_t* accu) {
28
+ StoreResultHandler<SIMDLevel::ARM_NEON> handler(accu, ntotal2);
29
+ DummyScaler<SIMDLevel::ARM_NEON> scaler;
30
+ accumulate<SIMDLevel::ARM_NEON>(
31
+ nq, ntotal2, nsq, codes, LUT, handler, scaler, 32 * nsq / 2);
32
+ }
33
+
34
+ } // namespace faiss
35
+
36
+ // ARM_SVE: forward to ARM_NEON implementation until a dedicated SVE
37
+ // specialization is written (same pattern as scalar_quantizer/sq-neon.cpp).
38
+ #ifdef COMPILE_SIMD_ARM_SVE
39
+
40
+ namespace faiss {
41
+
42
+ template <>
43
+ std::unique_ptr<FastScanCodeScanner> make_fast_scan_scanner_impl<
44
+ SIMDLevel::ARM_SVE>(
45
+ bool is_max,
46
+ int impl,
47
+ size_t nq,
48
+ size_t ntotal,
49
+ int64_t k,
50
+ float* distances,
51
+ int64_t* ids,
52
+ const IDSelector* sel,
53
+ bool with_id_map) {
54
+ return make_fast_scan_scanner_impl<SIMDLevel::ARM_NEON>(
55
+ is_max, impl, nq, ntotal, k, distances, ids, sel, with_id_map);
56
+ }
57
+
58
+ template <>
59
+ std::unique_ptr<FastScanCodeScanner> make_range_scanner_impl<
60
+ SIMDLevel::ARM_SVE>(
61
+ bool is_max,
62
+ RangeSearchResult& rres,
63
+ float radius,
64
+ size_t ntotal,
65
+ const IDSelector* sel) {
66
+ return make_range_scanner_impl<SIMDLevel::ARM_NEON>(
67
+ is_max, rres, radius, ntotal, sel);
68
+ }
69
+
70
+ template <>
71
+ std::unique_ptr<FastScanCodeScanner> make_partial_range_scanner_impl<
72
+ SIMDLevel::ARM_SVE>(
73
+ bool is_max,
74
+ RangeSearchPartialResult& pres,
75
+ float radius,
76
+ size_t ntotal,
77
+ size_t q0,
78
+ size_t q1,
79
+ const IDSelector* sel) {
80
+ return make_partial_range_scanner_impl<SIMDLevel::ARM_NEON>(
81
+ is_max, pres, radius, ntotal, q0, q1, sel);
82
+ }
83
+
84
+ template <>
85
+ std::unique_ptr<FastScanCodeScanner> rabitq_make_knn_scanner_impl<
86
+ SIMDLevel::ARM_SVE>(
87
+ const IndexRaBitQFastScan* index,
88
+ bool is_max,
89
+ size_t nq,
90
+ int64_t k,
91
+ float* distances,
92
+ int64_t* ids,
93
+ const IDSelector* sel,
94
+ const FastScanDistancePostProcessing& context,
95
+ bool is_multi_bit) {
96
+ return rabitq_make_knn_scanner_impl<SIMDLevel::ARM_NEON>(
97
+ index, is_max, nq, k, distances, ids, sel, context, is_multi_bit);
98
+ }
99
+
100
+ template <>
101
+ std::unique_ptr<FastScanCodeScanner> rabitq_ivf_make_knn_scanner_impl<
102
+ SIMDLevel::ARM_SVE>(
103
+ bool is_max,
104
+ const IndexIVFRaBitQFastScan* index,
105
+ size_t nq,
106
+ size_t k,
107
+ float* distances,
108
+ int64_t* ids,
109
+ const IDSelector* sel,
110
+ const FastScanDistancePostProcessing* context,
111
+ bool multi_bit) {
112
+ return rabitq_ivf_make_knn_scanner_impl<SIMDLevel::ARM_NEON>(
113
+ is_max, index, nq, k, distances, ids, sel, context, multi_bit);
114
+ }
115
+
116
+ } // namespace faiss
117
+
118
+ #endif // COMPILE_SIMD_ARM_SVE
119
+
120
+ #endif // COMPILE_SIMD_ARM_NEON
@@ -0,0 +1,104 @@
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
+ // RISC-V RVV: forward all fast_scan specializations to NONE until
9
+ // dedicated RVV implementations are written.
10
+
11
+ #ifdef COMPILE_SIMD_RISCV_RVV
12
+
13
+ #include <faiss/impl/fast_scan/fast_scan.h>
14
+
15
+ namespace faiss {
16
+
17
+ template <>
18
+ void accumulate_to_mem_impl<SIMDLevel::RISCV_RVV>(
19
+ int nq,
20
+ size_t ntotal2,
21
+ int nsq,
22
+ const uint8_t* codes,
23
+ const uint8_t* LUT,
24
+ uint16_t* accu) {
25
+ accumulate_to_mem_impl<SIMDLevel::NONE>(nq, ntotal2, nsq, codes, LUT, accu);
26
+ }
27
+
28
+ template <>
29
+ std::unique_ptr<FastScanCodeScanner> make_fast_scan_scanner_impl<
30
+ SIMDLevel::RISCV_RVV>(
31
+ bool is_max,
32
+ int impl,
33
+ size_t nq,
34
+ size_t ntotal,
35
+ int64_t k,
36
+ float* distances,
37
+ int64_t* ids,
38
+ const IDSelector* sel,
39
+ bool with_id_map) {
40
+ return make_fast_scan_scanner_impl<SIMDLevel::NONE>(
41
+ is_max, impl, nq, ntotal, k, distances, ids, sel, with_id_map);
42
+ }
43
+
44
+ template <>
45
+ std::unique_ptr<FastScanCodeScanner> make_range_scanner_impl<
46
+ SIMDLevel::RISCV_RVV>(
47
+ bool is_max,
48
+ RangeSearchResult& rres,
49
+ float radius,
50
+ size_t ntotal,
51
+ const IDSelector* sel) {
52
+ return make_range_scanner_impl<SIMDLevel::NONE>(
53
+ is_max, rres, radius, ntotal, sel);
54
+ }
55
+
56
+ template <>
57
+ std::unique_ptr<FastScanCodeScanner> make_partial_range_scanner_impl<
58
+ SIMDLevel::RISCV_RVV>(
59
+ bool is_max,
60
+ RangeSearchPartialResult& pres,
61
+ float radius,
62
+ size_t ntotal,
63
+ size_t q0,
64
+ size_t q1,
65
+ const IDSelector* sel) {
66
+ return make_partial_range_scanner_impl<SIMDLevel::NONE>(
67
+ is_max, pres, radius, ntotal, q0, q1, sel);
68
+ }
69
+
70
+ template <>
71
+ std::unique_ptr<FastScanCodeScanner> rabitq_make_knn_scanner_impl<
72
+ SIMDLevel::RISCV_RVV>(
73
+ const IndexRaBitQFastScan* index,
74
+ bool is_max,
75
+ size_t nq,
76
+ int64_t k,
77
+ float* distances,
78
+ int64_t* ids,
79
+ const IDSelector* sel,
80
+ const FastScanDistancePostProcessing& context,
81
+ bool is_multi_bit) {
82
+ return rabitq_make_knn_scanner_impl<SIMDLevel::NONE>(
83
+ index, is_max, nq, k, distances, ids, sel, context, is_multi_bit);
84
+ }
85
+
86
+ template <>
87
+ std::unique_ptr<FastScanCodeScanner> rabitq_ivf_make_knn_scanner_impl<
88
+ SIMDLevel::RISCV_RVV>(
89
+ bool is_max,
90
+ const IndexIVFRaBitQFastScan* index,
91
+ size_t nq,
92
+ size_t k,
93
+ float* distances,
94
+ int64_t* ids,
95
+ const IDSelector* sel,
96
+ const FastScanDistancePostProcessing* context,
97
+ bool multi_bit) {
98
+ return rabitq_ivf_make_knn_scanner_impl<SIMDLevel::NONE>(
99
+ is_max, index, nq, k, distances, ids, sel, context, multi_bit);
100
+ }
101
+
102
+ } // namespace faiss
103
+
104
+ #endif // COMPILE_SIMD_RISCV_RVV
@@ -0,0 +1,213 @@
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
+ #pragma once
9
+
10
+ #include <faiss/impl/simdlib/simdlib_dispatch.h>
11
+
12
+ namespace faiss {
13
+
14
+ /*
15
+ * Multi-BB variant: accumulates NQ queries x BB*32 database elements.
16
+ * Used by the search_1 path (bbs > 32).
17
+ *
18
+ * KernelSL selects the SIMD type width used for the inner accumulation
19
+ * loop. In DD mode the caller passes THE_LEVEL_TO_DISPATCH so the
20
+ * kernel uses real AVX2/AVX512 types rather than the emulated-scalar
21
+ * fallback that SINGLE_SIMD_LEVEL_256 would give.
22
+ */
23
+ template <
24
+ int NQ,
25
+ int BB,
26
+ SIMDLevel KernelSL = SINGLE_SIMD_LEVEL,
27
+ class ResultHandler,
28
+ class Scaler>
29
+ void kernel_accumulate_block(
30
+ int nsq,
31
+ const uint8_t* codes,
32
+ const uint8_t* LUT,
33
+ ResultHandler& res,
34
+ const Scaler& scaler) {
35
+ constexpr SIMDLevel SL256 = simd256_level_selector<KernelSL>::value;
36
+ using simd16uint16 = simd16uint16_tpl<SL256>;
37
+ using simd32uint8 = simd32uint8_tpl<SL256>;
38
+
39
+ // distance accumulators
40
+ simd16uint16 accu[NQ][BB][4];
41
+
42
+ for (int q = 0; q < NQ; q++) {
43
+ for (int b = 0; b < BB; b++) {
44
+ accu[q][b][0].clear();
45
+ accu[q][b][1].clear();
46
+ accu[q][b][2].clear();
47
+ accu[q][b][3].clear();
48
+ }
49
+ }
50
+
51
+ for (int sq = 0; sq < nsq - scaler.nscale; sq += 2) {
52
+ simd32uint8 lut_cache[NQ];
53
+ for (int q = 0; q < NQ; q++) {
54
+ lut_cache[q] = simd32uint8(LUT);
55
+ LUT += 32;
56
+ }
57
+
58
+ for (int b = 0; b < BB; b++) {
59
+ simd32uint8 c = simd32uint8(codes);
60
+ codes += 32;
61
+ simd32uint8 mask(15);
62
+ simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
63
+ simd32uint8 clo = c & mask;
64
+
65
+ for (int q = 0; q < NQ; q++) {
66
+ simd32uint8 lut = lut_cache[q];
67
+ simd32uint8 res0 = lut.lookup_2_lanes(clo);
68
+ simd32uint8 res1 = lut.lookup_2_lanes(chi);
69
+
70
+ accu[q][b][0] += simd16uint16(res0);
71
+ accu[q][b][1] += simd16uint16(res0) >> 8;
72
+
73
+ accu[q][b][2] += simd16uint16(res1);
74
+ accu[q][b][3] += simd16uint16(res1) >> 8;
75
+ }
76
+ }
77
+ }
78
+
79
+ for (int sq = 0; sq < scaler.nscale; sq += 2) {
80
+ simd32uint8 lut_cache[NQ];
81
+ for (int q = 0; q < NQ; q++) {
82
+ lut_cache[q] = simd32uint8(LUT);
83
+ LUT += 32;
84
+ }
85
+
86
+ for (int b = 0; b < BB; b++) {
87
+ simd32uint8 c = simd32uint8(codes);
88
+ codes += 32;
89
+ simd32uint8 mask(15);
90
+ simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
91
+ simd32uint8 clo = c & mask;
92
+
93
+ for (int q = 0; q < NQ; q++) {
94
+ simd32uint8 lut = lut_cache[q];
95
+
96
+ simd32uint8 res0 = scaler.lookup(lut, clo);
97
+ accu[q][b][0] += scaler.scale_lo(res0); // handle vectors 0..7
98
+ accu[q][b][1] += scaler.scale_hi(res0); // handle vectors 8..15
99
+
100
+ simd32uint8 res1 = scaler.lookup(lut, chi);
101
+ accu[q][b][2] += scaler.scale_lo(res1); // handle vectors 16..23
102
+ accu[q][b][3] +=
103
+ scaler.scale_hi(res1); // handle vectors 24..31
104
+ }
105
+ }
106
+ }
107
+
108
+ for (int q = 0; q < NQ; q++) {
109
+ for (int b = 0; b < BB; b++) {
110
+ accu[q][b][0] -= accu[q][b][1] << 8;
111
+ simd16uint16 dis0 = combine2x2(accu[q][b][0], accu[q][b][1]);
112
+
113
+ accu[q][b][2] -= accu[q][b][3] << 8;
114
+ simd16uint16 dis1 = combine2x2(accu[q][b][2], accu[q][b][3]);
115
+
116
+ res.handle(q, b, dis0, dis1);
117
+ }
118
+ }
119
+ }
120
+
121
+ /*
122
+ * Single-BB QBS variant: accumulates NQ queries x 32 db elements (BB=1).
123
+ * Used by the decompose_qbs layer for non-AVX512 paths.
124
+ */
125
+ template <
126
+ int NQ,
127
+ SIMDLevel KernelSL = SINGLE_SIMD_LEVEL,
128
+ class ResultHandler,
129
+ class Scaler>
130
+ void pq4_kernel_qbs_256(
131
+ int nsq,
132
+ const uint8_t* codes,
133
+ const uint8_t* LUT,
134
+ ResultHandler& res,
135
+ const Scaler& scaler) {
136
+ constexpr SIMDLevel SL256 = simd256_level_selector<KernelSL>::value;
137
+ using simd16uint16 = simd16uint16_tpl<SL256>;
138
+ using simd32uint8 = simd32uint8_tpl<SL256>;
139
+
140
+ // dummy alloc to keep the windows compiler happy
141
+ constexpr int NQA = NQ > 0 ? NQ : 1;
142
+ // distance accumulators
143
+ // layout: accu[q][b]: distance accumulator for vectors 8*b..8*b+7
144
+ simd16uint16 accu[NQA][4];
145
+
146
+ for (int q = 0; q < NQ; q++) {
147
+ for (int b = 0; b < 4; b++) {
148
+ accu[q][b].clear();
149
+ }
150
+ }
151
+
152
+ // _mm_prefetch(codes + 768, 0);
153
+ for (int sq = 0; sq < nsq - scaler.nscale; sq += 2) {
154
+ simd32uint8 c;
155
+ c.loadu(codes);
156
+ codes += 32;
157
+
158
+ simd32uint8 mask(0xf);
159
+ // shift op does not exist for int8...
160
+ simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
161
+ simd32uint8 clo = c & mask;
162
+
163
+ for (int q = 0; q < NQ; q++) {
164
+ // load LUTs for 2 quantizers
165
+ simd32uint8 lut(LUT);
166
+ LUT += 32;
167
+
168
+ simd32uint8 res0 = lut.lookup_2_lanes(clo);
169
+ simd32uint8 res1 = lut.lookup_2_lanes(chi);
170
+
171
+ accu[q][0] += simd16uint16(res0);
172
+ accu[q][1] += simd16uint16(res0) >> 8;
173
+
174
+ accu[q][2] += simd16uint16(res1);
175
+ accu[q][3] += simd16uint16(res1) >> 8;
176
+ }
177
+ }
178
+
179
+ for (int sq = 0; sq < scaler.nscale; sq += 2) {
180
+ simd32uint8 c;
181
+ c.loadu(codes);
182
+ codes += 32;
183
+
184
+ simd32uint8 mask(0xf);
185
+ // shift op does not exist for int8...
186
+ simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
187
+ simd32uint8 clo = c & mask;
188
+
189
+ for (int q = 0; q < NQ; q++) {
190
+ // load LUTs for 2 quantizers
191
+ simd32uint8 lut(LUT);
192
+ LUT += 32;
193
+
194
+ simd32uint8 res0 = scaler.lookup(lut, clo);
195
+ accu[q][0] += scaler.scale_lo(res0); // handle vectors 0..7
196
+ accu[q][1] += scaler.scale_hi(res0); // handle vectors 8..15
197
+
198
+ simd32uint8 res1 = scaler.lookup(lut, chi);
199
+ accu[q][2] += scaler.scale_lo(res1); // handle vectors 16..23
200
+ accu[q][3] += scaler.scale_hi(res1); // handle vectors 24..31
201
+ }
202
+ }
203
+
204
+ for (int q = 0; q < NQ; q++) {
205
+ accu[q][0] -= accu[q][1] << 8;
206
+ simd16uint16 dis0 = combine2x2(accu[q][0], accu[q][1]);
207
+ accu[q][2] -= accu[q][3] << 8;
208
+ simd16uint16 dis1 = combine2x2(accu[q][2], accu[q][3]);
209
+ res.handle(q, 0, dis0, dis1);
210
+ }
211
+ }
212
+
213
+ } // namespace faiss