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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/faiss/extconf.rb +2 -1
- data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
- data/ext/faiss/index_binary.cpp +1 -1
- data/ext/faiss/kmeans.cpp +1 -1
- data/ext/faiss/pca_matrix.cpp +1 -1
- data/ext/faiss/product_quantizer.cpp +1 -1
- data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +93 -80
- data/vendor/faiss/faiss/Clustering.cpp +39 -240
- data/vendor/faiss/faiss/Clustering.h +6 -0
- data/vendor/faiss/faiss/IVFlib.cpp +41 -21
- data/vendor/faiss/faiss/Index.cpp +6 -5
- data/vendor/faiss/faiss/Index.h +5 -5
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
- data/vendor/faiss/faiss/IndexBinary.h +4 -4
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
- data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
- data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
- data/vendor/faiss/faiss/IndexFastScan.h +25 -23
- data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
- data/vendor/faiss/faiss/IndexFlat.h +21 -18
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
- data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
- data/vendor/faiss/faiss/IndexHNSW.h +16 -2
- data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
- data/vendor/faiss/faiss/IndexIVF.h +33 -12
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
- data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
- data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
- data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
- data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
- data/vendor/faiss/faiss/IndexPQ.h +3 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
- data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
- data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
- data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
- data/vendor/faiss/faiss/IndexRefine.h +4 -4
- data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
- data/vendor/faiss/faiss/IndexShards.cpp +10 -9
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
- data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
- data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
- data/vendor/faiss/faiss/MetaIndexes.h +1 -1
- data/vendor/faiss/faiss/MetricType.h +14 -7
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
- data/vendor/faiss/faiss/VectorTransform.h +16 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +48 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
- data/vendor/faiss/faiss/factory_tools.cpp +5 -0
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
- data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
- data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
- data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
- data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
- data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
- data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
- data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
- data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
- data/vendor/faiss/faiss/impl/HNSW.h +13 -34
- data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
- data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
- data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
- data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
- data/vendor/faiss/faiss/impl/NSG.h +4 -4
- data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
- data/vendor/faiss/faiss/impl/Panorama.h +258 -87
- data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
- data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
- data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
- data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
- data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
- data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
- data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
- data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
- data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
- data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
- data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
- data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
- data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
- data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
- data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +33 -16
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
- data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
- data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
- data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
- data/vendor/faiss/faiss/impl/svs_io.h +8 -2
- data/vendor/faiss/faiss/index_factory.cpp +86 -18
- data/vendor/faiss/faiss/index_io.h +24 -0
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
- data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
- data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
- data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
- data/vendor/faiss/faiss/utils/distances.cpp +390 -560
- data/vendor/faiss/faiss/utils/distances.h +20 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
- data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
- data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
- data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
- data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
- data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
- data/vendor/faiss/faiss/utils/hamming.h +92 -2
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
- data/vendor/faiss/faiss/utils/partitioning.h +31 -0
- data/vendor/faiss/faiss/utils/popcount.h +29 -0
- data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
- data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
- data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
- data/vendor/faiss/faiss/utils/random.cpp +6 -6
- data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
- data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
- data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
- data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
- data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +5 -5
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +119 -34
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
- data/vendor/faiss/faiss/utils/simdlib.h +0 -42
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
- /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
|