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
|
@@ -261,6 +261,9 @@ void inner_product_to_L2sqr(
|
|
|
261
261
|
*/
|
|
262
262
|
void fvec_add(size_t d, const float* a, const float* b, float* c);
|
|
263
263
|
|
|
264
|
+
template <SIMDLevel>
|
|
265
|
+
void fvec_add(size_t d, const float* a, const float* b, float* c);
|
|
266
|
+
|
|
264
267
|
/** compute c := a + b for a, c vectors and b a scalar
|
|
265
268
|
*
|
|
266
269
|
* c and a can overlap
|
|
@@ -270,6 +273,9 @@ void fvec_add(size_t d, const float* a, const float* b, float* c);
|
|
|
270
273
|
*/
|
|
271
274
|
void fvec_add(size_t d, const float* a, float b, float* c);
|
|
272
275
|
|
|
276
|
+
template <SIMDLevel>
|
|
277
|
+
void fvec_add(size_t d, const float* a, float b, float* c);
|
|
278
|
+
|
|
273
279
|
/** compute c := a - b for vectors
|
|
274
280
|
*
|
|
275
281
|
* c and a can overlap, c and b can overlap
|
|
@@ -280,6 +286,9 @@ void fvec_add(size_t d, const float* a, float b, float* c);
|
|
|
280
286
|
*/
|
|
281
287
|
void fvec_sub(size_t d, const float* a, const float* b, float* c);
|
|
282
288
|
|
|
289
|
+
template <SIMDLevel>
|
|
290
|
+
void fvec_sub(size_t d, const float* a, const float* b, float* c);
|
|
291
|
+
|
|
283
292
|
/***************************************************************************
|
|
284
293
|
* Compute a subset of distances
|
|
285
294
|
***************************************************************************/
|
|
@@ -360,7 +369,7 @@ void pairwise_indexed_inner_product(
|
|
|
360
369
|
* KNN functions
|
|
361
370
|
***************************************************************************/
|
|
362
371
|
|
|
363
|
-
// threshold on nx above which we switch to BLAS to compute distances
|
|
372
|
+
// threshold on nx * d above which we switch to BLAS to compute distances
|
|
364
373
|
FAISS_API extern int distance_compute_blas_threshold;
|
|
365
374
|
|
|
366
375
|
// block sizes for BLAS distance computations
|
|
@@ -542,6 +551,16 @@ void compute_PQ_dis_tables_dsub2(
|
|
|
542
551
|
bool is_inner_product,
|
|
543
552
|
float* dis_tables);
|
|
544
553
|
|
|
554
|
+
template <SIMDLevel>
|
|
555
|
+
void compute_PQ_dis_tables_dsub2(
|
|
556
|
+
size_t d,
|
|
557
|
+
size_t ksub,
|
|
558
|
+
const float* centroids,
|
|
559
|
+
size_t nx,
|
|
560
|
+
const float* x,
|
|
561
|
+
bool is_inner_product,
|
|
562
|
+
float* dis_tables);
|
|
563
|
+
|
|
545
564
|
/***************************************************************************
|
|
546
565
|
* Templatized versions of distance functions
|
|
547
566
|
***************************************************************************/
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* This is a PRIVATE header. Do not include in public APIs or user code.
|
|
15
15
|
*
|
|
16
|
-
* These wrappers call
|
|
16
|
+
* These wrappers call with_simd_level to route to the correct SIMD
|
|
17
17
|
* implementation. They are plain inline functions with a _dispatch suffix
|
|
18
18
|
* (e.g. fvec_L2sqr_dispatch). Internal callers that want inlining include
|
|
19
19
|
* this header and call the _dispatch variants directly.
|
|
@@ -24,30 +24,36 @@
|
|
|
24
24
|
|
|
25
25
|
#include <faiss/impl/simd_dispatch.h>
|
|
26
26
|
#include <faiss/utils/distances.h>
|
|
27
|
+
#include <faiss/utils/extra_distances.h>
|
|
27
28
|
|
|
28
29
|
namespace faiss {
|
|
29
30
|
|
|
30
31
|
inline float fvec_L1_dispatch(const float* x, const float* y, size_t d) {
|
|
31
|
-
|
|
32
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
33
|
+
[&]<SIMDLevel SL>() { return fvec_L1<SL>(x, y, d); });
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
inline float fvec_Linf_dispatch(const float* x, const float* y, size_t d) {
|
|
35
|
-
|
|
37
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
38
|
+
[&]<SIMDLevel SL>() { return fvec_Linf<SL>(x, y, d); });
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
inline float fvec_norm_L2sqr_dispatch(const float* x, size_t d) {
|
|
39
|
-
|
|
42
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
43
|
+
[&]<SIMDLevel SL>() { return fvec_norm_L2sqr<SL>(x, d); });
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
inline float fvec_L2sqr_dispatch(const float* x, const float* y, size_t d) {
|
|
43
|
-
|
|
47
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
48
|
+
[&]<SIMDLevel SL>() { return fvec_L2sqr<SL>(x, y, d); });
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
inline float fvec_inner_product_dispatch(
|
|
47
52
|
const float* x,
|
|
48
53
|
const float* y,
|
|
49
54
|
size_t d) {
|
|
50
|
-
|
|
55
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
56
|
+
[&]<SIMDLevel SL>() { return fvec_inner_product<SL>(x, y, d); });
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
inline void fvec_inner_product_batch_4_dispatch(
|
|
@@ -61,18 +67,10 @@ inline void fvec_inner_product_batch_4_dispatch(
|
|
|
61
67
|
float& dis1,
|
|
62
68
|
float& dis2,
|
|
63
69
|
float& dis3) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
y1,
|
|
69
|
-
y2,
|
|
70
|
-
y3,
|
|
71
|
-
d,
|
|
72
|
-
dis0,
|
|
73
|
-
dis1,
|
|
74
|
-
dis2,
|
|
75
|
-
dis3);
|
|
70
|
+
with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
|
|
71
|
+
fvec_inner_product_batch_4<SL>(
|
|
72
|
+
x, y0, y1, y2, y3, d, dis0, dis1, dis2, dis3);
|
|
73
|
+
});
|
|
76
74
|
}
|
|
77
75
|
|
|
78
76
|
inline void fvec_L2sqr_batch_4_dispatch(
|
|
@@ -86,8 +84,9 @@ inline void fvec_L2sqr_batch_4_dispatch(
|
|
|
86
84
|
float& dis1,
|
|
87
85
|
float& dis2,
|
|
88
86
|
float& dis3) {
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
|
|
88
|
+
fvec_L2sqr_batch_4<SL>(x, y0, y1, y2, y3, d, dis0, dis1, dis2, dis3);
|
|
89
|
+
});
|
|
91
90
|
}
|
|
92
91
|
|
|
93
92
|
inline void fvec_L2sqr_ny_transposed_dispatch(
|
|
@@ -98,8 +97,9 @@ inline void fvec_L2sqr_ny_transposed_dispatch(
|
|
|
98
97
|
size_t d,
|
|
99
98
|
size_t d_offset,
|
|
100
99
|
size_t ny) {
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
|
|
101
|
+
fvec_L2sqr_ny_transposed<SL>(dis, x, y, y_sqlen, d, d_offset, ny);
|
|
102
|
+
});
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
inline void fvec_inner_products_ny_dispatch(
|
|
@@ -108,7 +108,9 @@ inline void fvec_inner_products_ny_dispatch(
|
|
|
108
108
|
const float* y,
|
|
109
109
|
size_t d,
|
|
110
110
|
size_t ny) {
|
|
111
|
-
|
|
111
|
+
with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>([&]<SIMDLevel SL>() {
|
|
112
|
+
fvec_inner_products_ny<SL>(ip, x, y, d, ny);
|
|
113
|
+
});
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
inline void fvec_L2sqr_ny_dispatch(
|
|
@@ -117,7 +119,8 @@ inline void fvec_L2sqr_ny_dispatch(
|
|
|
117
119
|
const float* y,
|
|
118
120
|
size_t d,
|
|
119
121
|
size_t ny) {
|
|
120
|
-
|
|
122
|
+
with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
123
|
+
[&]<SIMDLevel SL>() { fvec_L2sqr_ny<SL>(dis, x, y, d, ny); });
|
|
121
124
|
}
|
|
122
125
|
|
|
123
126
|
inline size_t fvec_L2sqr_ny_nearest_dispatch(
|
|
@@ -126,8 +129,11 @@ inline size_t fvec_L2sqr_ny_nearest_dispatch(
|
|
|
126
129
|
const float* y,
|
|
127
130
|
size_t d,
|
|
128
131
|
size_t ny) {
|
|
129
|
-
|
|
130
|
-
|
|
132
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
133
|
+
[&]<SIMDLevel SL>() {
|
|
134
|
+
return fvec_L2sqr_ny_nearest<SL>(
|
|
135
|
+
distances_tmp_buffer, x, y, d, ny);
|
|
136
|
+
});
|
|
131
137
|
}
|
|
132
138
|
|
|
133
139
|
inline size_t fvec_L2sqr_ny_nearest_y_transposed_dispatch(
|
|
@@ -138,15 +144,11 @@ inline size_t fvec_L2sqr_ny_nearest_y_transposed_dispatch(
|
|
|
138
144
|
size_t d,
|
|
139
145
|
size_t d_offset,
|
|
140
146
|
size_t ny) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
y_sqlen,
|
|
147
|
-
d,
|
|
148
|
-
d_offset,
|
|
149
|
-
ny);
|
|
147
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
148
|
+
[&]<SIMDLevel SL>() {
|
|
149
|
+
return fvec_L2sqr_ny_nearest_y_transposed<SL>(
|
|
150
|
+
distances_tmp_buffer, x, y, y_sqlen, d, d_offset, ny);
|
|
151
|
+
});
|
|
150
152
|
}
|
|
151
153
|
|
|
152
154
|
inline void fvec_madd_dispatch(
|
|
@@ -155,7 +157,8 @@ inline void fvec_madd_dispatch(
|
|
|
155
157
|
float bf,
|
|
156
158
|
const float* b,
|
|
157
159
|
float* c) {
|
|
158
|
-
|
|
160
|
+
with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
161
|
+
[&]<SIMDLevel SL>() { fvec_madd<SL>(n, a, bf, b, c); });
|
|
159
162
|
}
|
|
160
163
|
|
|
161
164
|
inline int fvec_madd_and_argmin_dispatch(
|
|
@@ -164,7 +167,84 @@ inline int fvec_madd_and_argmin_dispatch(
|
|
|
164
167
|
float bf,
|
|
165
168
|
const float* b,
|
|
166
169
|
float* c) {
|
|
167
|
-
|
|
170
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A1>(
|
|
171
|
+
[&]<SIMDLevel SL>() {
|
|
172
|
+
return fvec_madd_and_argmin<SL>(n, a, bf, b, c);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
inline void fvec_sub_dispatch(
|
|
177
|
+
size_t d,
|
|
178
|
+
const float* a,
|
|
179
|
+
const float* b,
|
|
180
|
+
float* c) {
|
|
181
|
+
with_simd_level_256bit(
|
|
182
|
+
[&]<SIMDLevel level>() { fvec_sub<level>(d, a, b, c); });
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
inline void fvec_add_dispatch(
|
|
186
|
+
size_t d,
|
|
187
|
+
const float* a,
|
|
188
|
+
const float* b,
|
|
189
|
+
float* c) {
|
|
190
|
+
with_simd_level_256bit(
|
|
191
|
+
[&]<SIMDLevel level>() { fvec_add<level>(d, a, b, c); });
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
inline void fvec_add_scalar_dispatch(
|
|
195
|
+
size_t d,
|
|
196
|
+
const float* a,
|
|
197
|
+
float b,
|
|
198
|
+
float* c) {
|
|
199
|
+
with_simd_level_256bit(
|
|
200
|
+
[&]<SIMDLevel level>() { fvec_add<level>(d, a, b, c); });
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
inline void compute_PQ_dis_tables_dsub2_dispatch(
|
|
204
|
+
size_t d,
|
|
205
|
+
size_t ksub,
|
|
206
|
+
const float* centroids,
|
|
207
|
+
size_t nx,
|
|
208
|
+
const float* x,
|
|
209
|
+
bool is_inner_product,
|
|
210
|
+
float* dis_tables) {
|
|
211
|
+
with_simd_level_256bit([&]<SIMDLevel level>() {
|
|
212
|
+
compute_PQ_dis_tables_dsub2<level>(
|
|
213
|
+
d, ksub, centroids, nx, x, is_inner_product, dis_tables);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/***************************************************************************
|
|
218
|
+
* Dispatching function that takes a lambda directly.
|
|
219
|
+
* The lambda should be templated on VectorDistance, eg.:
|
|
220
|
+
*
|
|
221
|
+
* auto result = with_VectorDistance(
|
|
222
|
+
* metric, metric_arg, [&]<class VD>(VD vd) {
|
|
223
|
+
* return vd(x, y);
|
|
224
|
+
* });
|
|
225
|
+
**************************************************************************/
|
|
226
|
+
|
|
227
|
+
template <typename LambdaType>
|
|
228
|
+
auto with_VectorDistance(
|
|
229
|
+
size_t d,
|
|
230
|
+
MetricType metric,
|
|
231
|
+
float metric_arg,
|
|
232
|
+
LambdaType&& action) {
|
|
233
|
+
auto dispatch_metric = [&]<MetricType mt>() {
|
|
234
|
+
auto call = [&]<SIMDLevel level>() {
|
|
235
|
+
VectorDistance<mt, level> vd = {d, metric_arg};
|
|
236
|
+
return action(vd);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
constexpr bool has_simd = mt == METRIC_INNER_PRODUCT ||
|
|
240
|
+
mt == METRIC_L2 || mt == METRIC_L1 || mt == METRIC_Linf;
|
|
241
|
+
if constexpr (!has_simd) {
|
|
242
|
+
return call.template operator()<SIMDLevel::NONE>();
|
|
243
|
+
} else {
|
|
244
|
+
return with_simd_level(call);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
return with_metric_type(metric, dispatch_metric);
|
|
168
248
|
}
|
|
169
249
|
|
|
170
250
|
} // namespace faiss
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
// -*- c++ -*-
|
|
9
9
|
|
|
10
|
-
#include <faiss/utils/distances_fused/
|
|
10
|
+
#include <faiss/utils/distances_fused/distances_fused.h>
|
|
11
11
|
|
|
12
|
-
#ifdef
|
|
12
|
+
#ifdef COMPILE_SIMD_AVX512
|
|
13
13
|
|
|
14
14
|
#include <immintrin.h>
|
|
15
15
|
|
|
@@ -78,7 +78,7 @@ void kernel(
|
|
|
78
78
|
const float* const __restrict xd_0 = x + i * DIM;
|
|
79
79
|
|
|
80
80
|
// prefetch the next point
|
|
81
|
-
_mm_prefetch(xd_0 + DIM * sizeof(float), _MM_HINT_NTA);
|
|
81
|
+
_mm_prefetch((char*)(xd_0 + DIM * sizeof(float)), _MM_HINT_NTA);
|
|
82
82
|
|
|
83
83
|
// load a single point from x
|
|
84
84
|
// load -2 * value
|
|
@@ -262,10 +262,10 @@ void exhaustive_L2sqr_fused_cmax(
|
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
-
const
|
|
265
|
+
const idx_t nx_p = (nx / NX_POINTS_PER_LOOP) * NX_POINTS_PER_LOOP;
|
|
266
266
|
// the main loop.
|
|
267
267
|
#pragma omp parallel for schedule(dynamic)
|
|
268
|
-
for (
|
|
268
|
+
for (idx_t i = 0; i < nx_p; i += NX_POINTS_PER_LOOP) {
|
|
269
269
|
kernel<DIM, NX_POINTS_PER_LOOP, NY_POINTS_PER_LOOP>(
|
|
270
270
|
x, y, y_transposed.data(), ny, res, y_norms, i);
|
|
271
271
|
}
|
|
@@ -283,7 +283,8 @@ void exhaustive_L2sqr_fused_cmax(
|
|
|
283
283
|
|
|
284
284
|
} // namespace
|
|
285
285
|
|
|
286
|
-
|
|
286
|
+
template <>
|
|
287
|
+
bool exhaustive_L2sqr_fused_cmax<SIMDLevel::AVX512>(
|
|
287
288
|
const float* x,
|
|
288
289
|
const float* y,
|
|
289
290
|
size_t d,
|
|
@@ -343,4 +344,4 @@ bool exhaustive_L2sqr_fused_cmax_AVX512(
|
|
|
343
344
|
|
|
344
345
|
} // namespace faiss
|
|
345
346
|
|
|
346
|
-
#endif
|
|
347
|
+
#endif // COMPILE_SIMD_AVX512
|
|
@@ -7,13 +7,37 @@
|
|
|
7
7
|
|
|
8
8
|
#include <faiss/utils/distances_fused/distances_fused.h>
|
|
9
9
|
|
|
10
|
-
#include <faiss/impl/
|
|
11
|
-
|
|
12
|
-
#include <faiss/utils/distances_fused/avx512.h> // NOLINT
|
|
13
|
-
#include <faiss/utils/distances_fused/simdlib_based.h>
|
|
10
|
+
#include <faiss/impl/simd_dispatch.h>
|
|
14
11
|
|
|
15
12
|
namespace faiss {
|
|
16
13
|
|
|
14
|
+
// Scalar fallback: no fused kernel available.
|
|
15
|
+
template <>
|
|
16
|
+
bool exhaustive_L2sqr_fused_cmax<SIMDLevel::NONE>(
|
|
17
|
+
const float*,
|
|
18
|
+
const float*,
|
|
19
|
+
size_t,
|
|
20
|
+
size_t,
|
|
21
|
+
size_t,
|
|
22
|
+
Top1BlockResultHandler<CMax<float, int64_t>>&,
|
|
23
|
+
const float*) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
#ifdef COMPILE_SIMD_RISCV_RVV
|
|
28
|
+
template <>
|
|
29
|
+
bool exhaustive_L2sqr_fused_cmax<SIMDLevel::RISCV_RVV>(
|
|
30
|
+
const float*,
|
|
31
|
+
const float*,
|
|
32
|
+
size_t,
|
|
33
|
+
size_t,
|
|
34
|
+
size_t,
|
|
35
|
+
Top1BlockResultHandler<CMax<float, int64_t>>&,
|
|
36
|
+
const float*) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
#endif // COMPILE_SIMD_RISCV_RVV
|
|
40
|
+
|
|
17
41
|
bool exhaustive_L2sqr_fused_cmax(
|
|
18
42
|
const float* x,
|
|
19
43
|
const float* y,
|
|
@@ -27,16 +51,11 @@ bool exhaustive_L2sqr_fused_cmax(
|
|
|
27
51
|
return true;
|
|
28
52
|
}
|
|
29
53
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return exhaustive_L2sqr_fused_cmax_simdlib(x, y, d, nx, ny, res, y_norms);
|
|
36
|
-
#else
|
|
37
|
-
// not supported, please use a general-purpose kernel
|
|
38
|
-
return false;
|
|
39
|
-
#endif
|
|
54
|
+
return with_selected_simd_levels<AVAILABLE_SIMD_LEVELS_A0>(
|
|
55
|
+
[&]<SIMDLevel SL>() {
|
|
56
|
+
return exhaustive_L2sqr_fused_cmax<SL>(
|
|
57
|
+
x, y, d, nx, ny, res, y_norms);
|
|
58
|
+
});
|
|
40
59
|
}
|
|
41
60
|
|
|
42
61
|
} // namespace faiss
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
#pragma once
|
|
22
22
|
|
|
23
23
|
#include <faiss/impl/ResultHandler.h>
|
|
24
|
-
|
|
25
24
|
#include <faiss/utils/Heap.h>
|
|
25
|
+
#include <faiss/utils/simd_levels.h>
|
|
26
26
|
|
|
27
27
|
namespace faiss {
|
|
28
28
|
|
|
@@ -37,4 +37,15 @@ bool exhaustive_L2sqr_fused_cmax(
|
|
|
37
37
|
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
|
38
38
|
const float* y_norms);
|
|
39
39
|
|
|
40
|
+
// Per-SIMD-level implementation (defined in per-SIMD TUs).
|
|
41
|
+
template <SIMDLevel>
|
|
42
|
+
bool exhaustive_L2sqr_fused_cmax(
|
|
43
|
+
const float* x,
|
|
44
|
+
const float* y,
|
|
45
|
+
size_t d,
|
|
46
|
+
size_t nx,
|
|
47
|
+
size_t ny,
|
|
48
|
+
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
|
49
|
+
const float* y_norms);
|
|
50
|
+
|
|
40
51
|
} // namespace faiss
|