faiss 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/LICENSE.txt +1 -1
- 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
|
|