faiss 0.3.2 → 0.3.4
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 +8 -0
- data/LICENSE.txt +1 -1
- data/ext/faiss/extconf.rb +1 -1
- data/ext/faiss/index.cpp +10 -14
- data/ext/faiss/numo.hpp +957 -833
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +2 -2
- data/vendor/faiss/faiss/AutoTune.h +2 -2
- data/vendor/faiss/faiss/Clustering.cpp +2 -2
- data/vendor/faiss/faiss/Clustering.h +2 -2
- data/vendor/faiss/faiss/IVFlib.cpp +2 -2
- data/vendor/faiss/faiss/IVFlib.h +2 -2
- data/vendor/faiss/faiss/Index.cpp +6 -2
- data/vendor/faiss/faiss/Index.h +10 -3
- data/vendor/faiss/faiss/Index2Layer.cpp +2 -2
- data/vendor/faiss/faiss/Index2Layer.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +7 -7
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +14 -16
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +2 -2
- data/vendor/faiss/faiss/IndexBinary.cpp +13 -2
- data/vendor/faiss/faiss/IndexBinary.h +8 -2
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryFlat.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +2 -2
- data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +2 -7
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryHash.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +2 -2
- data/vendor/faiss/faiss/IndexBinaryIVF.h +2 -2
- data/vendor/faiss/faiss/IndexFastScan.cpp +10 -14
- data/vendor/faiss/faiss/IndexFastScan.h +11 -2
- data/vendor/faiss/faiss/IndexFlat.cpp +2 -3
- data/vendor/faiss/faiss/IndexFlat.h +2 -2
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +11 -2
- data/vendor/faiss/faiss/IndexFlatCodes.h +5 -2
- data/vendor/faiss/faiss/IndexHNSW.cpp +13 -6
- data/vendor/faiss/faiss/IndexHNSW.h +2 -2
- data/vendor/faiss/faiss/IndexIDMap.cpp +19 -3
- data/vendor/faiss/faiss/IndexIDMap.h +5 -2
- data/vendor/faiss/faiss/IndexIVF.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVF.h +5 -4
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +6 -7
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -14
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +2 -4
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +71 -34
- data/vendor/faiss/faiss/IndexIVFFastScan.h +19 -2
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFFlat.h +2 -2
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVFPQ.h +2 -2
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +7 -33
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +2 -4
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFPQR.h +2 -2
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +2 -2
- data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
- data/vendor/faiss/faiss/IndexLSH.h +2 -2
- data/vendor/faiss/faiss/IndexLattice.cpp +2 -2
- data/vendor/faiss/faiss/IndexLattice.h +2 -2
- data/vendor/faiss/faiss/IndexNNDescent.cpp +2 -2
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +2 -5
- data/vendor/faiss/faiss/IndexNSG.h +2 -2
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +2 -2
- data/vendor/faiss/faiss/IndexNeuralNetCodec.h +2 -2
- data/vendor/faiss/faiss/IndexPQ.cpp +26 -26
- data/vendor/faiss/faiss/IndexPQ.h +2 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +2 -5
- data/vendor/faiss/faiss/IndexPQFastScan.h +2 -11
- data/vendor/faiss/faiss/IndexPreTransform.cpp +2 -2
- data/vendor/faiss/faiss/IndexPreTransform.h +2 -2
- data/vendor/faiss/faiss/IndexRefine.cpp +41 -4
- data/vendor/faiss/faiss/IndexRefine.h +9 -2
- data/vendor/faiss/faiss/IndexReplicas.cpp +2 -2
- data/vendor/faiss/faiss/IndexReplicas.h +2 -2
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +2 -2
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +2 -2
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +2 -3
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexShards.cpp +2 -2
- data/vendor/faiss/faiss/IndexShards.h +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.h +2 -2
- data/vendor/faiss/faiss/MatrixStats.cpp +2 -2
- data/vendor/faiss/faiss/MatrixStats.h +2 -2
- data/vendor/faiss/faiss/MetaIndexes.cpp +2 -3
- data/vendor/faiss/faiss/MetaIndexes.h +2 -2
- data/vendor/faiss/faiss/MetricType.h +2 -2
- data/vendor/faiss/faiss/VectorTransform.cpp +2 -2
- data/vendor/faiss/faiss/VectorTransform.h +2 -2
- data/vendor/faiss/faiss/clone_index.cpp +2 -2
- data/vendor/faiss/faiss/clone_index.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/factory_tools.cpp +44 -4
- data/vendor/faiss/faiss/cppcontrib/factory_tools.h +7 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +2 -5
- data/vendor/faiss/faiss/gpu/GpuAutoTune.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +13 -13
- data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +6 -6
- data/vendor/faiss/faiss/gpu/GpuDistance.h +11 -7
- data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndex.h +8 -7
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -3
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +3 -3
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +7 -2
- data/vendor/faiss/faiss/gpu/GpuResources.h +11 -4
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +51 -21
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +15 -5
- data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +2 -2
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +2 -2
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +2 -2
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +2 -2
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -3
- data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +54 -54
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +80 -78
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +51 -51
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +3 -3
- data/vendor/faiss/faiss/gpu/test/TestGpuResidualQuantizer.cpp +70 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +74 -4
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +2 -2
- data/vendor/faiss/faiss/gpu/utils/{RaftUtils.h → CuvsUtils.h} +12 -11
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +2 -2
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +2 -2
- data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/utils/Timer.cpp +2 -2
- data/vendor/faiss/faiss/gpu/utils/Timer.h +2 -2
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +79 -11
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +17 -5
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +2 -2
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +2 -2
- data/vendor/faiss/faiss/impl/CodePacker.cpp +2 -2
- data/vendor/faiss/faiss/impl/CodePacker.h +2 -2
- data/vendor/faiss/faiss/impl/DistanceComputer.h +2 -2
- data/vendor/faiss/faiss/impl/FaissAssert.h +2 -2
- data/vendor/faiss/faiss/impl/FaissException.cpp +2 -2
- data/vendor/faiss/faiss/impl/FaissException.h +2 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +24 -19
- data/vendor/faiss/faiss/impl/HNSW.h +12 -2
- data/vendor/faiss/faiss/impl/IDSelector.cpp +2 -2
- data/vendor/faiss/faiss/impl/IDSelector.h +2 -2
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/LookupTableScaler.h +2 -2
- data/vendor/faiss/faiss/impl/NNDescent.cpp +2 -2
- data/vendor/faiss/faiss/impl/NNDescent.h +2 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +27 -21
- data/vendor/faiss/faiss/impl/NSG.h +20 -8
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +2 -2
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +2 -2
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +2 -4
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +2 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +2 -36
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +3 -13
- data/vendor/faiss/faiss/impl/ResultHandler.h +2 -2
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
- data/vendor/faiss/faiss/impl/ThreadedIndex.h +2 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +2 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx512.h +2 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +2 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-sve.h +440 -0
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +55 -2
- data/vendor/faiss/faiss/impl/index_read.cpp +2 -5
- data/vendor/faiss/faiss/impl/index_read_utils.h +2 -2
- data/vendor/faiss/faiss/impl/index_write.cpp +2 -6
- data/vendor/faiss/faiss/impl/io.cpp +2 -2
- data/vendor/faiss/faiss/impl/io.h +2 -2
- data/vendor/faiss/faiss/impl/io_macros.h +2 -9
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +2 -3
- data/vendor/faiss/faiss/impl/kmeans1d.h +2 -2
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +2 -3
- data/vendor/faiss/faiss/impl/lattice_Zn.h +2 -2
- data/vendor/faiss/faiss/impl/platform_macros.h +12 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +2 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +20 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +2 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +2 -2
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +3 -3
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +2 -2
- data/vendor/faiss/faiss/impl/simd_result_handlers.h +18 -18
- data/vendor/faiss/faiss/index_factory.cpp +20 -21
- data/vendor/faiss/faiss/index_factory.h +2 -2
- data/vendor/faiss/faiss/index_io.h +2 -2
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +2 -2
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +2 -2
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +2 -2
- data/vendor/faiss/faiss/invlists/DirectMap.h +2 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +2 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.h +2 -2
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +2 -2
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +2 -2
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +2 -3
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +2 -2
- data/vendor/faiss/faiss/python/python_callbacks.cpp +2 -2
- data/vendor/faiss/faiss/python/python_callbacks.h +2 -2
- data/vendor/faiss/faiss/utils/AlignedTable.h +5 -3
- data/vendor/faiss/faiss/utils/Heap.cpp +2 -2
- data/vendor/faiss/faiss/utils/Heap.h +2 -2
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +11 -7
- data/vendor/faiss/faiss/utils/NeuralNet.h +2 -2
- data/vendor/faiss/faiss/utils/WorkerThread.cpp +2 -2
- data/vendor/faiss/faiss/utils/WorkerThread.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/generic.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +2 -2
- data/vendor/faiss/faiss/utils/bf16.h +2 -2
- data/vendor/faiss/faiss/utils/distances.cpp +191 -2
- data/vendor/faiss/faiss/utils/distances.h +3 -3
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +2 -2
- data/vendor/faiss/faiss/utils/distances_simd.cpp +502 -3
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +2 -2
- data/vendor/faiss/faiss/utils/extra_distances.cpp +2 -3
- data/vendor/faiss/faiss/utils/extra_distances.h +2 -2
- data/vendor/faiss/faiss/utils/fp16-arm.h +2 -2
- data/vendor/faiss/faiss/utils/fp16-fp16c.h +2 -2
- data/vendor/faiss/faiss/utils/fp16-inl.h +2 -2
- data/vendor/faiss/faiss/utils/fp16.h +2 -2
- data/vendor/faiss/faiss/utils/hamming-inl.h +2 -2
- data/vendor/faiss/faiss/utils/hamming.cpp +2 -3
- data/vendor/faiss/faiss/utils/hamming.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +490 -0
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +5 -2
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +5 -5
- data/vendor/faiss/faiss/utils/ordered_key_value.h +2 -2
- data/vendor/faiss/faiss/utils/partitioning.cpp +2 -2
- data/vendor/faiss/faiss/utils/partitioning.h +2 -2
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.h +2 -2
- data/vendor/faiss/faiss/utils/random.cpp +2 -2
- data/vendor/faiss/faiss/utils/random.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_neon.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_ppc64.h +2 -2
- data/vendor/faiss/faiss/utils/sorting.cpp +2 -2
- data/vendor/faiss/faiss/utils/sorting.h +2 -2
- data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/utils/transpose/transpose-avx512-inl.h +2 -2
- data/vendor/faiss/faiss/utils/utils.cpp +7 -7
- data/vendor/faiss/faiss/utils/utils.h +4 -3
- metadata +9 -10
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
* Copyright (c)
|
1
|
+
/*
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
3
3
|
*
|
4
4
|
* This source code is licensed under the MIT license found in the
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
@@ -11,7 +11,6 @@
|
|
11
11
|
#include <cstdio>
|
12
12
|
#include <cstring>
|
13
13
|
#include <memory>
|
14
|
-
#include <random>
|
15
14
|
|
16
15
|
#include <algorithm>
|
17
16
|
|
@@ -20,7 +19,6 @@
|
|
20
19
|
#include <faiss/impl/FaissAssert.h>
|
21
20
|
#include <faiss/utils/distances.h>
|
22
21
|
#include <faiss/utils/hamming.h>
|
23
|
-
#include <faiss/utils/utils.h>
|
24
22
|
|
25
23
|
extern "C" {
|
26
24
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
* Copyright (c)
|
1
|
+
/*
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
3
3
|
*
|
4
4
|
* This source code is licensed under the MIT license found in the
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
@@ -492,40 +492,6 @@ void ResidualQuantizer::refine_beam(
|
|
492
492
|
* Functions using the dot products between codebook entries
|
493
493
|
*******************************************************************/
|
494
494
|
|
495
|
-
void ResidualQuantizer::compute_codebook_tables() {
|
496
|
-
cent_norms.resize(total_codebook_size);
|
497
|
-
fvec_norms_L2sqr(
|
498
|
-
cent_norms.data(), codebooks.data(), d, total_codebook_size);
|
499
|
-
size_t cross_table_size = 0;
|
500
|
-
for (int m = 0; m < M; m++) {
|
501
|
-
size_t K = (size_t)1 << nbits[m];
|
502
|
-
cross_table_size += K * codebook_offsets[m];
|
503
|
-
}
|
504
|
-
codebook_cross_products.resize(cross_table_size);
|
505
|
-
size_t ofs = 0;
|
506
|
-
for (int m = 1; m < M; m++) {
|
507
|
-
FINTEGER ki = (size_t)1 << nbits[m];
|
508
|
-
FINTEGER kk = codebook_offsets[m];
|
509
|
-
FINTEGER di = d;
|
510
|
-
float zero = 0, one = 1;
|
511
|
-
assert(ofs + ki * kk <= cross_table_size);
|
512
|
-
sgemm_("Transposed",
|
513
|
-
"Not transposed",
|
514
|
-
&ki,
|
515
|
-
&kk,
|
516
|
-
&di,
|
517
|
-
&one,
|
518
|
-
codebooks.data() + d * kk,
|
519
|
-
&di,
|
520
|
-
codebooks.data(),
|
521
|
-
&di,
|
522
|
-
&zero,
|
523
|
-
codebook_cross_products.data() + ofs,
|
524
|
-
&ki);
|
525
|
-
ofs += ki * kk;
|
526
|
-
}
|
527
|
-
}
|
528
|
-
|
529
495
|
void ResidualQuantizer::refine_beam_LUT(
|
530
496
|
size_t n,
|
531
497
|
const float* query_norms, // size n
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
* Copyright (c)
|
1
|
+
/*
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
3
3
|
*
|
4
4
|
* This source code is licensed under the MIT license found in the
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
@@ -112,7 +112,7 @@ struct ResidualQuantizer : AdditiveQuantizer {
|
|
112
112
|
|
113
113
|
/** lower-level encode function
|
114
114
|
*
|
115
|
-
* @param n number of vectors to
|
115
|
+
* @param n number of vectors to handle
|
116
116
|
* @param residuals vectors to encode, size (n, beam_size, d)
|
117
117
|
* @param beam_size input beam size
|
118
118
|
* @param new_beam_size output beam size (should be <= K * beam_size)
|
@@ -143,16 +143,6 @@ struct ResidualQuantizer : AdditiveQuantizer {
|
|
143
143
|
* @param beam_size if != -1, override the beam size
|
144
144
|
*/
|
145
145
|
size_t memory_per_point(int beam_size = -1) const;
|
146
|
-
|
147
|
-
/** Cross products used in codebook tables used for beam_LUT = 1
|
148
|
-
*/
|
149
|
-
void compute_codebook_tables();
|
150
|
-
|
151
|
-
/// dot products of all codebook entries with the previous codebooks
|
152
|
-
/// size sum(codebook_offsets[m] * 2^nbits[m], m=0..M-1)
|
153
|
-
std::vector<float> codebook_cross_products;
|
154
|
-
/// norms of all codebook entries (size total_codebook_size)
|
155
|
-
std::vector<float> cent_norms;
|
156
146
|
};
|
157
147
|
|
158
148
|
} // namespace faiss
|
@@ -0,0 +1,440 @@
|
|
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
|
+
#ifdef __ARM_FEATURE_SVE
|
11
|
+
|
12
|
+
#include <arm_sve.h>
|
13
|
+
|
14
|
+
#include <tuple>
|
15
|
+
#include <type_traits>
|
16
|
+
|
17
|
+
#include <faiss/impl/code_distance/code_distance-generic.h>
|
18
|
+
|
19
|
+
namespace faiss {
|
20
|
+
|
21
|
+
template <typename PQDecoderT>
|
22
|
+
std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
|
23
|
+
// the product quantizer
|
24
|
+
const size_t M,
|
25
|
+
// number of bits per quantization index
|
26
|
+
const size_t nbits,
|
27
|
+
// precomputed distances, layout (M, ksub)
|
28
|
+
const float* sim_table,
|
29
|
+
const uint8_t* code) {
|
30
|
+
// default implementation
|
31
|
+
return distance_single_code_generic<PQDecoderT>(M, nbits, sim_table, code);
|
32
|
+
}
|
33
|
+
|
34
|
+
static inline void distance_codes_kernel(
|
35
|
+
svbool_t pg,
|
36
|
+
svuint32_t idx1,
|
37
|
+
svuint32_t offsets_0,
|
38
|
+
const float* tab,
|
39
|
+
svfloat32_t& partialSum) {
|
40
|
+
// add offset
|
41
|
+
const auto indices_to_read_from = svadd_u32_x(pg, idx1, offsets_0);
|
42
|
+
|
43
|
+
// gather values, similar to some operations of tab[index]
|
44
|
+
const auto collected =
|
45
|
+
svld1_gather_u32index_f32(pg, tab, indices_to_read_from);
|
46
|
+
|
47
|
+
// collect partial sum
|
48
|
+
partialSum = svadd_f32_m(pg, partialSum, collected);
|
49
|
+
}
|
50
|
+
|
51
|
+
static float distance_single_code_sve_for_small_m(
|
52
|
+
// the product quantizer
|
53
|
+
const size_t M,
|
54
|
+
// precomputed distances, layout (M, ksub)
|
55
|
+
const float* sim_table,
|
56
|
+
// codes
|
57
|
+
const uint8_t* __restrict code) {
|
58
|
+
constexpr size_t nbits = 8u;
|
59
|
+
|
60
|
+
const size_t ksub = 1 << nbits;
|
61
|
+
|
62
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
63
|
+
|
64
|
+
// loop
|
65
|
+
const auto pg = svwhilelt_b32_u64(0, M);
|
66
|
+
|
67
|
+
auto mm1 = svld1ub_u32(pg, code);
|
68
|
+
mm1 = svadd_u32_x(pg, mm1, offsets_0);
|
69
|
+
const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm1);
|
70
|
+
return svaddv_f32(pg, collected0);
|
71
|
+
}
|
72
|
+
|
73
|
+
template <typename PQDecoderT>
|
74
|
+
std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
|
75
|
+
// the product quantizer
|
76
|
+
const size_t M,
|
77
|
+
// number of bits per quantization index
|
78
|
+
const size_t nbits,
|
79
|
+
// precomputed distances, layout (M, ksub)
|
80
|
+
const float* sim_table,
|
81
|
+
const uint8_t* code) {
|
82
|
+
if (M <= svcntw())
|
83
|
+
return distance_single_code_sve_for_small_m(M, sim_table, code);
|
84
|
+
|
85
|
+
const float* tab = sim_table;
|
86
|
+
|
87
|
+
const size_t ksub = 1 << nbits;
|
88
|
+
|
89
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
90
|
+
|
91
|
+
// accumulators of partial sums
|
92
|
+
auto partialSum = svdup_n_f32(0.f);
|
93
|
+
|
94
|
+
const auto lanes = svcntb();
|
95
|
+
const auto quad_lanes = lanes / 4;
|
96
|
+
|
97
|
+
// loop
|
98
|
+
for (std::size_t m = 0; m < M;) {
|
99
|
+
const auto pg = svwhilelt_b8_u64(m, M);
|
100
|
+
|
101
|
+
const auto mm1 = svld1_u8(pg, code + m);
|
102
|
+
{
|
103
|
+
const auto mm1lo = svunpklo_u16(mm1);
|
104
|
+
const auto pglo = svunpklo_b(pg);
|
105
|
+
|
106
|
+
{
|
107
|
+
// convert uint8 values to uint32 values
|
108
|
+
const auto idx1 = svunpklo_u32(mm1lo);
|
109
|
+
const auto pglolo = svunpklo_b(pglo);
|
110
|
+
|
111
|
+
distance_codes_kernel(pglolo, idx1, offsets_0, tab, partialSum);
|
112
|
+
tab += ksub * quad_lanes;
|
113
|
+
}
|
114
|
+
|
115
|
+
m += quad_lanes;
|
116
|
+
if (m >= M)
|
117
|
+
break;
|
118
|
+
|
119
|
+
{
|
120
|
+
// convert uint8 values to uint32 values
|
121
|
+
const auto idx1 = svunpkhi_u32(mm1lo);
|
122
|
+
const auto pglohi = svunpkhi_b(pglo);
|
123
|
+
|
124
|
+
distance_codes_kernel(pglohi, idx1, offsets_0, tab, partialSum);
|
125
|
+
tab += ksub * quad_lanes;
|
126
|
+
}
|
127
|
+
|
128
|
+
m += quad_lanes;
|
129
|
+
if (m >= M)
|
130
|
+
break;
|
131
|
+
}
|
132
|
+
|
133
|
+
{
|
134
|
+
const auto mm1hi = svunpkhi_u16(mm1);
|
135
|
+
const auto pghi = svunpkhi_b(pg);
|
136
|
+
|
137
|
+
{
|
138
|
+
// convert uint8 values to uint32 values
|
139
|
+
const auto idx1 = svunpklo_u32(mm1hi);
|
140
|
+
const auto pghilo = svunpklo_b(pghi);
|
141
|
+
|
142
|
+
distance_codes_kernel(pghilo, idx1, offsets_0, tab, partialSum);
|
143
|
+
tab += ksub * quad_lanes;
|
144
|
+
}
|
145
|
+
|
146
|
+
m += quad_lanes;
|
147
|
+
if (m >= M)
|
148
|
+
break;
|
149
|
+
|
150
|
+
{
|
151
|
+
// convert uint8 values to uint32 values
|
152
|
+
const auto idx1 = svunpkhi_u32(mm1hi);
|
153
|
+
const auto pghihi = svunpkhi_b(pghi);
|
154
|
+
|
155
|
+
distance_codes_kernel(pghihi, idx1, offsets_0, tab, partialSum);
|
156
|
+
tab += ksub * quad_lanes;
|
157
|
+
}
|
158
|
+
|
159
|
+
m += quad_lanes;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
return svaddv_f32(svptrue_b32(), partialSum);
|
164
|
+
}
|
165
|
+
|
166
|
+
template <typename PQDecoderT>
|
167
|
+
std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, void>
|
168
|
+
distance_four_codes_sve(
|
169
|
+
// the product quantizer
|
170
|
+
const size_t M,
|
171
|
+
// number of bits per quantization index
|
172
|
+
const size_t nbits,
|
173
|
+
// precomputed distances, layout (M, ksub)
|
174
|
+
const float* sim_table,
|
175
|
+
// codes
|
176
|
+
const uint8_t* __restrict code0,
|
177
|
+
const uint8_t* __restrict code1,
|
178
|
+
const uint8_t* __restrict code2,
|
179
|
+
const uint8_t* __restrict code3,
|
180
|
+
// computed distances
|
181
|
+
float& result0,
|
182
|
+
float& result1,
|
183
|
+
float& result2,
|
184
|
+
float& result3) {
|
185
|
+
distance_four_codes_generic<PQDecoderT>(
|
186
|
+
M,
|
187
|
+
nbits,
|
188
|
+
sim_table,
|
189
|
+
code0,
|
190
|
+
code1,
|
191
|
+
code2,
|
192
|
+
code3,
|
193
|
+
result0,
|
194
|
+
result1,
|
195
|
+
result2,
|
196
|
+
result3);
|
197
|
+
}
|
198
|
+
|
199
|
+
static void distance_four_codes_sve_for_small_m(
|
200
|
+
// the product quantizer
|
201
|
+
const size_t M,
|
202
|
+
// precomputed distances, layout (M, ksub)
|
203
|
+
const float* sim_table,
|
204
|
+
// codes
|
205
|
+
const uint8_t* __restrict code0,
|
206
|
+
const uint8_t* __restrict code1,
|
207
|
+
const uint8_t* __restrict code2,
|
208
|
+
const uint8_t* __restrict code3,
|
209
|
+
// computed distances
|
210
|
+
float& result0,
|
211
|
+
float& result1,
|
212
|
+
float& result2,
|
213
|
+
float& result3) {
|
214
|
+
constexpr size_t nbits = 8u;
|
215
|
+
|
216
|
+
const size_t ksub = 1 << nbits;
|
217
|
+
|
218
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
219
|
+
|
220
|
+
const auto quad_lanes = svcntw();
|
221
|
+
|
222
|
+
// loop
|
223
|
+
const auto pg = svwhilelt_b32_u64(0, M);
|
224
|
+
|
225
|
+
auto mm10 = svld1ub_u32(pg, code0);
|
226
|
+
auto mm11 = svld1ub_u32(pg, code1);
|
227
|
+
auto mm12 = svld1ub_u32(pg, code2);
|
228
|
+
auto mm13 = svld1ub_u32(pg, code3);
|
229
|
+
mm10 = svadd_u32_x(pg, mm10, offsets_0);
|
230
|
+
mm11 = svadd_u32_x(pg, mm11, offsets_0);
|
231
|
+
mm12 = svadd_u32_x(pg, mm12, offsets_0);
|
232
|
+
mm13 = svadd_u32_x(pg, mm13, offsets_0);
|
233
|
+
const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm10);
|
234
|
+
const auto collected1 = svld1_gather_u32index_f32(pg, sim_table, mm11);
|
235
|
+
const auto collected2 = svld1_gather_u32index_f32(pg, sim_table, mm12);
|
236
|
+
const auto collected3 = svld1_gather_u32index_f32(pg, sim_table, mm13);
|
237
|
+
result0 = svaddv_f32(pg, collected0);
|
238
|
+
result1 = svaddv_f32(pg, collected1);
|
239
|
+
result2 = svaddv_f32(pg, collected2);
|
240
|
+
result3 = svaddv_f32(pg, collected3);
|
241
|
+
}
|
242
|
+
|
243
|
+
// Combines 4 operations of distance_single_code()
|
244
|
+
template <typename PQDecoderT>
|
245
|
+
std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, void>
|
246
|
+
distance_four_codes_sve(
|
247
|
+
// the product quantizer
|
248
|
+
const size_t M,
|
249
|
+
// number of bits per quantization index
|
250
|
+
const size_t nbits,
|
251
|
+
// precomputed distances, layout (M, ksub)
|
252
|
+
const float* sim_table,
|
253
|
+
// codes
|
254
|
+
const uint8_t* __restrict code0,
|
255
|
+
const uint8_t* __restrict code1,
|
256
|
+
const uint8_t* __restrict code2,
|
257
|
+
const uint8_t* __restrict code3,
|
258
|
+
// computed distances
|
259
|
+
float& result0,
|
260
|
+
float& result1,
|
261
|
+
float& result2,
|
262
|
+
float& result3) {
|
263
|
+
if (M <= svcntw()) {
|
264
|
+
distance_four_codes_sve_for_small_m(
|
265
|
+
M,
|
266
|
+
sim_table,
|
267
|
+
code0,
|
268
|
+
code1,
|
269
|
+
code2,
|
270
|
+
code3,
|
271
|
+
result0,
|
272
|
+
result1,
|
273
|
+
result2,
|
274
|
+
result3);
|
275
|
+
return;
|
276
|
+
}
|
277
|
+
|
278
|
+
const float* tab = sim_table;
|
279
|
+
|
280
|
+
const size_t ksub = 1 << nbits;
|
281
|
+
|
282
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
283
|
+
|
284
|
+
// accumulators of partial sums
|
285
|
+
auto partialSum0 = svdup_n_f32(0.f);
|
286
|
+
auto partialSum1 = svdup_n_f32(0.f);
|
287
|
+
auto partialSum2 = svdup_n_f32(0.f);
|
288
|
+
auto partialSum3 = svdup_n_f32(0.f);
|
289
|
+
|
290
|
+
const auto lanes = svcntb();
|
291
|
+
const auto quad_lanes = lanes / 4;
|
292
|
+
|
293
|
+
// loop
|
294
|
+
for (std::size_t m = 0; m < M;) {
|
295
|
+
const auto pg = svwhilelt_b8_u64(m, M);
|
296
|
+
|
297
|
+
const auto mm10 = svld1_u8(pg, code0 + m);
|
298
|
+
const auto mm11 = svld1_u8(pg, code1 + m);
|
299
|
+
const auto mm12 = svld1_u8(pg, code2 + m);
|
300
|
+
const auto mm13 = svld1_u8(pg, code3 + m);
|
301
|
+
{
|
302
|
+
const auto mm10lo = svunpklo_u16(mm10);
|
303
|
+
const auto mm11lo = svunpklo_u16(mm11);
|
304
|
+
const auto mm12lo = svunpklo_u16(mm12);
|
305
|
+
const auto mm13lo = svunpklo_u16(mm13);
|
306
|
+
const auto pglo = svunpklo_b(pg);
|
307
|
+
|
308
|
+
{
|
309
|
+
const auto pglolo = svunpklo_b(pglo);
|
310
|
+
{
|
311
|
+
const auto idx1 = svunpklo_u32(mm10lo);
|
312
|
+
distance_codes_kernel(
|
313
|
+
pglolo, idx1, offsets_0, tab, partialSum0);
|
314
|
+
}
|
315
|
+
{
|
316
|
+
const auto idx1 = svunpklo_u32(mm11lo);
|
317
|
+
distance_codes_kernel(
|
318
|
+
pglolo, idx1, offsets_0, tab, partialSum1);
|
319
|
+
}
|
320
|
+
{
|
321
|
+
const auto idx1 = svunpklo_u32(mm12lo);
|
322
|
+
distance_codes_kernel(
|
323
|
+
pglolo, idx1, offsets_0, tab, partialSum2);
|
324
|
+
}
|
325
|
+
{
|
326
|
+
const auto idx1 = svunpklo_u32(mm13lo);
|
327
|
+
distance_codes_kernel(
|
328
|
+
pglolo, idx1, offsets_0, tab, partialSum3);
|
329
|
+
}
|
330
|
+
tab += ksub * quad_lanes;
|
331
|
+
}
|
332
|
+
|
333
|
+
m += quad_lanes;
|
334
|
+
if (m >= M)
|
335
|
+
break;
|
336
|
+
|
337
|
+
{
|
338
|
+
const auto pglohi = svunpkhi_b(pglo);
|
339
|
+
{
|
340
|
+
const auto idx1 = svunpkhi_u32(mm10lo);
|
341
|
+
distance_codes_kernel(
|
342
|
+
pglohi, idx1, offsets_0, tab, partialSum0);
|
343
|
+
}
|
344
|
+
{
|
345
|
+
const auto idx1 = svunpkhi_u32(mm11lo);
|
346
|
+
distance_codes_kernel(
|
347
|
+
pglohi, idx1, offsets_0, tab, partialSum1);
|
348
|
+
}
|
349
|
+
{
|
350
|
+
const auto idx1 = svunpkhi_u32(mm12lo);
|
351
|
+
distance_codes_kernel(
|
352
|
+
pglohi, idx1, offsets_0, tab, partialSum2);
|
353
|
+
}
|
354
|
+
{
|
355
|
+
const auto idx1 = svunpkhi_u32(mm13lo);
|
356
|
+
distance_codes_kernel(
|
357
|
+
pglohi, idx1, offsets_0, tab, partialSum3);
|
358
|
+
}
|
359
|
+
tab += ksub * quad_lanes;
|
360
|
+
}
|
361
|
+
|
362
|
+
m += quad_lanes;
|
363
|
+
if (m >= M)
|
364
|
+
break;
|
365
|
+
}
|
366
|
+
|
367
|
+
{
|
368
|
+
const auto mm10hi = svunpkhi_u16(mm10);
|
369
|
+
const auto mm11hi = svunpkhi_u16(mm11);
|
370
|
+
const auto mm12hi = svunpkhi_u16(mm12);
|
371
|
+
const auto mm13hi = svunpkhi_u16(mm13);
|
372
|
+
const auto pghi = svunpkhi_b(pg);
|
373
|
+
|
374
|
+
{
|
375
|
+
const auto pghilo = svunpklo_b(pghi);
|
376
|
+
{
|
377
|
+
const auto idx1 = svunpklo_u32(mm10hi);
|
378
|
+
distance_codes_kernel(
|
379
|
+
pghilo, idx1, offsets_0, tab, partialSum0);
|
380
|
+
}
|
381
|
+
{
|
382
|
+
const auto idx1 = svunpklo_u32(mm11hi);
|
383
|
+
distance_codes_kernel(
|
384
|
+
pghilo, idx1, offsets_0, tab, partialSum1);
|
385
|
+
}
|
386
|
+
{
|
387
|
+
const auto idx1 = svunpklo_u32(mm12hi);
|
388
|
+
distance_codes_kernel(
|
389
|
+
pghilo, idx1, offsets_0, tab, partialSum2);
|
390
|
+
}
|
391
|
+
{
|
392
|
+
const auto idx1 = svunpklo_u32(mm13hi);
|
393
|
+
distance_codes_kernel(
|
394
|
+
pghilo, idx1, offsets_0, tab, partialSum3);
|
395
|
+
}
|
396
|
+
tab += ksub * quad_lanes;
|
397
|
+
}
|
398
|
+
|
399
|
+
m += quad_lanes;
|
400
|
+
if (m >= M)
|
401
|
+
break;
|
402
|
+
|
403
|
+
{
|
404
|
+
const auto pghihi = svunpkhi_b(pghi);
|
405
|
+
{
|
406
|
+
const auto idx1 = svunpkhi_u32(mm10hi);
|
407
|
+
distance_codes_kernel(
|
408
|
+
pghihi, idx1, offsets_0, tab, partialSum0);
|
409
|
+
}
|
410
|
+
{
|
411
|
+
const auto idx1 = svunpkhi_u32(mm11hi);
|
412
|
+
distance_codes_kernel(
|
413
|
+
pghihi, idx1, offsets_0, tab, partialSum1);
|
414
|
+
}
|
415
|
+
{
|
416
|
+
const auto idx1 = svunpkhi_u32(mm12hi);
|
417
|
+
distance_codes_kernel(
|
418
|
+
pghihi, idx1, offsets_0, tab, partialSum2);
|
419
|
+
}
|
420
|
+
{
|
421
|
+
const auto idx1 = svunpkhi_u32(mm13hi);
|
422
|
+
distance_codes_kernel(
|
423
|
+
pghihi, idx1, offsets_0, tab, partialSum3);
|
424
|
+
}
|
425
|
+
tab += ksub * quad_lanes;
|
426
|
+
}
|
427
|
+
|
428
|
+
m += quad_lanes;
|
429
|
+
}
|
430
|
+
}
|
431
|
+
|
432
|
+
result0 = svaddv_f32(svptrue_b32(), partialSum0);
|
433
|
+
result1 = svaddv_f32(svptrue_b32(), partialSum1);
|
434
|
+
result2 = svaddv_f32(svptrue_b32(), partialSum2);
|
435
|
+
result3 = svaddv_f32(svptrue_b32(), partialSum3);
|
436
|
+
}
|
437
|
+
|
438
|
+
} // namespace faiss
|
439
|
+
|
440
|
+
#endif
|