faiss 0.5.3 → 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 +12 -0
- data/ext/faiss/ext.cpp +1 -1
- data/ext/faiss/extconf.rb +4 -4
- data/ext/faiss/index.cpp +63 -45
- data/ext/faiss/index_binary.cpp +37 -27
- data/ext/faiss/kmeans.cpp +9 -8
- data/ext/faiss/pca_matrix.cpp +9 -7
- data/ext/faiss/product_quantizer.cpp +13 -11
- data/ext/faiss/utils.cpp +4 -2
- data/ext/faiss/utils.h +4 -0
- data/lib/faiss/version.rb +1 -1
- data/lib/faiss.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +214 -82
- data/vendor/faiss/faiss/AutoTune.h +14 -1
- data/vendor/faiss/faiss/Clustering.cpp +97 -249
- data/vendor/faiss/faiss/Clustering.h +18 -0
- data/vendor/faiss/faiss/IVFlib.cpp +67 -44
- data/vendor/faiss/faiss/Index.cpp +25 -12
- data/vendor/faiss/faiss/Index.h +26 -4
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +6 -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 +92 -95
- 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 +120 -414
- data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
- data/vendor/faiss/faiss/IndexFastScan.h +35 -24
- data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
- data/vendor/faiss/faiss/IndexFlat.h +32 -14
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
- data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
- data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
- data/vendor/faiss/faiss/IndexHNSW.h +30 -14
- data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
- data/vendor/faiss/faiss/IndexIVF.h +47 -16
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
- data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
- data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
- data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
- data/vendor/faiss/faiss/IndexNSG.h +0 -2
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
- data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
- 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 +31 -43
- data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
- 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 +13 -13
- 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 +29 -6
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
- data/vendor/faiss/faiss/VectorTransform.h +39 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +55 -51
- 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/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
- 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 +64 -34
- 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 -28
- 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 +367 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
- data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
- data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
- data/vendor/faiss/faiss/impl/HNSW.h +21 -40
- 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 +114 -102
- data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
- data/vendor/faiss/faiss/impl/NSG.h +20 -10
- data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
- data/vendor/faiss/faiss/impl/Panorama.h +265 -78
- 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 +62 -37
- 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 +99 -80
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
- data/vendor/faiss/faiss/impl/VisitedTable.h +76 -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 +163 -0
- 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} +176 -4
- 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 -348
- 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} +290 -142
- 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 +1950 -505
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
- data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
- 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 +81 -40
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
- 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/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
- 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 +256 -0
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
- 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 +275 -217
- 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 +115 -28
- data/vendor/faiss/faiss/index_io.h +53 -3
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
- 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 +14 -14
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
- 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 +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
- data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
- data/vendor/faiss/faiss/utils/Heap.h +21 -0
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
- 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 +507 -559
- data/vendor/faiss/faiss/utils/distances.h +118 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
- 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 +72 -3681
- data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
- data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
- 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 +251 -0
- 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 +124 -343
- 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 +154 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
- 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 +392 -0
- 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 +334 -0
- data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +21 -14
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +156 -42
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
- 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 -228
- 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 -450
- 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 -296
- /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
|
@@ -5,64 +5,34 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
#ifdef __ARM_FEATURE_SVE
|
|
8
|
+
#ifdef COMPILE_SIMD_ARM_SVE
|
|
11
9
|
|
|
12
10
|
#include <arm_sve.h>
|
|
13
11
|
|
|
14
|
-
#include <
|
|
15
|
-
#include <type_traits>
|
|
16
|
-
|
|
17
|
-
#include <faiss/impl/ProductQuantizer.h>
|
|
18
|
-
#include <faiss/impl/code_distance/code_distance-generic.h>
|
|
19
|
-
|
|
20
|
-
namespace faiss {
|
|
12
|
+
#include <faiss/impl/pq_code_distance/pq_code_distance-inl.h>
|
|
21
13
|
|
|
22
|
-
|
|
23
|
-
std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
|
|
24
|
-
// the product quantizer
|
|
25
|
-
const size_t M,
|
|
26
|
-
// number of bits per quantization index
|
|
27
|
-
const size_t nbits,
|
|
28
|
-
// precomputed distances, layout (M, ksub)
|
|
29
|
-
const float* sim_table,
|
|
30
|
-
const uint8_t* code) {
|
|
31
|
-
// default implementation
|
|
32
|
-
return distance_single_code_generic<PQDecoderT>(M, nbits, sim_table, code);
|
|
33
|
-
}
|
|
14
|
+
namespace {
|
|
34
15
|
|
|
35
|
-
|
|
16
|
+
inline void distance_codes_kernel(
|
|
36
17
|
svbool_t pg,
|
|
37
18
|
svuint32_t idx1,
|
|
38
19
|
svuint32_t offsets_0,
|
|
39
20
|
const float* tab,
|
|
40
21
|
svfloat32_t& partialSum) {
|
|
41
|
-
// add offset
|
|
42
22
|
const auto indices_to_read_from = svadd_u32_x(pg, idx1, offsets_0);
|
|
43
|
-
|
|
44
|
-
// gather values, similar to some operations of tab[index]
|
|
45
23
|
const auto collected =
|
|
46
24
|
svld1_gather_u32index_f32(pg, tab, indices_to_read_from);
|
|
47
|
-
|
|
48
|
-
// collect partial sum
|
|
49
25
|
partialSum = svadd_f32_m(pg, partialSum, collected);
|
|
50
26
|
}
|
|
51
27
|
|
|
52
|
-
|
|
53
|
-
// the product quantizer
|
|
28
|
+
inline float distance_single_code_sve_for_small_m(
|
|
54
29
|
const size_t M,
|
|
55
|
-
// precomputed distances, layout (M, ksub)
|
|
56
30
|
const float* sim_table,
|
|
57
|
-
// codes
|
|
58
31
|
const uint8_t* __restrict code) {
|
|
59
32
|
constexpr size_t nbits = 8u;
|
|
60
|
-
|
|
61
33
|
const size_t ksub = 1 << nbits;
|
|
62
34
|
|
|
63
35
|
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
|
64
|
-
|
|
65
|
-
// loop
|
|
66
36
|
const auto pg = svwhilelt_b32_u64(0, M);
|
|
67
37
|
|
|
68
38
|
auto mm1 = svld1ub_u32(pg, code);
|
|
@@ -71,44 +41,74 @@ static inline float distance_single_code_sve_for_small_m(
|
|
|
71
41
|
return svaddv_f32(pg, collected0);
|
|
72
42
|
}
|
|
73
43
|
|
|
74
|
-
|
|
75
|
-
std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
|
|
76
|
-
// the product quantizer
|
|
44
|
+
inline void distance_four_codes_sve_for_small_m(
|
|
77
45
|
const size_t M,
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
46
|
+
const float* sim_table,
|
|
47
|
+
const uint8_t* __restrict code0,
|
|
48
|
+
const uint8_t* __restrict code1,
|
|
49
|
+
const uint8_t* __restrict code2,
|
|
50
|
+
const uint8_t* __restrict code3,
|
|
51
|
+
float& result0,
|
|
52
|
+
float& result1,
|
|
53
|
+
float& result2,
|
|
54
|
+
float& result3) {
|
|
55
|
+
constexpr size_t nbits = 8u;
|
|
56
|
+
const size_t ksub = 1 << nbits;
|
|
57
|
+
|
|
58
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
|
59
|
+
const auto pg = svwhilelt_b32_u64(0, M);
|
|
60
|
+
|
|
61
|
+
auto mm10 = svld1ub_u32(pg, code0);
|
|
62
|
+
auto mm11 = svld1ub_u32(pg, code1);
|
|
63
|
+
auto mm12 = svld1ub_u32(pg, code2);
|
|
64
|
+
auto mm13 = svld1ub_u32(pg, code3);
|
|
65
|
+
mm10 = svadd_u32_x(pg, mm10, offsets_0);
|
|
66
|
+
mm11 = svadd_u32_x(pg, mm11, offsets_0);
|
|
67
|
+
mm12 = svadd_u32_x(pg, mm12, offsets_0);
|
|
68
|
+
mm13 = svadd_u32_x(pg, mm13, offsets_0);
|
|
69
|
+
const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm10);
|
|
70
|
+
const auto collected1 = svld1_gather_u32index_f32(pg, sim_table, mm11);
|
|
71
|
+
const auto collected2 = svld1_gather_u32index_f32(pg, sim_table, mm12);
|
|
72
|
+
const auto collected3 = svld1_gather_u32index_f32(pg, sim_table, mm13);
|
|
73
|
+
result0 = svaddv_f32(pg, collected0);
|
|
74
|
+
result1 = svaddv_f32(pg, collected1);
|
|
75
|
+
result2 = svaddv_f32(pg, collected2);
|
|
76
|
+
result3 = svaddv_f32(pg, collected3);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
} // namespace
|
|
80
|
+
|
|
81
|
+
namespace faiss {
|
|
82
|
+
namespace pq_code_distance {
|
|
83
|
+
|
|
84
|
+
// NOLINTNEXTLINE(facebook-hte-MisplacedTemplateSpecialization)
|
|
85
|
+
template <>
|
|
86
|
+
float pq_code_distance_8bit_single_impl<SIMDLevel::ARM_SVE>(
|
|
87
|
+
size_t M,
|
|
81
88
|
const float* sim_table,
|
|
82
89
|
const uint8_t* code) {
|
|
83
90
|
if (M <= svcntw())
|
|
84
91
|
return distance_single_code_sve_for_small_m(M, sim_table, code);
|
|
85
92
|
|
|
86
93
|
const float* tab = sim_table;
|
|
87
|
-
|
|
88
|
-
const size_t ksub = 1 << nbits;
|
|
94
|
+
constexpr size_t ksub = 1 << 8;
|
|
89
95
|
|
|
90
96
|
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
|
91
|
-
|
|
92
|
-
// accumulators of partial sums
|
|
93
97
|
auto partialSum = svdup_n_f32(0.f);
|
|
94
98
|
|
|
95
99
|
const auto lanes = svcntb();
|
|
96
100
|
const auto quad_lanes = lanes / 4;
|
|
97
101
|
|
|
98
|
-
// loop
|
|
99
102
|
for (std::size_t m = 0; m < M;) {
|
|
100
103
|
const auto pg = svwhilelt_b8_u64(m, M);
|
|
101
|
-
|
|
102
104
|
const auto mm1 = svld1_u8(pg, code + m);
|
|
103
105
|
{
|
|
104
106
|
const auto mm1lo = svunpklo_u16(mm1);
|
|
105
107
|
const auto pglo = svunpklo_b(pg);
|
|
106
108
|
|
|
107
109
|
{
|
|
108
|
-
// convert uint8 values to uint32 values
|
|
109
110
|
const auto idx1 = svunpklo_u32(mm1lo);
|
|
110
111
|
const auto pglolo = svunpklo_b(pglo);
|
|
111
|
-
|
|
112
112
|
distance_codes_kernel(pglolo, idx1, offsets_0, tab, partialSum);
|
|
113
113
|
tab += ksub * quad_lanes;
|
|
114
114
|
}
|
|
@@ -118,10 +118,8 @@ std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_
|
|
|
118
118
|
break;
|
|
119
119
|
|
|
120
120
|
{
|
|
121
|
-
// convert uint8 values to uint32 values
|
|
122
121
|
const auto idx1 = svunpkhi_u32(mm1lo);
|
|
123
122
|
const auto pglohi = svunpkhi_b(pglo);
|
|
124
|
-
|
|
125
123
|
distance_codes_kernel(pglohi, idx1, offsets_0, tab, partialSum);
|
|
126
124
|
tab += ksub * quad_lanes;
|
|
127
125
|
}
|
|
@@ -136,10 +134,8 @@ std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_
|
|
|
136
134
|
const auto pghi = svunpkhi_b(pg);
|
|
137
135
|
|
|
138
136
|
{
|
|
139
|
-
// convert uint8 values to uint32 values
|
|
140
137
|
const auto idx1 = svunpklo_u32(mm1hi);
|
|
141
138
|
const auto pghilo = svunpklo_b(pghi);
|
|
142
|
-
|
|
143
139
|
distance_codes_kernel(pghilo, idx1, offsets_0, tab, partialSum);
|
|
144
140
|
tab += ksub * quad_lanes;
|
|
145
141
|
}
|
|
@@ -149,10 +145,8 @@ std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_
|
|
|
149
145
|
break;
|
|
150
146
|
|
|
151
147
|
{
|
|
152
|
-
// convert uint8 values to uint32 values
|
|
153
148
|
const auto idx1 = svunpkhi_u32(mm1hi);
|
|
154
149
|
const auto pghihi = svunpkhi_b(pghi);
|
|
155
|
-
|
|
156
150
|
distance_codes_kernel(pghihi, idx1, offsets_0, tab, partialSum);
|
|
157
151
|
tab += ksub * quad_lanes;
|
|
158
152
|
}
|
|
@@ -164,97 +158,16 @@ std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_
|
|
|
164
158
|
return svaddv_f32(svptrue_b32(), partialSum);
|
|
165
159
|
}
|
|
166
160
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
// number of bits per quantization index
|
|
173
|
-
const size_t nbits,
|
|
174
|
-
// precomputed distances, layout (M, ksub)
|
|
161
|
+
// Combines 4 operations of pq_code_distance_8bit_single_impl().
|
|
162
|
+
// NOLINTNEXTLINE(facebook-hte-MisplacedTemplateSpecialization)
|
|
163
|
+
template <>
|
|
164
|
+
void pq_code_distance_8bit_four_impl<SIMDLevel::ARM_SVE>(
|
|
165
|
+
size_t M,
|
|
175
166
|
const float* sim_table,
|
|
176
|
-
// codes
|
|
177
167
|
const uint8_t* __restrict code0,
|
|
178
168
|
const uint8_t* __restrict code1,
|
|
179
169
|
const uint8_t* __restrict code2,
|
|
180
170
|
const uint8_t* __restrict code3,
|
|
181
|
-
// computed distances
|
|
182
|
-
float& result0,
|
|
183
|
-
float& result1,
|
|
184
|
-
float& result2,
|
|
185
|
-
float& result3) {
|
|
186
|
-
distance_four_codes_generic<PQDecoderT>(
|
|
187
|
-
M,
|
|
188
|
-
nbits,
|
|
189
|
-
sim_table,
|
|
190
|
-
code0,
|
|
191
|
-
code1,
|
|
192
|
-
code2,
|
|
193
|
-
code3,
|
|
194
|
-
result0,
|
|
195
|
-
result1,
|
|
196
|
-
result2,
|
|
197
|
-
result3);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
static inline void distance_four_codes_sve_for_small_m(
|
|
201
|
-
// the product quantizer
|
|
202
|
-
const size_t M,
|
|
203
|
-
// precomputed distances, layout (M, ksub)
|
|
204
|
-
const float* sim_table,
|
|
205
|
-
// codes
|
|
206
|
-
const uint8_t* __restrict code0,
|
|
207
|
-
const uint8_t* __restrict code1,
|
|
208
|
-
const uint8_t* __restrict code2,
|
|
209
|
-
const uint8_t* __restrict code3,
|
|
210
|
-
// computed distances
|
|
211
|
-
float& result0,
|
|
212
|
-
float& result1,
|
|
213
|
-
float& result2,
|
|
214
|
-
float& result3) {
|
|
215
|
-
constexpr size_t nbits = 8u;
|
|
216
|
-
|
|
217
|
-
const size_t ksub = 1 << nbits;
|
|
218
|
-
|
|
219
|
-
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
|
220
|
-
|
|
221
|
-
// loop
|
|
222
|
-
const auto pg = svwhilelt_b32_u64(0, M);
|
|
223
|
-
|
|
224
|
-
auto mm10 = svld1ub_u32(pg, code0);
|
|
225
|
-
auto mm11 = svld1ub_u32(pg, code1);
|
|
226
|
-
auto mm12 = svld1ub_u32(pg, code2);
|
|
227
|
-
auto mm13 = svld1ub_u32(pg, code3);
|
|
228
|
-
mm10 = svadd_u32_x(pg, mm10, offsets_0);
|
|
229
|
-
mm11 = svadd_u32_x(pg, mm11, offsets_0);
|
|
230
|
-
mm12 = svadd_u32_x(pg, mm12, offsets_0);
|
|
231
|
-
mm13 = svadd_u32_x(pg, mm13, offsets_0);
|
|
232
|
-
const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm10);
|
|
233
|
-
const auto collected1 = svld1_gather_u32index_f32(pg, sim_table, mm11);
|
|
234
|
-
const auto collected2 = svld1_gather_u32index_f32(pg, sim_table, mm12);
|
|
235
|
-
const auto collected3 = svld1_gather_u32index_f32(pg, sim_table, mm13);
|
|
236
|
-
result0 = svaddv_f32(pg, collected0);
|
|
237
|
-
result1 = svaddv_f32(pg, collected1);
|
|
238
|
-
result2 = svaddv_f32(pg, collected2);
|
|
239
|
-
result3 = svaddv_f32(pg, collected3);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Combines 4 operations of distance_single_code()
|
|
243
|
-
template <typename PQDecoderT>
|
|
244
|
-
std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, void>
|
|
245
|
-
distance_four_codes_sve(
|
|
246
|
-
// the product quantizer
|
|
247
|
-
const size_t M,
|
|
248
|
-
// number of bits per quantization index
|
|
249
|
-
const size_t nbits,
|
|
250
|
-
// precomputed distances, layout (M, ksub)
|
|
251
|
-
const float* sim_table,
|
|
252
|
-
// codes
|
|
253
|
-
const uint8_t* __restrict code0,
|
|
254
|
-
const uint8_t* __restrict code1,
|
|
255
|
-
const uint8_t* __restrict code2,
|
|
256
|
-
const uint8_t* __restrict code3,
|
|
257
|
-
// computed distances
|
|
258
171
|
float& result0,
|
|
259
172
|
float& result1,
|
|
260
173
|
float& result2,
|
|
@@ -275,12 +188,10 @@ distance_four_codes_sve(
|
|
|
275
188
|
}
|
|
276
189
|
|
|
277
190
|
const float* tab = sim_table;
|
|
278
|
-
|
|
279
|
-
const size_t ksub = 1 << nbits;
|
|
191
|
+
constexpr size_t ksub = 1 << 8;
|
|
280
192
|
|
|
281
193
|
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
|
282
194
|
|
|
283
|
-
// accumulators of partial sums
|
|
284
195
|
auto partialSum0 = svdup_n_f32(0.f);
|
|
285
196
|
auto partialSum1 = svdup_n_f32(0.f);
|
|
286
197
|
auto partialSum2 = svdup_n_f32(0.f);
|
|
@@ -289,7 +200,6 @@ distance_four_codes_sve(
|
|
|
289
200
|
const auto lanes = svcntb();
|
|
290
201
|
const auto quad_lanes = lanes / 4;
|
|
291
202
|
|
|
292
|
-
// loop
|
|
293
203
|
for (std::size_t m = 0; m < M;) {
|
|
294
204
|
const auto pg = svwhilelt_b8_u64(m, M);
|
|
295
205
|
|
|
@@ -434,6 +344,7 @@ distance_four_codes_sve(
|
|
|
434
344
|
result3 = svaddv_f32(svptrue_b32(), partialSum3);
|
|
435
345
|
}
|
|
436
346
|
|
|
347
|
+
} // namespace pq_code_distance
|
|
437
348
|
} // namespace faiss
|
|
438
349
|
|
|
439
|
-
#endif
|
|
350
|
+
#endif // COMPILE_SIMD_ARM_SVE
|
|
@@ -0,0 +1,68 @@
|
|
|
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_RISCV_RVV
|
|
9
|
+
|
|
10
|
+
#include <faiss/impl/pq_code_distance/pq_code_distance-inl.h>
|
|
11
|
+
|
|
12
|
+
namespace faiss {
|
|
13
|
+
namespace pq_code_distance {
|
|
14
|
+
|
|
15
|
+
// RISCV_RVV: no RVV-optimized PQ code distance exists yet. Use scalar.
|
|
16
|
+
|
|
17
|
+
// NOLINTNEXTLINE(facebook-hte-MisplacedTemplateSpecialization)
|
|
18
|
+
template <>
|
|
19
|
+
float pq_code_distance_8bit_single_impl<SIMDLevel::RISCV_RVV>(
|
|
20
|
+
size_t M,
|
|
21
|
+
const float* sim_table,
|
|
22
|
+
const uint8_t* code) {
|
|
23
|
+
return PQCodeDistanceScalar<PQDecoder8>::distance_single_code(
|
|
24
|
+
M, 8, sim_table, code);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// NOLINTNEXTLINE(facebook-hte-MisplacedTemplateSpecialization)
|
|
28
|
+
template <>
|
|
29
|
+
void pq_code_distance_8bit_four_impl<SIMDLevel::RISCV_RVV>(
|
|
30
|
+
size_t M,
|
|
31
|
+
const float* sim_table,
|
|
32
|
+
const uint8_t* __restrict code0,
|
|
33
|
+
const uint8_t* __restrict code1,
|
|
34
|
+
const uint8_t* __restrict code2,
|
|
35
|
+
const uint8_t* __restrict code3,
|
|
36
|
+
float& result0,
|
|
37
|
+
float& result1,
|
|
38
|
+
float& result2,
|
|
39
|
+
float& result3) {
|
|
40
|
+
PQCodeDistanceScalar<PQDecoder8>::distance_four_codes(
|
|
41
|
+
M,
|
|
42
|
+
8,
|
|
43
|
+
sim_table,
|
|
44
|
+
code0,
|
|
45
|
+
code1,
|
|
46
|
+
code2,
|
|
47
|
+
code3,
|
|
48
|
+
result0,
|
|
49
|
+
result1,
|
|
50
|
+
result2,
|
|
51
|
+
result3);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
} // namespace pq_code_distance
|
|
55
|
+
} // namespace faiss
|
|
56
|
+
|
|
57
|
+
#define THE_SIMD_LEVEL SIMDLevel::RISCV_RVV
|
|
58
|
+
|
|
59
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
60
|
+
#include <faiss/utils/hamming_distance/hamming_computer-rvv.h>
|
|
61
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
62
|
+
#include <faiss/impl/pq_code_distance/PQDistanceComputer_impl.h>
|
|
63
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
64
|
+
#include <faiss/impl/pq_code_distance/IVFPQScanner_impl.h>
|
|
65
|
+
|
|
66
|
+
#undef THE_SIMD_LEVEL
|
|
67
|
+
|
|
68
|
+
#endif // COMPILE_SIMD_RISCV_RVV
|