faiss 0.3.1 → 0.3.3
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/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +2 -2
- data/vendor/faiss/faiss/AutoTune.h +3 -3
- data/vendor/faiss/faiss/Clustering.cpp +37 -6
- data/vendor/faiss/faiss/Clustering.h +12 -3
- data/vendor/faiss/faiss/IVFlib.cpp +6 -3
- data/vendor/faiss/faiss/IVFlib.h +2 -2
- data/vendor/faiss/faiss/Index.cpp +6 -2
- data/vendor/faiss/faiss/Index.h +30 -8
- 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 +3 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryHash.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +3 -3
- data/vendor/faiss/faiss/IndexBinaryIVF.h +2 -2
- data/vendor/faiss/faiss/IndexFastScan.cpp +32 -18
- data/vendor/faiss/faiss/IndexFastScan.h +11 -2
- data/vendor/faiss/faiss/IndexFlat.cpp +13 -10
- data/vendor/faiss/faiss/IndexFlat.h +2 -2
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +170 -7
- data/vendor/faiss/faiss/IndexFlatCodes.h +25 -5
- data/vendor/faiss/faiss/IndexHNSW.cpp +156 -96
- data/vendor/faiss/faiss/IndexHNSW.h +54 -5
- data/vendor/faiss/faiss/IndexIDMap.cpp +19 -3
- data/vendor/faiss/faiss/IndexIDMap.h +5 -2
- data/vendor/faiss/faiss/IndexIVF.cpp +5 -6
- data/vendor/faiss/faiss/IndexIVF.h +13 -4
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +21 -7
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +5 -2
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -14
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +2 -4
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +201 -91
- data/vendor/faiss/faiss/IndexIVFFastScan.h +33 -9
- 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 +3 -6
- data/vendor/faiss/faiss/IndexIVFPQ.h +2 -2
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +7 -14
- 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 +3 -21
- data/vendor/faiss/faiss/IndexLattice.h +5 -24
- data/vendor/faiss/faiss/IndexNNDescent.cpp +2 -31
- data/vendor/faiss/faiss/IndexNNDescent.h +3 -3
- data/vendor/faiss/faiss/IndexNSG.cpp +2 -5
- data/vendor/faiss/faiss/IndexNSG.h +3 -3
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +56 -0
- data/vendor/faiss/faiss/IndexNeuralNetCodec.h +49 -0
- 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 +3 -3
- data/vendor/faiss/faiss/IndexRefine.cpp +46 -9
- 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 +5 -4
- 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 +9 -4
- 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 +97 -19
- data/vendor/faiss/faiss/cppcontrib/factory_tools.cpp +192 -0
- data/vendor/faiss/faiss/cppcontrib/factory_tools.h +29 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +85 -32
- 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 +45 -13
- data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +12 -6
- data/vendor/faiss/faiss/gpu/GpuDistance.h +11 -7
- data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +3 -3
- data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndex.h +10 -15
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +285 -0
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +8 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +4 -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 +66 -11
- 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 +28 -23
- 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 +8 -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 +10 -7
- 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 +144 -77
- 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 +3 -3
- data/vendor/faiss/faiss/gpu/utils/{RaftUtils.h → CuvsUtils.h} +12 -11
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +8 -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 +6 -3
- data/vendor/faiss/faiss/gpu/utils/Timer.h +3 -3
- 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 +27 -2
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +11 -3
- 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 +48 -2
- data/vendor/faiss/faiss/impl/FaissAssert.h +6 -4
- 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 +378 -205
- data/vendor/faiss/faiss/impl/HNSW.h +55 -24
- 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 +10 -10
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/LookupTableScaler.h +36 -2
- data/vendor/faiss/faiss/impl/NNDescent.cpp +15 -10
- data/vendor/faiss/faiss/impl/NNDescent.h +2 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +26 -49
- 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 +3 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +7 -3
- 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 +153 -34
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +721 -104
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +5 -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 +7 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx512.h +248 -0
- 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 +31 -20
- data/vendor/faiss/faiss/impl/index_read_utils.h +37 -0
- data/vendor/faiss/faiss/impl/index_write.cpp +30 -16
- data/vendor/faiss/faiss/impl/io.cpp +15 -7
- data/vendor/faiss/faiss/impl/io.h +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +8 -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 +34 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +13 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +20 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +3 -3
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +450 -3
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +8 -8
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +3 -3
- data/vendor/faiss/faiss/impl/simd_result_handlers.h +151 -67
- data/vendor/faiss/faiss/index_factory.cpp +51 -34
- data/vendor/faiss/faiss/index_factory.h +2 -2
- data/vendor/faiss/faiss/index_io.h +14 -7
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +30 -10
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +5 -2
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +11 -3
- data/vendor/faiss/faiss/invlists/DirectMap.h +2 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +57 -19
- data/vendor/faiss/faiss/invlists/InvertedLists.h +20 -11
- 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 +23 -9
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +4 -3
- data/vendor/faiss/faiss/python/python_callbacks.cpp +5 -5
- 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 +107 -2
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +346 -0
- data/vendor/faiss/faiss/utils/NeuralNet.h +147 -0
- 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 +36 -0
- data/vendor/faiss/faiss/utils/distances.cpp +249 -90
- data/vendor/faiss/faiss/utils/distances.h +8 -8
- 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 +1543 -56
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +72 -2
- data/vendor/faiss/faiss/utils/extra_distances.cpp +87 -140
- data/vendor/faiss/faiss/utils/extra_distances.h +5 -4
- 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 +3 -4
- 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 +6 -3
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +7 -3
- 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 +45 -2
- data/vendor/faiss/faiss/utils/random.h +27 -2
- data/vendor/faiss/faiss/utils/simdlib.h +12 -3
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +296 -0
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_neon.h +7 -4
- data/vendor/faiss/faiss/utils/simdlib_ppc64.h +1084 -0
- 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 +176 -0
- data/vendor/faiss/faiss/utils/utils.cpp +17 -10
- data/vendor/faiss/faiss/utils/utils.h +7 -3
- metadata +22 -11
- data/vendor/faiss/faiss/impl/code_distance/code_distance_avx512.h +0 -102
@@ -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.
|
@@ -43,6 +43,30 @@ struct RandomGenerator {
|
|
43
43
|
explicit RandomGenerator(int64_t seed = 1234);
|
44
44
|
};
|
45
45
|
|
46
|
+
/// fast random generator that cannot be used in multithreaded contexts.
|
47
|
+
/// based on https://prng.di.unimi.it/
|
48
|
+
struct SplitMix64RandomGenerator {
|
49
|
+
uint64_t state;
|
50
|
+
|
51
|
+
/// random positive integer
|
52
|
+
int rand_int();
|
53
|
+
|
54
|
+
/// random int64_t
|
55
|
+
int64_t rand_int64();
|
56
|
+
|
57
|
+
/// generate random integer between 0 and max-1
|
58
|
+
int rand_int(int max);
|
59
|
+
|
60
|
+
/// between 0 and 1
|
61
|
+
float rand_float();
|
62
|
+
|
63
|
+
double rand_double();
|
64
|
+
|
65
|
+
explicit SplitMix64RandomGenerator(int64_t seed = 1234);
|
66
|
+
|
67
|
+
uint64_t next();
|
68
|
+
};
|
69
|
+
|
46
70
|
/* Generate an array of uniform random floats / multi-threaded implementation */
|
47
71
|
void float_rand(float* x, size_t n, int64_t seed);
|
48
72
|
void float_randn(float* x, size_t n, int64_t seed);
|
@@ -53,6 +77,7 @@ void int64_rand_max(int64_t* x, size_t n, uint64_t max, int64_t seed);
|
|
53
77
|
|
54
78
|
/* random permutation */
|
55
79
|
void rand_perm(int* perm, size_t n, int64_t seed);
|
80
|
+
void rand_perm_splitmix64(int* perm, size_t n, int64_t seed);
|
56
81
|
|
57
82
|
/* Random set of vectors with intrinsic dimensionality 10 that is harder to
|
58
83
|
* index than a subspace of dim 10 but easier than uniform data in dimension d
|
@@ -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.
|
@@ -14,7 +14,12 @@
|
|
14
14
|
* functions.
|
15
15
|
*/
|
16
16
|
|
17
|
-
#
|
17
|
+
#if defined(__AVX512F__)
|
18
|
+
|
19
|
+
#include <faiss/utils/simdlib_avx2.h>
|
20
|
+
#include <faiss/utils/simdlib_avx512.h>
|
21
|
+
|
22
|
+
#elif defined(__AVX2__)
|
18
23
|
|
19
24
|
#include <faiss/utils/simdlib_avx2.h>
|
20
25
|
|
@@ -22,6 +27,10 @@
|
|
22
27
|
|
23
28
|
#include <faiss/utils/simdlib_neon.h>
|
24
29
|
|
30
|
+
#elif defined(__PPC64__)
|
31
|
+
|
32
|
+
#include <faiss/utils/simdlib_ppc64.h>
|
33
|
+
|
25
34
|
#else
|
26
35
|
|
27
36
|
// emulated = all operations are implemented as scalars
|
@@ -0,0 +1,296 @@
|
|
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
|
+
#include <cstdint>
|
11
|
+
#include <string>
|
12
|
+
|
13
|
+
#include <immintrin.h>
|
14
|
+
|
15
|
+
#include <faiss/impl/platform_macros.h>
|
16
|
+
|
17
|
+
#include <faiss/utils/simdlib_avx2.h>
|
18
|
+
|
19
|
+
namespace faiss {
|
20
|
+
|
21
|
+
/** Simple wrapper around the AVX 512-bit registers
|
22
|
+
*
|
23
|
+
* The objective is to separate the different interpretations of the same
|
24
|
+
* registers (as a vector of uint8, uint16 or uint32), to provide printing
|
25
|
+
* functions, and to give more readable names to the AVX intrinsics. It does not
|
26
|
+
* pretend to be exhausitve, functions are added as needed.
|
27
|
+
*/
|
28
|
+
|
29
|
+
/// 512-bit representation without interpretation as a vector
|
30
|
+
struct simd512bit {
|
31
|
+
union {
|
32
|
+
__m512i i;
|
33
|
+
__m512 f;
|
34
|
+
};
|
35
|
+
|
36
|
+
simd512bit() {}
|
37
|
+
|
38
|
+
explicit simd512bit(__m512i i) : i(i) {}
|
39
|
+
|
40
|
+
explicit simd512bit(__m512 f) : f(f) {}
|
41
|
+
|
42
|
+
explicit simd512bit(const void* x)
|
43
|
+
: i(_mm512_loadu_si512((__m512i const*)x)) {}
|
44
|
+
|
45
|
+
// sets up a lower half of the register while keeping upper one as zero
|
46
|
+
explicit simd512bit(simd256bit lo)
|
47
|
+
: simd512bit(_mm512_inserti32x8(
|
48
|
+
_mm512_castsi256_si512(lo.i),
|
49
|
+
_mm256_setzero_si256(),
|
50
|
+
1)) {}
|
51
|
+
|
52
|
+
// constructs from lower and upper halves
|
53
|
+
explicit simd512bit(simd256bit lo, simd256bit hi)
|
54
|
+
: simd512bit(_mm512_inserti32x8(
|
55
|
+
_mm512_castsi256_si512(lo.i),
|
56
|
+
hi.i,
|
57
|
+
1)) {}
|
58
|
+
|
59
|
+
void clear() {
|
60
|
+
i = _mm512_setzero_si512();
|
61
|
+
}
|
62
|
+
|
63
|
+
void storeu(void* ptr) const {
|
64
|
+
_mm512_storeu_si512((__m512i*)ptr, i);
|
65
|
+
}
|
66
|
+
|
67
|
+
void loadu(const void* ptr) {
|
68
|
+
i = _mm512_loadu_si512((__m512i*)ptr);
|
69
|
+
}
|
70
|
+
|
71
|
+
void store(void* ptr) const {
|
72
|
+
_mm512_storeu_si512((__m512i*)ptr, i);
|
73
|
+
}
|
74
|
+
|
75
|
+
void bin(char bits[513]) const {
|
76
|
+
char bytes[64];
|
77
|
+
storeu((void*)bytes);
|
78
|
+
for (int i = 0; i < 512; i++) {
|
79
|
+
bits[i] = '0' + ((bytes[i / 8] >> (i % 8)) & 1);
|
80
|
+
}
|
81
|
+
bits[512] = 0;
|
82
|
+
}
|
83
|
+
|
84
|
+
std::string bin() const {
|
85
|
+
char bits[257];
|
86
|
+
bin(bits);
|
87
|
+
return std::string(bits);
|
88
|
+
}
|
89
|
+
};
|
90
|
+
|
91
|
+
/// vector of 32 elements in uint16
|
92
|
+
struct simd32uint16 : simd512bit {
|
93
|
+
simd32uint16() {}
|
94
|
+
|
95
|
+
explicit simd32uint16(__m512i i) : simd512bit(i) {}
|
96
|
+
|
97
|
+
explicit simd32uint16(int x) : simd512bit(_mm512_set1_epi16(x)) {}
|
98
|
+
|
99
|
+
explicit simd32uint16(uint16_t x) : simd512bit(_mm512_set1_epi16(x)) {}
|
100
|
+
|
101
|
+
explicit simd32uint16(simd512bit x) : simd512bit(x) {}
|
102
|
+
|
103
|
+
explicit simd32uint16(const uint16_t* x) : simd512bit((const void*)x) {}
|
104
|
+
|
105
|
+
// sets up a lower half of the register
|
106
|
+
explicit simd32uint16(simd256bit lo) : simd512bit(lo) {}
|
107
|
+
|
108
|
+
// constructs from lower and upper halves
|
109
|
+
explicit simd32uint16(simd256bit lo, simd256bit hi) : simd512bit(lo, hi) {}
|
110
|
+
|
111
|
+
std::string elements_to_string(const char* fmt) const {
|
112
|
+
uint16_t bytes[32];
|
113
|
+
storeu((void*)bytes);
|
114
|
+
char res[2000];
|
115
|
+
char* ptr = res;
|
116
|
+
for (int i = 0; i < 32; i++) {
|
117
|
+
ptr += sprintf(ptr, fmt, bytes[i]);
|
118
|
+
}
|
119
|
+
// strip last ,
|
120
|
+
ptr[-1] = 0;
|
121
|
+
return std::string(res);
|
122
|
+
}
|
123
|
+
|
124
|
+
std::string hex() const {
|
125
|
+
return elements_to_string("%02x,");
|
126
|
+
}
|
127
|
+
|
128
|
+
std::string dec() const {
|
129
|
+
return elements_to_string("%3d,");
|
130
|
+
}
|
131
|
+
|
132
|
+
void set1(uint16_t x) {
|
133
|
+
i = _mm512_set1_epi16((short)x);
|
134
|
+
}
|
135
|
+
|
136
|
+
simd32uint16 operator*(const simd32uint16& other) const {
|
137
|
+
return simd32uint16(_mm512_mullo_epi16(i, other.i));
|
138
|
+
}
|
139
|
+
|
140
|
+
// shift must be known at compile time
|
141
|
+
simd32uint16 operator>>(const int shift) const {
|
142
|
+
return simd32uint16(_mm512_srli_epi16(i, shift));
|
143
|
+
}
|
144
|
+
|
145
|
+
// shift must be known at compile time
|
146
|
+
simd32uint16 operator<<(const int shift) const {
|
147
|
+
return simd32uint16(_mm512_slli_epi16(i, shift));
|
148
|
+
}
|
149
|
+
|
150
|
+
simd32uint16 operator+=(simd32uint16 other) {
|
151
|
+
i = _mm512_add_epi16(i, other.i);
|
152
|
+
return *this;
|
153
|
+
}
|
154
|
+
|
155
|
+
simd32uint16 operator-=(simd32uint16 other) {
|
156
|
+
i = _mm512_sub_epi16(i, other.i);
|
157
|
+
return *this;
|
158
|
+
}
|
159
|
+
|
160
|
+
simd32uint16 operator+(simd32uint16 other) const {
|
161
|
+
return simd32uint16(_mm512_add_epi16(i, other.i));
|
162
|
+
}
|
163
|
+
|
164
|
+
simd32uint16 operator-(simd32uint16 other) const {
|
165
|
+
return simd32uint16(_mm512_sub_epi16(i, other.i));
|
166
|
+
}
|
167
|
+
|
168
|
+
simd32uint16 operator&(simd512bit other) const {
|
169
|
+
return simd32uint16(_mm512_and_si512(i, other.i));
|
170
|
+
}
|
171
|
+
|
172
|
+
simd32uint16 operator|(simd512bit other) const {
|
173
|
+
return simd32uint16(_mm512_or_si512(i, other.i));
|
174
|
+
}
|
175
|
+
|
176
|
+
simd32uint16 operator^(simd512bit other) const {
|
177
|
+
return simd32uint16(_mm512_xor_si512(i, other.i));
|
178
|
+
}
|
179
|
+
|
180
|
+
simd32uint16 operator~() const {
|
181
|
+
return simd32uint16(_mm512_xor_si512(i, _mm512_set1_epi32(-1)));
|
182
|
+
}
|
183
|
+
|
184
|
+
simd16uint16 low() const {
|
185
|
+
return simd16uint16(_mm512_castsi512_si256(i));
|
186
|
+
}
|
187
|
+
|
188
|
+
simd16uint16 high() const {
|
189
|
+
return simd16uint16(_mm512_extracti32x8_epi32(i, 1));
|
190
|
+
}
|
191
|
+
|
192
|
+
// for debugging only
|
193
|
+
uint16_t operator[](int i) const {
|
194
|
+
ALIGNED(64) uint16_t tab[32];
|
195
|
+
store(tab);
|
196
|
+
return tab[i];
|
197
|
+
}
|
198
|
+
|
199
|
+
void accu_min(simd32uint16 incoming) {
|
200
|
+
i = _mm512_min_epu16(i, incoming.i);
|
201
|
+
}
|
202
|
+
|
203
|
+
void accu_max(simd32uint16 incoming) {
|
204
|
+
i = _mm512_max_epu16(i, incoming.i);
|
205
|
+
}
|
206
|
+
};
|
207
|
+
|
208
|
+
// decompose in 128-lanes: a = (a0, a1, a2, a3), b = (b0, b1, b2, b3)
|
209
|
+
// return (a0 + a1 + a2 + a3, b0 + b1 + b2 + b3)
|
210
|
+
inline simd16uint16 combine4x2(simd32uint16 a, simd32uint16 b) {
|
211
|
+
return combine2x2(a.low(), b.low()) + combine2x2(a.high(), b.high());
|
212
|
+
}
|
213
|
+
|
214
|
+
// vector of 32 unsigned 8-bit integers
|
215
|
+
struct simd64uint8 : simd512bit {
|
216
|
+
simd64uint8() {}
|
217
|
+
|
218
|
+
explicit simd64uint8(__m512i i) : simd512bit(i) {}
|
219
|
+
|
220
|
+
explicit simd64uint8(int x) : simd512bit(_mm512_set1_epi8(x)) {}
|
221
|
+
|
222
|
+
explicit simd64uint8(uint8_t x) : simd512bit(_mm512_set1_epi8(x)) {}
|
223
|
+
|
224
|
+
// sets up a lower half of the register
|
225
|
+
explicit simd64uint8(simd256bit lo) : simd512bit(lo) {}
|
226
|
+
|
227
|
+
// constructs from lower and upper halves
|
228
|
+
explicit simd64uint8(simd256bit lo, simd256bit hi) : simd512bit(lo, hi) {}
|
229
|
+
|
230
|
+
explicit simd64uint8(simd512bit x) : simd512bit(x) {}
|
231
|
+
|
232
|
+
explicit simd64uint8(const uint8_t* x) : simd512bit((const void*)x) {}
|
233
|
+
|
234
|
+
std::string elements_to_string(const char* fmt) const {
|
235
|
+
uint8_t bytes[64];
|
236
|
+
storeu((void*)bytes);
|
237
|
+
char res[2000];
|
238
|
+
char* ptr = res;
|
239
|
+
for (int i = 0; i < 64; i++) {
|
240
|
+
ptr += sprintf(ptr, fmt, bytes[i]);
|
241
|
+
}
|
242
|
+
// strip last ,
|
243
|
+
ptr[-1] = 0;
|
244
|
+
return std::string(res);
|
245
|
+
}
|
246
|
+
|
247
|
+
std::string hex() const {
|
248
|
+
return elements_to_string("%02x,");
|
249
|
+
}
|
250
|
+
|
251
|
+
std::string dec() const {
|
252
|
+
return elements_to_string("%3d,");
|
253
|
+
}
|
254
|
+
|
255
|
+
void set1(uint8_t x) {
|
256
|
+
i = _mm512_set1_epi8((char)x);
|
257
|
+
}
|
258
|
+
|
259
|
+
simd64uint8 operator&(simd512bit other) const {
|
260
|
+
return simd64uint8(_mm512_and_si512(i, other.i));
|
261
|
+
}
|
262
|
+
|
263
|
+
simd64uint8 operator+(simd64uint8 other) const {
|
264
|
+
return simd64uint8(_mm512_add_epi8(i, other.i));
|
265
|
+
}
|
266
|
+
|
267
|
+
simd64uint8 lookup_4_lanes(simd64uint8 idx) const {
|
268
|
+
return simd64uint8(_mm512_shuffle_epi8(i, idx.i));
|
269
|
+
}
|
270
|
+
|
271
|
+
// extract + 0-extend lane
|
272
|
+
// this operation is slow (3 cycles)
|
273
|
+
simd32uint16 lane0_as_uint16() const {
|
274
|
+
__m256i x = _mm512_extracti32x8_epi32(i, 0);
|
275
|
+
return simd32uint16(_mm512_cvtepu8_epi16(x));
|
276
|
+
}
|
277
|
+
|
278
|
+
simd32uint16 lane1_as_uint16() const {
|
279
|
+
__m256i x = _mm512_extracti32x8_epi32(i, 1);
|
280
|
+
return simd32uint16(_mm512_cvtepu8_epi16(x));
|
281
|
+
}
|
282
|
+
|
283
|
+
simd64uint8 operator+=(simd64uint8 other) {
|
284
|
+
i = _mm512_add_epi8(i, other.i);
|
285
|
+
return *this;
|
286
|
+
}
|
287
|
+
|
288
|
+
// for debugging only
|
289
|
+
uint8_t operator[](int i) const {
|
290
|
+
ALIGNED(64) uint8_t tab[64];
|
291
|
+
store(tab);
|
292
|
+
return tab[i];
|
293
|
+
}
|
294
|
+
};
|
295
|
+
|
296
|
+
} // namespace faiss
|
@@ -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.
|
@@ -168,9 +168,12 @@ static inline std::string elements_to_string(const char* fmt, const S& simd) {
|
|
168
168
|
simd.store(bytes);
|
169
169
|
char res[1000], *ptr = res;
|
170
170
|
for (size_t i = 0; i < N; ++i) {
|
171
|
-
|
171
|
+
int bytesWritten =
|
172
|
+
snprintf(ptr, sizeof(res) - (ptr - res), fmt, bytes[i]);
|
173
|
+
ptr += bytesWritten;
|
172
174
|
}
|
173
|
-
//
|
175
|
+
// The format usually contains a ',' separator so this is to remove the last
|
176
|
+
// separator.
|
174
177
|
ptr[-1] = 0;
|
175
178
|
return std::string(res);
|
176
179
|
}
|