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.
|
@@ -32,6 +32,9 @@ struct ScalarQuantizer : Quantizer {
|
|
32
32
|
QT_fp16,
|
33
33
|
QT_8bit_direct, ///< fast indexing of uint8s
|
34
34
|
QT_6bit, ///< 6 bits per component
|
35
|
+
QT_bf16,
|
36
|
+
QT_8bit_direct_signed, ///< fast indexing of signed int8s ranging from
|
37
|
+
///< [-128 to 127]
|
35
38
|
};
|
36
39
|
|
37
40
|
QuantizerType qtype = QT_8bit;
|
@@ -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.
|
@@ -16,6 +16,11 @@
|
|
16
16
|
#include <faiss/impl/ProductQuantizer.h>
|
17
17
|
#include <faiss/impl/code_distance/code_distance-generic.h>
|
18
18
|
|
19
|
+
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78782
|
20
|
+
#if defined(__GNUC__) && __GNUC__ < 9
|
21
|
+
#define _mm_loadu_si64(x) (_mm_loadl_epi64((__m128i_u*)x))
|
22
|
+
#endif
|
23
|
+
|
19
24
|
namespace {
|
20
25
|
|
21
26
|
inline float horizontal_sum(const __m128 v) {
|
@@ -0,0 +1,248 @@
|
|
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 __AVX512F__
|
11
|
+
|
12
|
+
#include <immintrin.h>
|
13
|
+
|
14
|
+
#include <type_traits>
|
15
|
+
|
16
|
+
#include <faiss/impl/ProductQuantizer.h>
|
17
|
+
#include <faiss/impl/code_distance/code_distance-generic.h>
|
18
|
+
|
19
|
+
namespace faiss {
|
20
|
+
|
21
|
+
// According to experiments, the AVX-512 version may be SLOWER than
|
22
|
+
// the AVX2 version, which is somewhat unexpected.
|
23
|
+
// This version is not used for now, but it may be used later.
|
24
|
+
//
|
25
|
+
// TODO: test for AMD CPUs.
|
26
|
+
|
27
|
+
template <typename PQDecoderT>
|
28
|
+
typename std::enable_if<!std::is_same<PQDecoderT, PQDecoder8>::value, float>::
|
29
|
+
type inline distance_single_code_avx512(
|
30
|
+
// number of subquantizers
|
31
|
+
const size_t M,
|
32
|
+
// number of bits per quantization index
|
33
|
+
const size_t nbits,
|
34
|
+
// precomputed distances, layout (M, ksub)
|
35
|
+
const float* sim_table,
|
36
|
+
const uint8_t* code) {
|
37
|
+
// default implementation
|
38
|
+
return distance_single_code_generic<PQDecoderT>(M, nbits, sim_table, code);
|
39
|
+
}
|
40
|
+
|
41
|
+
template <typename PQDecoderT>
|
42
|
+
typename std::enable_if<std::is_same<PQDecoderT, PQDecoder8>::value, float>::
|
43
|
+
type inline distance_single_code_avx512(
|
44
|
+
// number of subquantizers
|
45
|
+
const size_t M,
|
46
|
+
// number of bits per quantization index
|
47
|
+
const size_t nbits,
|
48
|
+
// precomputed distances, layout (M, ksub)
|
49
|
+
const float* sim_table,
|
50
|
+
const uint8_t* code0) {
|
51
|
+
float result0 = 0;
|
52
|
+
constexpr size_t ksub = 1 << 8;
|
53
|
+
|
54
|
+
size_t m = 0;
|
55
|
+
const size_t pqM16 = M / 16;
|
56
|
+
|
57
|
+
constexpr intptr_t N = 1;
|
58
|
+
|
59
|
+
const float* tab = sim_table;
|
60
|
+
|
61
|
+
if (pqM16 > 0) {
|
62
|
+
// process 16 values per loop
|
63
|
+
const __m512i vksub = _mm512_set1_epi32(ksub);
|
64
|
+
__m512i offsets_0 = _mm512_setr_epi32(
|
65
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
66
|
+
offsets_0 = _mm512_mullo_epi32(offsets_0, vksub);
|
67
|
+
|
68
|
+
// accumulators of partial sums
|
69
|
+
__m512 partialSums[N];
|
70
|
+
for (intptr_t j = 0; j < N; j++) {
|
71
|
+
partialSums[j] = _mm512_setzero_ps();
|
72
|
+
}
|
73
|
+
|
74
|
+
// loop
|
75
|
+
for (m = 0; m < pqM16 * 16; m += 16) {
|
76
|
+
// load 16 uint8 values
|
77
|
+
__m128i mm1[N];
|
78
|
+
mm1[0] = _mm_loadu_si128((const __m128i_u*)(code0 + m));
|
79
|
+
|
80
|
+
// process first 8 codes
|
81
|
+
for (intptr_t j = 0; j < N; j++) {
|
82
|
+
const __m512i idx1 = _mm512_cvtepu8_epi32(mm1[j]);
|
83
|
+
|
84
|
+
// add offsets
|
85
|
+
const __m512i indices_to_read_from =
|
86
|
+
_mm512_add_epi32(idx1, offsets_0);
|
87
|
+
|
88
|
+
// gather 16 values, similar to 16 operations of tab[idx]
|
89
|
+
__m512 collected = _mm512_i32gather_ps(
|
90
|
+
indices_to_read_from, tab, sizeof(float));
|
91
|
+
|
92
|
+
// collect partial sums
|
93
|
+
partialSums[j] = _mm512_add_ps(partialSums[j], collected);
|
94
|
+
}
|
95
|
+
tab += ksub * 16;
|
96
|
+
}
|
97
|
+
|
98
|
+
// horizontal sum for partialSum
|
99
|
+
result0 += _mm512_reduce_add_ps(partialSums[0]);
|
100
|
+
}
|
101
|
+
|
102
|
+
//
|
103
|
+
if (m < M) {
|
104
|
+
// process leftovers
|
105
|
+
PQDecoder8 decoder0(code0 + m, nbits);
|
106
|
+
for (; m < M; m++) {
|
107
|
+
result0 += tab[decoder0.decode()];
|
108
|
+
tab += ksub;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
return result0;
|
113
|
+
}
|
114
|
+
|
115
|
+
template <typename PQDecoderT>
|
116
|
+
typename std::enable_if<!std::is_same<PQDecoderT, PQDecoder8>::value, void>::
|
117
|
+
type
|
118
|
+
distance_four_codes_avx512(
|
119
|
+
// number of subquantizers
|
120
|
+
const size_t M,
|
121
|
+
// number of bits per quantization index
|
122
|
+
const size_t nbits,
|
123
|
+
// precomputed distances, layout (M, ksub)
|
124
|
+
const float* sim_table,
|
125
|
+
// codes
|
126
|
+
const uint8_t* __restrict code0,
|
127
|
+
const uint8_t* __restrict code1,
|
128
|
+
const uint8_t* __restrict code2,
|
129
|
+
const uint8_t* __restrict code3,
|
130
|
+
// computed distances
|
131
|
+
float& result0,
|
132
|
+
float& result1,
|
133
|
+
float& result2,
|
134
|
+
float& result3) {
|
135
|
+
distance_four_codes_generic<PQDecoderT>(
|
136
|
+
M,
|
137
|
+
nbits,
|
138
|
+
sim_table,
|
139
|
+
code0,
|
140
|
+
code1,
|
141
|
+
code2,
|
142
|
+
code3,
|
143
|
+
result0,
|
144
|
+
result1,
|
145
|
+
result2,
|
146
|
+
result3);
|
147
|
+
}
|
148
|
+
|
149
|
+
// Combines 4 operations of distance_single_code()
|
150
|
+
template <typename PQDecoderT>
|
151
|
+
typename std::enable_if<std::is_same<PQDecoderT, PQDecoder8>::value, void>::type
|
152
|
+
distance_four_codes_avx512(
|
153
|
+
// number of subquantizers
|
154
|
+
const size_t M,
|
155
|
+
// number of bits per quantization index
|
156
|
+
const size_t nbits,
|
157
|
+
// precomputed distances, layout (M, ksub)
|
158
|
+
const float* sim_table,
|
159
|
+
// codes
|
160
|
+
const uint8_t* __restrict code0,
|
161
|
+
const uint8_t* __restrict code1,
|
162
|
+
const uint8_t* __restrict code2,
|
163
|
+
const uint8_t* __restrict code3,
|
164
|
+
// computed distances
|
165
|
+
float& result0,
|
166
|
+
float& result1,
|
167
|
+
float& result2,
|
168
|
+
float& result3) {
|
169
|
+
result0 = 0;
|
170
|
+
result1 = 0;
|
171
|
+
result2 = 0;
|
172
|
+
result3 = 0;
|
173
|
+
constexpr size_t ksub = 1 << 8;
|
174
|
+
|
175
|
+
size_t m = 0;
|
176
|
+
const size_t pqM16 = M / 16;
|
177
|
+
|
178
|
+
constexpr intptr_t N = 4;
|
179
|
+
|
180
|
+
const float* tab = sim_table;
|
181
|
+
|
182
|
+
if (pqM16 > 0) {
|
183
|
+
// process 16 values per loop
|
184
|
+
const __m512i vksub = _mm512_set1_epi32(ksub);
|
185
|
+
__m512i offsets_0 = _mm512_setr_epi32(
|
186
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
187
|
+
offsets_0 = _mm512_mullo_epi32(offsets_0, vksub);
|
188
|
+
|
189
|
+
// accumulators of partial sums
|
190
|
+
__m512 partialSums[N];
|
191
|
+
for (intptr_t j = 0; j < N; j++) {
|
192
|
+
partialSums[j] = _mm512_setzero_ps();
|
193
|
+
}
|
194
|
+
|
195
|
+
// loop
|
196
|
+
for (m = 0; m < pqM16 * 16; m += 16) {
|
197
|
+
// load 16 uint8 values
|
198
|
+
__m128i mm1[N];
|
199
|
+
mm1[0] = _mm_loadu_si128((const __m128i_u*)(code0 + m));
|
200
|
+
mm1[1] = _mm_loadu_si128((const __m128i_u*)(code1 + m));
|
201
|
+
mm1[2] = _mm_loadu_si128((const __m128i_u*)(code2 + m));
|
202
|
+
mm1[3] = _mm_loadu_si128((const __m128i_u*)(code3 + m));
|
203
|
+
|
204
|
+
// process first 8 codes
|
205
|
+
for (intptr_t j = 0; j < N; j++) {
|
206
|
+
const __m512i idx1 = _mm512_cvtepu8_epi32(mm1[j]);
|
207
|
+
|
208
|
+
// add offsets
|
209
|
+
const __m512i indices_to_read_from =
|
210
|
+
_mm512_add_epi32(idx1, offsets_0);
|
211
|
+
|
212
|
+
// gather 16 values, similar to 16 operations of tab[idx]
|
213
|
+
__m512 collected = _mm512_i32gather_ps(
|
214
|
+
indices_to_read_from, tab, sizeof(float));
|
215
|
+
|
216
|
+
// collect partial sums
|
217
|
+
partialSums[j] = _mm512_add_ps(partialSums[j], collected);
|
218
|
+
}
|
219
|
+
tab += ksub * 16;
|
220
|
+
}
|
221
|
+
|
222
|
+
// horizontal sum for partialSum
|
223
|
+
result0 += _mm512_reduce_add_ps(partialSums[0]);
|
224
|
+
result1 += _mm512_reduce_add_ps(partialSums[1]);
|
225
|
+
result2 += _mm512_reduce_add_ps(partialSums[2]);
|
226
|
+
result3 += _mm512_reduce_add_ps(partialSums[3]);
|
227
|
+
}
|
228
|
+
|
229
|
+
//
|
230
|
+
if (m < M) {
|
231
|
+
// process leftovers
|
232
|
+
PQDecoder8 decoder0(code0 + m, nbits);
|
233
|
+
PQDecoder8 decoder1(code1 + m, nbits);
|
234
|
+
PQDecoder8 decoder2(code2 + m, nbits);
|
235
|
+
PQDecoder8 decoder3(code3 + m, nbits);
|
236
|
+
for (; m < M; m++) {
|
237
|
+
result0 += tab[decoder0.decode()];
|
238
|
+
result1 += tab[decoder1.decode()];
|
239
|
+
result2 += tab[decoder2.decode()];
|
240
|
+
result3 += tab[decoder3.decode()];
|
241
|
+
tab += ksub;
|
242
|
+
}
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
} // namespace faiss
|
247
|
+
|
248
|
+
#endif
|