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.
|
@@ -212,12 +212,16 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
212
212
|
// repeated codebook
|
213
213
|
Tensor2D zqs_r(n * K, d); // size n, K, d
|
214
214
|
Tensor2D cc(n * K, d * 2); // size n, K, d * 2
|
215
|
-
size_t d = this->d;
|
216
215
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
216
|
+
size_t local_d = this->d;
|
217
|
+
|
218
|
+
auto copy_row =
|
219
|
+
[local_d](Tensor2D& t, size_t i, size_t j, const float* data) {
|
220
|
+
assert(i <= t.shape[0] && j <= t.shape[1]);
|
221
|
+
memcpy(t.data() + i * t.shape[1] + j,
|
222
|
+
data,
|
223
|
+
sizeof(float) * local_d);
|
224
|
+
};
|
221
225
|
|
222
226
|
// manual broadcasting
|
223
227
|
for (size_t i = 0; i < n; i++) {
|
@@ -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.
|
@@ -18,6 +18,8 @@
|
|
18
18
|
|
19
19
|
#ifdef __AVX2__
|
20
20
|
#include <immintrin.h>
|
21
|
+
#elif defined(__ARM_FEATURE_SVE)
|
22
|
+
#include <arm_sve.h>
|
21
23
|
#endif
|
22
24
|
|
23
25
|
#include <faiss/impl/AuxIndexStructures.h>
|
@@ -557,6 +559,183 @@ void exhaustive_L2sqr_blas_cmax_avx2(
|
|
557
559
|
InterruptCallback::check();
|
558
560
|
}
|
559
561
|
}
|
562
|
+
#elif defined(__ARM_FEATURE_SVE)
|
563
|
+
void exhaustive_L2sqr_blas_cmax_sve(
|
564
|
+
const float* x,
|
565
|
+
const float* y,
|
566
|
+
size_t d,
|
567
|
+
size_t nx,
|
568
|
+
size_t ny,
|
569
|
+
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
570
|
+
const float* y_norms) {
|
571
|
+
// BLAS does not like empty matrices
|
572
|
+
if (nx == 0 || ny == 0)
|
573
|
+
return;
|
574
|
+
|
575
|
+
/* block sizes */
|
576
|
+
const size_t bs_x = distance_compute_blas_query_bs;
|
577
|
+
const size_t bs_y = distance_compute_blas_database_bs;
|
578
|
+
// const size_t bs_x = 16, bs_y = 16;
|
579
|
+
std::unique_ptr<float[]> ip_block(new float[bs_x * bs_y]);
|
580
|
+
std::unique_ptr<float[]> x_norms(new float[nx]);
|
581
|
+
std::unique_ptr<float[]> del2;
|
582
|
+
|
583
|
+
fvec_norms_L2sqr(x_norms.get(), x, d, nx);
|
584
|
+
|
585
|
+
const size_t lanes = svcntw();
|
586
|
+
|
587
|
+
if (!y_norms) {
|
588
|
+
float* y_norms2 = new float[ny];
|
589
|
+
del2.reset(y_norms2);
|
590
|
+
fvec_norms_L2sqr(y_norms2, y, d, ny);
|
591
|
+
y_norms = y_norms2;
|
592
|
+
}
|
593
|
+
|
594
|
+
for (size_t i0 = 0; i0 < nx; i0 += bs_x) {
|
595
|
+
size_t i1 = i0 + bs_x;
|
596
|
+
if (i1 > nx)
|
597
|
+
i1 = nx;
|
598
|
+
|
599
|
+
res.begin_multiple(i0, i1);
|
600
|
+
|
601
|
+
for (size_t j0 = 0; j0 < ny; j0 += bs_y) {
|
602
|
+
size_t j1 = j0 + bs_y;
|
603
|
+
if (j1 > ny)
|
604
|
+
j1 = ny;
|
605
|
+
/* compute the actual dot products */
|
606
|
+
{
|
607
|
+
float one = 1, zero = 0;
|
608
|
+
FINTEGER nyi = j1 - j0, nxi = i1 - i0, di = d;
|
609
|
+
sgemm_("Transpose",
|
610
|
+
"Not transpose",
|
611
|
+
&nyi,
|
612
|
+
&nxi,
|
613
|
+
&di,
|
614
|
+
&one,
|
615
|
+
y + j0 * d,
|
616
|
+
&di,
|
617
|
+
x + i0 * d,
|
618
|
+
&di,
|
619
|
+
&zero,
|
620
|
+
ip_block.get(),
|
621
|
+
&nyi);
|
622
|
+
}
|
623
|
+
#pragma omp parallel for
|
624
|
+
for (int64_t i = i0; i < i1; i++) {
|
625
|
+
const size_t count = j1 - j0;
|
626
|
+
float* ip_line = ip_block.get() + (i - i0) * count;
|
627
|
+
|
628
|
+
svprfw(svwhilelt_b32_u64(0, count), ip_line, SV_PLDL1KEEP);
|
629
|
+
svprfw(svwhilelt_b32_u64(lanes, count),
|
630
|
+
ip_line + lanes,
|
631
|
+
SV_PLDL1KEEP);
|
632
|
+
|
633
|
+
// Track lanes min distances + lanes min indices.
|
634
|
+
// All the distances tracked do not take x_norms[i]
|
635
|
+
// into account in order to get rid of extra
|
636
|
+
// vaddq_f32(x_norms[i], ...) instructions
|
637
|
+
// is distance computations.
|
638
|
+
auto min_distances = svdup_n_f32(res.dis_tab[i] - x_norms[i]);
|
639
|
+
|
640
|
+
// these indices are local and are relative to j0.
|
641
|
+
// so, value 0 means j0.
|
642
|
+
auto min_indices = svdup_n_u32(0u);
|
643
|
+
|
644
|
+
auto current_indices = svindex_u32(0u, 1u);
|
645
|
+
|
646
|
+
// process lanes * 2 elements per loop
|
647
|
+
for (size_t idx_j = 0; idx_j < count;
|
648
|
+
idx_j += lanes * 2, ip_line += lanes * 2) {
|
649
|
+
svprfw(svwhilelt_b32_u64(idx_j + lanes * 2, count),
|
650
|
+
ip_line + lanes * 2,
|
651
|
+
SV_PLDL1KEEP);
|
652
|
+
svprfw(svwhilelt_b32_u64(idx_j + lanes * 3, count),
|
653
|
+
ip_line + lanes * 3,
|
654
|
+
SV_PLDL1KEEP);
|
655
|
+
|
656
|
+
// mask
|
657
|
+
const auto mask_0 = svwhilelt_b32_u64(idx_j, count);
|
658
|
+
const auto mask_1 = svwhilelt_b32_u64(idx_j + lanes, count);
|
659
|
+
|
660
|
+
// load values for norms
|
661
|
+
const auto y_norm_0 =
|
662
|
+
svld1_f32(mask_0, y_norms + idx_j + j0 + 0);
|
663
|
+
const auto y_norm_1 =
|
664
|
+
svld1_f32(mask_1, y_norms + idx_j + j0 + lanes);
|
665
|
+
|
666
|
+
// load values for dot products
|
667
|
+
const auto ip_0 = svld1_f32(mask_0, ip_line + 0);
|
668
|
+
const auto ip_1 = svld1_f32(mask_1, ip_line + lanes);
|
669
|
+
|
670
|
+
// compute dis = y_norm[j] - 2 * dot(x_norm[i], y_norm[j]).
|
671
|
+
// x_norm[i] was dropped off because it is a constant for a
|
672
|
+
// given i. We'll deal with it later.
|
673
|
+
const auto distances_0 =
|
674
|
+
svmla_n_f32_z(mask_0, y_norm_0, ip_0, -2.f);
|
675
|
+
const auto distances_1 =
|
676
|
+
svmla_n_f32_z(mask_1, y_norm_1, ip_1, -2.f);
|
677
|
+
|
678
|
+
// compare the new distances to the min distances
|
679
|
+
// for each of the first group of 4 ARM SIMD components.
|
680
|
+
auto comparison =
|
681
|
+
svcmpgt_f32(mask_0, min_distances, distances_0);
|
682
|
+
|
683
|
+
// update min distances and indices with closest vectors if
|
684
|
+
// needed.
|
685
|
+
min_distances =
|
686
|
+
svsel_f32(comparison, distances_0, min_distances);
|
687
|
+
min_indices =
|
688
|
+
svsel_u32(comparison, current_indices, min_indices);
|
689
|
+
current_indices = svadd_n_u32_x(
|
690
|
+
mask_0,
|
691
|
+
current_indices,
|
692
|
+
static_cast<uint32_t>(lanes));
|
693
|
+
|
694
|
+
// compare the new distances to the min distances
|
695
|
+
// for each of the second group of 4 ARM SIMD components.
|
696
|
+
comparison =
|
697
|
+
svcmpgt_f32(mask_1, min_distances, distances_1);
|
698
|
+
|
699
|
+
// update min distances and indices with closest vectors if
|
700
|
+
// needed.
|
701
|
+
min_distances =
|
702
|
+
svsel_f32(comparison, distances_1, min_distances);
|
703
|
+
min_indices =
|
704
|
+
svsel_u32(comparison, current_indices, min_indices);
|
705
|
+
current_indices = svadd_n_u32_x(
|
706
|
+
mask_1,
|
707
|
+
current_indices,
|
708
|
+
static_cast<uint32_t>(lanes));
|
709
|
+
}
|
710
|
+
|
711
|
+
// add missing x_norms[i]
|
712
|
+
// negative values can occur for identical vectors
|
713
|
+
// due to roundoff errors.
|
714
|
+
auto mask = svwhilelt_b32_u64(0, count);
|
715
|
+
min_distances = svadd_n_f32_z(
|
716
|
+
svcmpge_n_f32(mask, min_distances, -x_norms[i]),
|
717
|
+
min_distances,
|
718
|
+
x_norms[i]);
|
719
|
+
min_indices = svadd_n_u32_x(
|
720
|
+
mask, min_indices, static_cast<uint32_t>(j0));
|
721
|
+
mask = svcmple_n_f32(mask, min_distances, res.dis_tab[i]);
|
722
|
+
if (svcntp_b32(svptrue_b32(), mask) == 0)
|
723
|
+
res.add_result(i, res.dis_tab[i], res.ids_tab[i]);
|
724
|
+
else {
|
725
|
+
const auto min_distance = svminv_f32(mask, min_distances);
|
726
|
+
const auto min_index = svminv_u32(
|
727
|
+
svcmpeq_n_f32(mask, min_distances, min_distance),
|
728
|
+
min_indices);
|
729
|
+
res.add_result(i, min_distance, min_index);
|
730
|
+
}
|
731
|
+
}
|
732
|
+
}
|
733
|
+
// Does nothing for SingleBestResultHandler, but
|
734
|
+
// keeping the call for the consistency.
|
735
|
+
res.end_multiple();
|
736
|
+
InterruptCallback::check();
|
737
|
+
}
|
738
|
+
}
|
560
739
|
#endif
|
561
740
|
|
562
741
|
// an override if only a single closest point is needed
|
@@ -579,6 +758,16 @@ void exhaustive_L2sqr_blas<Top1BlockResultHandler<CMax<float, int64_t>>>(
|
|
579
758
|
// run the specialized AVX2 implementation
|
580
759
|
exhaustive_L2sqr_blas_cmax_avx2(x, y, d, nx, ny, res, y_norms);
|
581
760
|
|
761
|
+
#elif defined(__ARM_FEATURE_SVE)
|
762
|
+
// use a faster fused kernel if available
|
763
|
+
if (exhaustive_L2sqr_fused_cmax(x, y, d, nx, ny, res, y_norms)) {
|
764
|
+
// the kernel is available and it is complete, we're done.
|
765
|
+
return;
|
766
|
+
}
|
767
|
+
|
768
|
+
// run the specialized SVE implementation
|
769
|
+
exhaustive_L2sqr_blas_cmax_sve(x, y, d, nx, ny, res, y_norms);
|
770
|
+
|
582
771
|
#elif defined(__aarch64__)
|
583
772
|
// use a faster fused kernel if available
|
584
773
|
if (exhaustive_L2sqr_fused_cmax(x, y, d, nx, ny, res, y_norms)) {
|
@@ -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.
|
@@ -469,7 +469,7 @@ void compute_PQ_dis_tables_dsub2(
|
|
469
469
|
* @param n size of the tables
|
470
470
|
* @param a size n
|
471
471
|
* @param b size n
|
472
|
-
* @param c
|
472
|
+
* @param c result table, size n
|
473
473
|
*/
|
474
474
|
void fvec_madd(size_t n, const float* a, float bf, const float* b, float* c);
|
475
475
|
|