faiss 0.6.1 → 0.6.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/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +3 -1
- data/vendor/faiss/faiss/Clustering.cpp +9 -1
- data/vendor/faiss/faiss/IVFlib.cpp +14 -3
- data/vendor/faiss/faiss/Index.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +9 -10
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +1 -2
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +10 -12
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +5 -9
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +5 -7
- data/vendor/faiss/faiss/IndexEDEN.cpp +273 -0
- data/vendor/faiss/faiss/IndexEDEN.h +57 -0
- data/vendor/faiss/faiss/IndexFastScan.cpp +15 -4
- data/vendor/faiss/faiss/IndexFlat.cpp +13 -50
- data/vendor/faiss/faiss/IndexHNSW.cpp +177 -148
- data/vendor/faiss/faiss/IndexIDMap.cpp +16 -3
- data/vendor/faiss/faiss/IndexIDMap.h +2 -0
- data/vendor/faiss/faiss/IndexIVF.cpp +19 -8
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -4
- data/vendor/faiss/faiss/IndexIVFEDEN.cpp +302 -0
- data/vendor/faiss/faiss/IndexIVFEDEN.h +70 -0
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +5 -6
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +6 -5
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +1 -1
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +42 -25
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +0 -1
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +23 -62
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +180 -76
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -4
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +8 -6
- data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
- data/vendor/faiss/faiss/IndexLattice.cpp +5 -0
- data/vendor/faiss/faiss/IndexNNDescent.cpp +10 -3
- data/vendor/faiss/faiss/IndexNSG.cpp +8 -4
- data/vendor/faiss/faiss/IndexPQ.cpp +6 -8
- data/vendor/faiss/faiss/IndexPreTransform.cpp +15 -0
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +2 -2
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +1 -2
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +5 -1
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -1
- data/vendor/faiss/faiss/IndexReplicas.cpp +1 -2
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +68 -6
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
- data/vendor/faiss/faiss/IndexShards.cpp +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
- data/vendor/faiss/faiss/MetaIndexes.cpp +2 -4
- data/vendor/faiss/faiss/SuperKMeans.cpp +256 -240
- data/vendor/faiss/faiss/SuperKMeans.h +30 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +33 -2
- data/vendor/faiss/faiss/clone_index.cpp +5 -0
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
- data/vendor/faiss/faiss/factory_tools.cpp +51 -4
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +11 -11
- data/vendor/faiss/faiss/gpu/GpuIndex.h +34 -11
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +47 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +17 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +16 -0
- data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +11 -12
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +3 -3
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +180 -0
- data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +7 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +177 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +88 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +48 -3
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h +193 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h +134 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +2 -2
- data/vendor/faiss/faiss/impl/DistanceComputer.h +34 -0
- data/vendor/faiss/faiss/impl/EDENQuantizer.h +119 -0
- data/vendor/faiss/faiss/impl/HNSW.cpp +658 -344
- data/vendor/faiss/faiss/impl/HNSW.h +51 -13
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +18 -12
- data/vendor/faiss/faiss/impl/Panorama.h +20 -7
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +152 -84
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +59 -24
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +45 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +35 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +175 -68
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +19 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +2 -11
- data/vendor/faiss/faiss/impl/ResultHandler.h +26 -31
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +522 -58
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +70 -0
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +33 -13
- data/vendor/faiss/faiss/impl/VisitedTable.h +88 -33
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +1 -1
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +4 -4
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +38 -3
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +1 -1
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +35 -43
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -15
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +86 -40
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +81 -50
- data/vendor/faiss/faiss/impl/index_read.cpp +476 -75
- data/vendor/faiss/faiss/impl/index_write.cpp +56 -4
- data/vendor/faiss/faiss/impl/io_macros.h +25 -0
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +8 -9
- data/vendor/faiss/faiss/impl/platform_macros.h +15 -9
- data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +284 -0
- data/vendor/faiss/faiss/impl/polysemous_training/dispatch.h +115 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +0 -1
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +26 -15
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +6 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +2 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +2 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +20 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +36 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +2 -0
- data/vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp +195 -0
- data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +133 -0
- data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +281 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +72 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +228 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp +882 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +6 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +336 -26
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +331 -32
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +558 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +284 -45
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +502 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +157 -32
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +86 -8
- data/vendor/faiss/faiss/index_factory.cpp +37 -7
- data/vendor/faiss/faiss/index_io.h +16 -0
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +5 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +15 -15
- data/vendor/faiss/faiss/invlists/InvertedLists.h +2 -2
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +19 -4
- data/vendor/faiss/faiss/python/python_callbacks.cpp +3 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +60 -0
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +26 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +13 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +150 -23
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +30 -7
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +65 -25
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +3 -2
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +1 -1
- data/vendor/faiss/faiss/utils/bf16.h +34 -0
- data/vendor/faiss/faiss/utils/distances.cpp +14 -2
- data/vendor/faiss/faiss/utils/distances_simd.cpp +4 -4
- data/vendor/faiss/faiss/utils/extra_distances.cpp +4 -14
- data/vendor/faiss/faiss/utils/extra_distances.h +1 -2
- data/vendor/faiss/faiss/utils/hamming.cpp +9 -9
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +2 -1
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +6 -30
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +0 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +29 -8
- data/vendor/faiss/faiss/utils/rabitq_simd.h +202 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +0 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +263 -15
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +160 -18
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +14 -68
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +245 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +273 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +435 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +11 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +143 -6
- data/vendor/faiss/faiss/utils/simd_levels.cpp +56 -2
- data/vendor/faiss/faiss/utils/simd_levels.h +14 -0
- data/vendor/faiss/faiss/utils/utils.cpp +9 -27
- metadata +27 -2
|
@@ -20,6 +20,10 @@ SIMDLevel SIMDConfig::level = SIMDLevel::NONE;
|
|
|
20
20
|
// Bitmask of supported SIMD levels (1 << SIMDLevel)
|
|
21
21
|
uint64_t SIMDConfig::supported_simd_levels = 0;
|
|
22
22
|
|
|
23
|
+
// Microarchitecture flags (x86). Default false; set by
|
|
24
|
+
// detect_x86_uarch_flags() at load time.
|
|
25
|
+
bool SIMDConfig::avx512_split = false;
|
|
26
|
+
|
|
23
27
|
// ARM SVE runtime detection
|
|
24
28
|
#if defined(__aarch64__) || defined(_M_ARM64)
|
|
25
29
|
|
|
@@ -53,6 +57,43 @@ static bool has_sve() {
|
|
|
53
57
|
}
|
|
54
58
|
#endif
|
|
55
59
|
|
|
60
|
+
// Detect x86 microarchitecture flags used for kernel routing. Uses raw
|
|
61
|
+
// cpuid so it is safe to run on any CPU regardless of compiled SIMD level.
|
|
62
|
+
#if defined(__x86_64__)
|
|
63
|
+
namespace {
|
|
64
|
+
void detect_x86_uarch_flags() {
|
|
65
|
+
unsigned int eax, ebx, ecx, edx;
|
|
66
|
+
|
|
67
|
+
// Vendor string (CPUID.0): "AuthenticAMD" is EBX="Auth", EDX="enti",
|
|
68
|
+
// ECX="cAMD".
|
|
69
|
+
eax = 0;
|
|
70
|
+
ecx = 0;
|
|
71
|
+
asm volatile("cpuid"
|
|
72
|
+
: "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
|
|
73
|
+
: "a"(eax), "c"(ecx));
|
|
74
|
+
const bool is_amd =
|
|
75
|
+
ebx == 0x68747541u && edx == 0x69746e65u && ecx == 0x444d4163u;
|
|
76
|
+
|
|
77
|
+
// Family/model (CPUID.1 EAX).
|
|
78
|
+
eax = 1;
|
|
79
|
+
ecx = 0;
|
|
80
|
+
asm volatile("cpuid"
|
|
81
|
+
: "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
|
|
82
|
+
: "a"(eax), "c"(ecx));
|
|
83
|
+
const unsigned int base_family = (eax >> 8) & 0xfu;
|
|
84
|
+
const unsigned int display_family =
|
|
85
|
+
base_family + (base_family == 0xfu ? ((eax >> 20) & 0xffu) : 0u);
|
|
86
|
+
// AMD Zen 4 / Zen 4c (Bergamo) is family 0x19 and splits AVX-512.
|
|
87
|
+
// (Zen 5, family 0x1A, has a native 512-bit datapath and is excluded.)
|
|
88
|
+
SIMDConfig::avx512_split = is_amd && display_family == 0x19u;
|
|
89
|
+
}
|
|
90
|
+
} // namespace
|
|
91
|
+
#else
|
|
92
|
+
namespace {
|
|
93
|
+
void detect_x86_uarch_flags() {}
|
|
94
|
+
} // namespace
|
|
95
|
+
#endif
|
|
96
|
+
|
|
56
97
|
#ifdef FAISS_ENABLE_DD
|
|
57
98
|
|
|
58
99
|
// =============================================================================
|
|
@@ -101,6 +142,8 @@ bool SIMDConfig::is_simd_level_available(SIMDLevel l) {
|
|
|
101
142
|
SIMDLevel SIMDConfig::auto_detect_simd_level() {
|
|
102
143
|
SIMDLevel detected_level = SIMDLevel::NONE;
|
|
103
144
|
|
|
145
|
+
detect_x86_uarch_flags();
|
|
146
|
+
|
|
104
147
|
#if defined(__x86_64__) && \
|
|
105
148
|
(defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_AVX512))
|
|
106
149
|
unsigned int eax, ebx, ecx, edx;
|
|
@@ -129,6 +172,9 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
|
|
|
129
172
|
asm volatile("cpuid"
|
|
130
173
|
: "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
|
|
131
174
|
: "a"(eax), "c"(ecx));
|
|
175
|
+
// Save EDX before xgetbv clobbers it — needed for
|
|
176
|
+
// AVX512_FP16 check (bit 23) in the SPR detection below.
|
|
177
|
+
unsigned int cpuid7_edx = edx;
|
|
132
178
|
|
|
133
179
|
unsigned int xcr0;
|
|
134
180
|
asm volatile("xgetbv" : "=a"(xcr0), "=d"(edx) : "c"(0));
|
|
@@ -155,8 +201,15 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
|
|
|
155
201
|
(1 << static_cast<int>(SIMDLevel::AVX512));
|
|
156
202
|
|
|
157
203
|
#if defined(COMPILE_SIMD_AVX512_SPR)
|
|
158
|
-
// Check for Sapphire Rapids features
|
|
204
|
+
// Check for Sapphire Rapids features.
|
|
205
|
+
// The SPR code path is compiled with -mavx512fp16, so we
|
|
206
|
+
// must verify both AVX512_BF16 and AVX512_FP16 before
|
|
207
|
+
// dispatching to it. AMD Zen 4 (bergamo) has BF16 but
|
|
208
|
+
// not FP16 — using SPR code there causes SIGILL.
|
|
159
209
|
// CPUID EAX=7, ECX=1: EAX bit 5 = AVX512_BF16
|
|
210
|
+
// CPUID EAX=7, ECX=0: EDX bit 23 = AVX512_FP16
|
|
211
|
+
// (Linux: X86_FEATURE_AVX512_FP16 = 18*32+23)
|
|
212
|
+
bool has_avx512_fp16 = (cpuid7_edx & (1 << 23)) != 0;
|
|
160
213
|
unsigned int eax1, ebx1, ecx1, edx1;
|
|
161
214
|
eax1 = 7;
|
|
162
215
|
ecx1 = 1;
|
|
@@ -164,7 +217,7 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
|
|
|
164
217
|
: "=a"(eax1), "=b"(ebx1), "=c"(ecx1), "=d"(edx1)
|
|
165
218
|
: "a"(eax1), "c"(ecx1));
|
|
166
219
|
bool has_avx512_bf16 = (eax1 & (1 << 5)) != 0;
|
|
167
|
-
if (has_avx512_bf16) {
|
|
220
|
+
if (has_avx512_bf16 && has_avx512_fp16) {
|
|
168
221
|
detected_level = SIMDLevel::AVX512_SPR;
|
|
169
222
|
supported_simd_levels |=
|
|
170
223
|
(1 << static_cast<int>(SIMDLevel::AVX512_SPR));
|
|
@@ -254,6 +307,7 @@ bool SIMDConfig::is_simd_level_available(SIMDLevel l) {
|
|
|
254
307
|
}
|
|
255
308
|
|
|
256
309
|
SIMDLevel SIMDConfig::auto_detect_simd_level() {
|
|
310
|
+
detect_x86_uarch_flags();
|
|
257
311
|
// In static mode, return the compiled-in level
|
|
258
312
|
#if defined(COMPILE_SIMD_AVX512_SPR)
|
|
259
313
|
return SIMDLevel::AVX512_SPR;
|
|
@@ -161,8 +161,22 @@ struct FAISS_API SIMDConfig {
|
|
|
161
161
|
/// Returns bitmask of supported SIMD levels (1 << SIMDLevel).
|
|
162
162
|
static uint64_t supported_simd_levels;
|
|
163
163
|
|
|
164
|
+
/// CPU implements AVX-512 by splitting over a 256-bit datapath
|
|
165
|
+
/// (AMD Zen 4 / Zen 4c "Bergamo", family 0x19). On such CPUs 512-bit
|
|
166
|
+
/// ops give no throughput gain, so the fast-scan QBS path prefers the
|
|
167
|
+
/// 256-bit kernel.
|
|
168
|
+
static bool avx512_split;
|
|
169
|
+
|
|
164
170
|
static SIMDLevel auto_detect_simd_level();
|
|
165
171
|
|
|
172
|
+
static constexpr bool has_dynamic_dispatch() {
|
|
173
|
+
#ifdef FAISS_ENABLE_DD
|
|
174
|
+
return true;
|
|
175
|
+
#else
|
|
176
|
+
return false;
|
|
177
|
+
#endif
|
|
178
|
+
}
|
|
179
|
+
|
|
166
180
|
SIMDConfig(const char** faiss_simd_level_env = nullptr);
|
|
167
181
|
|
|
168
182
|
/// Set the SIMD level. Throws FaissException if level is not supported.
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
#include <algorithm>
|
|
31
31
|
#include <set>
|
|
32
32
|
#include <type_traits>
|
|
33
|
+
#include <unordered_set>
|
|
33
34
|
#include <vector>
|
|
34
35
|
|
|
35
36
|
#include <faiss/impl/AuxIndexStructures.h>
|
|
@@ -362,39 +363,20 @@ size_t ranklist_intersection_size(
|
|
|
362
363
|
const int64_t* v2_in) {
|
|
363
364
|
if (k2 > k1)
|
|
364
365
|
return ranklist_intersection_size(k2, v2_in, k1, v1);
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
for (size_t i = 0; i < k2; i++) {
|
|
372
|
-
if (v2[i] != prev) {
|
|
373
|
-
v2[wp++] = prev = v2[i];
|
|
374
|
-
}
|
|
366
|
+
// erase-on-hit avoids double-counting; negatives are padding, not IDs
|
|
367
|
+
std::unordered_set<int64_t> remaining;
|
|
368
|
+
remaining.reserve(k2);
|
|
369
|
+
for (size_t i = 0; i < k2; i++) {
|
|
370
|
+
if (v2_in[i] >= 0) {
|
|
371
|
+
remaining.insert(v2_in[i]);
|
|
375
372
|
}
|
|
376
|
-
k2 = wp;
|
|
377
373
|
}
|
|
378
|
-
const int64_t seen_flag = int64_t{1} << 60;
|
|
379
374
|
size_t count = 0;
|
|
380
375
|
for (size_t i = 0; i < k1; i++) {
|
|
381
|
-
|
|
382
|
-
size_t i0 = 0, i1 = k2;
|
|
383
|
-
while (i0 + 1 < i1) {
|
|
384
|
-
size_t imed = (i1 + i0) / 2;
|
|
385
|
-
int64_t piv = v2[imed] & ~seen_flag;
|
|
386
|
-
if (piv <= q)
|
|
387
|
-
i0 = imed;
|
|
388
|
-
else
|
|
389
|
-
i1 = imed;
|
|
390
|
-
}
|
|
391
|
-
if (v2[i0] == q) {
|
|
376
|
+
if (remaining.erase(v1[i]) != 0) {
|
|
392
377
|
count++;
|
|
393
|
-
v2[i0] |= seen_flag;
|
|
394
378
|
}
|
|
395
379
|
}
|
|
396
|
-
delete[] v2;
|
|
397
|
-
|
|
398
380
|
return count;
|
|
399
381
|
}
|
|
400
382
|
|
|
@@ -462,7 +444,7 @@ uint64_t ivec_checksum(size_t n, const int32_t* assigned) {
|
|
|
462
444
|
uint64_t bvec_checksum(size_t n, const uint8_t* a) {
|
|
463
445
|
uint64_t cs = ivec_checksum(n / 4, (const int32_t*)a);
|
|
464
446
|
for (size_t i = n / 4 * 4; i < n; i++) {
|
|
465
|
-
cs = cs * 65713 + a[
|
|
447
|
+
cs = cs * 65713 + a[i] * 1686049;
|
|
466
448
|
}
|
|
467
449
|
return cs;
|
|
468
450
|
}
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: faiss
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.6.
|
|
4
|
+
version: 0.6.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrew Kane
|
|
@@ -85,6 +85,8 @@ files:
|
|
|
85
85
|
- vendor/faiss/faiss/IndexBinaryHash.h
|
|
86
86
|
- vendor/faiss/faiss/IndexBinaryIVF.cpp
|
|
87
87
|
- vendor/faiss/faiss/IndexBinaryIVF.h
|
|
88
|
+
- vendor/faiss/faiss/IndexEDEN.cpp
|
|
89
|
+
- vendor/faiss/faiss/IndexEDEN.h
|
|
88
90
|
- vendor/faiss/faiss/IndexFastScan.cpp
|
|
89
91
|
- vendor/faiss/faiss/IndexFastScan.h
|
|
90
92
|
- vendor/faiss/faiss/IndexFlat.cpp
|
|
@@ -101,6 +103,8 @@ files:
|
|
|
101
103
|
- vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h
|
|
102
104
|
- vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp
|
|
103
105
|
- vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h
|
|
106
|
+
- vendor/faiss/faiss/IndexIVFEDEN.cpp
|
|
107
|
+
- vendor/faiss/faiss/IndexIVFEDEN.h
|
|
104
108
|
- vendor/faiss/faiss/IndexIVFFastScan.cpp
|
|
105
109
|
- vendor/faiss/faiss/IndexIVFFastScan.h
|
|
106
110
|
- vendor/faiss/faiss/IndexIVFFlat.cpp
|
|
@@ -233,12 +237,18 @@ files:
|
|
|
233
237
|
- vendor/faiss/faiss/gpu/utils/Timer.h
|
|
234
238
|
- vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h
|
|
235
239
|
- vendor/faiss/faiss/gpu_metal/MetalCloner.h
|
|
240
|
+
- vendor/faiss/faiss/gpu_metal/MetalDistance.h
|
|
236
241
|
- vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h
|
|
237
242
|
- vendor/faiss/faiss/gpu_metal/MetalIndex.h
|
|
238
243
|
- vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h
|
|
244
|
+
- vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h
|
|
245
|
+
- vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h
|
|
239
246
|
- vendor/faiss/faiss/gpu_metal/MetalKernels.h
|
|
247
|
+
- vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h
|
|
240
248
|
- vendor/faiss/faiss/gpu_metal/MetalResources.h
|
|
241
249
|
- vendor/faiss/faiss/gpu_metal/StandardMetalResources.h
|
|
250
|
+
- vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h
|
|
251
|
+
- vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h
|
|
242
252
|
- vendor/faiss/faiss/impl/AdSampling.cpp
|
|
243
253
|
- vendor/faiss/faiss/impl/AdSampling.h
|
|
244
254
|
- vendor/faiss/faiss/impl/AdditiveQuantizer.cpp
|
|
@@ -254,6 +264,7 @@ files:
|
|
|
254
264
|
- vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp
|
|
255
265
|
- vendor/faiss/faiss/impl/CodePackerRaBitQ.h
|
|
256
266
|
- vendor/faiss/faiss/impl/DistanceComputer.h
|
|
267
|
+
- vendor/faiss/faiss/impl/EDENQuantizer.h
|
|
257
268
|
- vendor/faiss/faiss/impl/FaissAssert.h
|
|
258
269
|
- vendor/faiss/faiss/impl/FaissException.cpp
|
|
259
270
|
- vendor/faiss/faiss/impl/FaissException.h
|
|
@@ -352,6 +363,8 @@ files:
|
|
|
352
363
|
- vendor/faiss/faiss/impl/mapped_io.h
|
|
353
364
|
- vendor/faiss/faiss/impl/maybe_owned_vector.h
|
|
354
365
|
- vendor/faiss/faiss/impl/platform_macros.h
|
|
366
|
+
- vendor/faiss/faiss/impl/polysemous_training/avx512.cpp
|
|
367
|
+
- vendor/faiss/faiss/impl/polysemous_training/dispatch.h
|
|
355
368
|
- vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h
|
|
356
369
|
- vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp
|
|
357
370
|
- vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h
|
|
@@ -365,15 +378,24 @@ files:
|
|
|
365
378
|
- vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h
|
|
366
379
|
- vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h
|
|
367
380
|
- vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp
|
|
381
|
+
- vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h
|
|
368
382
|
- vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp
|
|
369
383
|
- vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp
|
|
370
384
|
- vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h
|
|
385
|
+
- vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp
|
|
386
|
+
- vendor/faiss/faiss/impl/result_handler/avx2.cpp
|
|
387
|
+
- vendor/faiss/faiss/impl/result_handler/avx512.cpp
|
|
388
|
+
- vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp
|
|
389
|
+
- vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp
|
|
390
|
+
- vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp
|
|
371
391
|
- vendor/faiss/faiss/impl/scalar_quantizer/codecs.h
|
|
372
392
|
- vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h
|
|
373
393
|
- vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h
|
|
374
394
|
- vendor/faiss/faiss/impl/scalar_quantizer/scanners.h
|
|
375
395
|
- vendor/faiss/faiss/impl/scalar_quantizer/similarities.h
|
|
376
396
|
- vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp
|
|
397
|
+
- vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h
|
|
398
|
+
- vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp
|
|
377
399
|
- vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp
|
|
378
400
|
- vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h
|
|
379
401
|
- vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp
|
|
@@ -453,8 +475,10 @@ files:
|
|
|
453
475
|
- vendor/faiss/faiss/utils/hamming_distance/common.h
|
|
454
476
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp
|
|
455
477
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp
|
|
478
|
+
- vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp
|
|
456
479
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h
|
|
457
480
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h
|
|
481
|
+
- vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h
|
|
458
482
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h
|
|
459
483
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h
|
|
460
484
|
- vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h
|
|
@@ -489,6 +513,7 @@ files:
|
|
|
489
513
|
- vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h
|
|
490
514
|
- vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp
|
|
491
515
|
- vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp
|
|
516
|
+
- vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp
|
|
492
517
|
- vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp
|
|
493
518
|
- vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp
|
|
494
519
|
- vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h
|
|
@@ -521,7 +546,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
521
546
|
- !ruby/object:Gem::Version
|
|
522
547
|
version: '0'
|
|
523
548
|
requirements: []
|
|
524
|
-
rubygems_version: 4.0.
|
|
549
|
+
rubygems_version: 4.0.14
|
|
525
550
|
specification_version: 4
|
|
526
551
|
summary: Efficient similarity search and clustering for Ruby
|
|
527
552
|
test_files: []
|