faiss 0.6.2 → 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.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/faiss/version.rb +1 -1
  4. data/vendor/faiss/faiss/AutoTune.cpp +3 -1
  5. data/vendor/faiss/faiss/Clustering.cpp +9 -1
  6. data/vendor/faiss/faiss/IVFlib.cpp +14 -3
  7. data/vendor/faiss/faiss/Index.h +2 -2
  8. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +9 -10
  9. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +2 -3
  10. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +1 -2
  11. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +4 -5
  12. data/vendor/faiss/faiss/IndexBinaryHash.cpp +5 -9
  13. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +2 -4
  14. data/vendor/faiss/faiss/IndexEDEN.cpp +273 -0
  15. data/vendor/faiss/faiss/IndexEDEN.h +57 -0
  16. data/vendor/faiss/faiss/IndexFastScan.cpp +15 -4
  17. data/vendor/faiss/faiss/IndexFlat.cpp +13 -50
  18. data/vendor/faiss/faiss/IndexHNSW.cpp +10 -11
  19. data/vendor/faiss/faiss/IndexIDMap.cpp +16 -3
  20. data/vendor/faiss/faiss/IndexIDMap.h +2 -0
  21. data/vendor/faiss/faiss/IndexIVF.cpp +17 -6
  22. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +1 -1
  23. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -4
  24. data/vendor/faiss/faiss/IndexIVFEDEN.cpp +302 -0
  25. data/vendor/faiss/faiss/IndexIVFEDEN.h +70 -0
  26. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +5 -6
  27. data/vendor/faiss/faiss/IndexIVFFlat.cpp +3 -4
  28. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +1 -1
  29. data/vendor/faiss/faiss/IndexIVFPQ.cpp +40 -22
  30. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +0 -1
  31. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +19 -49
  32. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +180 -76
  33. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -4
  34. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +8 -6
  35. data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
  36. data/vendor/faiss/faiss/IndexLattice.cpp +5 -0
  37. data/vendor/faiss/faiss/IndexNNDescent.cpp +9 -2
  38. data/vendor/faiss/faiss/IndexNSG.cpp +7 -2
  39. data/vendor/faiss/faiss/IndexPQ.cpp +6 -8
  40. data/vendor/faiss/faiss/IndexPreTransform.cpp +15 -0
  41. data/vendor/faiss/faiss/IndexRaBitQ.cpp +2 -2
  42. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +1 -2
  43. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +5 -1
  44. data/vendor/faiss/faiss/IndexRefine.cpp +30 -1
  45. data/vendor/faiss/faiss/IndexReplicas.cpp +1 -2
  46. data/vendor/faiss/faiss/IndexShards.cpp +2 -2
  47. data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
  48. data/vendor/faiss/faiss/MetaIndexes.cpp +2 -4
  49. data/vendor/faiss/faiss/SuperKMeans.cpp +256 -240
  50. data/vendor/faiss/faiss/SuperKMeans.h +30 -0
  51. data/vendor/faiss/faiss/VectorTransform.cpp +33 -2
  52. data/vendor/faiss/faiss/clone_index.cpp +5 -0
  53. data/vendor/faiss/faiss/factory_tools.cpp +47 -4
  54. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +11 -11
  55. data/vendor/faiss/faiss/gpu/GpuIndex.h +34 -11
  56. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +47 -0
  57. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +17 -0
  58. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +16 -0
  59. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
  60. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -2
  61. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +180 -0
  62. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +1 -5
  63. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +88 -0
  64. data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h +134 -0
  65. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +2 -2
  66. data/vendor/faiss/faiss/impl/DistanceComputer.h +34 -0
  67. data/vendor/faiss/faiss/impl/EDENQuantizer.h +119 -0
  68. data/vendor/faiss/faiss/impl/HNSW.cpp +109 -152
  69. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
  70. data/vendor/faiss/faiss/impl/NSG.cpp +3 -1
  71. data/vendor/faiss/faiss/impl/Panorama.h +9 -7
  72. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +152 -84
  73. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +34 -22
  74. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +44 -36
  75. data/vendor/faiss/faiss/impl/RaBitQUtils.h +35 -0
  76. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +168 -67
  77. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +19 -0
  78. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +2 -11
  79. data/vendor/faiss/faiss/impl/ResultHandler.h +25 -31
  80. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +258 -57
  81. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +20 -0
  82. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
  83. data/vendor/faiss/faiss/impl/VisitedTable.cpp +22 -2
  84. data/vendor/faiss/faiss/impl/VisitedTable.h +20 -0
  85. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +1 -1
  86. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +4 -4
  87. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +35 -2
  88. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +1 -1
  89. data/vendor/faiss/faiss/impl/index_read.cpp +376 -36
  90. data/vendor/faiss/faiss/impl/index_write.cpp +55 -4
  91. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +8 -9
  92. data/vendor/faiss/faiss/impl/platform_macros.h +3 -1
  93. data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +284 -0
  94. data/vendor/faiss/faiss/impl/polysemous_training/dispatch.h +115 -0
  95. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +0 -1
  96. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +26 -15
  97. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +4 -4
  98. data/vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp +195 -0
  99. data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +133 -0
  100. data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +281 -0
  101. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +72 -0
  102. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +228 -0
  103. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp +882 -0
  104. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +9 -8
  105. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +85 -23
  106. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +30 -30
  107. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +4 -5
  108. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +101 -34
  109. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +136 -0
  110. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +16 -16
  111. data/vendor/faiss/faiss/impl/simd_dispatch.h +30 -9
  112. data/vendor/faiss/faiss/index_factory.cpp +32 -6
  113. data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -1
  114. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +2 -2
  115. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +19 -4
  116. data/vendor/faiss/faiss/python/python_callbacks.cpp +3 -1
  117. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +60 -0
  118. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +26 -1
  119. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +13 -0
  120. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +1 -1
  121. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +1 -1
  122. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +31 -1
  123. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +15 -2
  124. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +1 -2
  125. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +1 -1
  126. data/vendor/faiss/faiss/utils/distances.cpp +14 -2
  127. data/vendor/faiss/faiss/utils/distances_simd.cpp +4 -3
  128. data/vendor/faiss/faiss/utils/extra_distances.cpp +4 -14
  129. data/vendor/faiss/faiss/utils/extra_distances.h +1 -2
  130. data/vendor/faiss/faiss/utils/hamming.cpp +1 -1
  131. data/vendor/faiss/faiss/utils/quantize_lut.cpp +29 -8
  132. data/vendor/faiss/faiss/utils/rabitq_simd.h +202 -0
  133. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +0 -1
  134. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +263 -15
  135. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +160 -18
  136. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +245 -0
  137. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +273 -0
  138. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +92 -0
  139. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +11 -0
  140. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +143 -6
  141. data/vendor/faiss/faiss/utils/simd_levels.cpp +44 -0
  142. data/vendor/faiss/faiss/utils/simd_levels.h +14 -0
  143. data/vendor/faiss/faiss/utils/utils.cpp +9 -27
  144. metadata +16 -1
@@ -0,0 +1,228 @@
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
+ #ifdef COMPILE_SIMD_AVX512
9
+
10
+ #include <faiss/impl/EDENQuantizer.h>
11
+ #include <faiss/impl/simdlib/simdlib_avx2.h>
12
+ #include <faiss/impl/simdlib/simdlib_avx512.h>
13
+
14
+ #include <immintrin.h>
15
+
16
+ namespace faiss {
17
+
18
+ namespace eden_distance {
19
+
20
+ namespace {
21
+
22
+ constexpr int kCodeDotLUTKindHalfByte = 2;
23
+
24
+ inline __m512i load_byte_indexes_16(const uint8_t* const code[16], size_t i) {
25
+ return _mm512_set_epi32(
26
+ code[15][i],
27
+ code[14][i],
28
+ code[13][i],
29
+ code[12][i],
30
+ code[11][i],
31
+ code[10][i],
32
+ code[9][i],
33
+ code[8][i],
34
+ code[7][i],
35
+ code[6][i],
36
+ code[5][i],
37
+ code[4][i],
38
+ code[3][i],
39
+ code[2][i],
40
+ code[1][i],
41
+ code[0][i]);
42
+ }
43
+
44
+ inline __m512i load_low_half_byte_indexes_16(
45
+ const uint8_t* const code[16],
46
+ size_t i) {
47
+ return _mm512_set_epi32(
48
+ code[15][i] & 0x0f,
49
+ code[14][i] & 0x0f,
50
+ code[13][i] & 0x0f,
51
+ code[12][i] & 0x0f,
52
+ code[11][i] & 0x0f,
53
+ code[10][i] & 0x0f,
54
+ code[9][i] & 0x0f,
55
+ code[8][i] & 0x0f,
56
+ code[7][i] & 0x0f,
57
+ code[6][i] & 0x0f,
58
+ code[5][i] & 0x0f,
59
+ code[4][i] & 0x0f,
60
+ code[3][i] & 0x0f,
61
+ code[2][i] & 0x0f,
62
+ code[1][i] & 0x0f,
63
+ code[0][i] & 0x0f);
64
+ }
65
+
66
+ inline __m512i load_high_half_byte_indexes_16(
67
+ const uint8_t* const code[16],
68
+ size_t i) {
69
+ return _mm512_set_epi32(
70
+ 16 + (code[15][i] >> 4),
71
+ 16 + (code[14][i] >> 4),
72
+ 16 + (code[13][i] >> 4),
73
+ 16 + (code[12][i] >> 4),
74
+ 16 + (code[11][i] >> 4),
75
+ 16 + (code[10][i] >> 4),
76
+ 16 + (code[9][i] >> 4),
77
+ 16 + (code[8][i] >> 4),
78
+ 16 + (code[7][i] >> 4),
79
+ 16 + (code[6][i] >> 4),
80
+ 16 + (code[5][i] >> 4),
81
+ 16 + (code[4][i] >> 4),
82
+ 16 + (code[3][i] >> 4),
83
+ 16 + (code[2][i] >> 4),
84
+ 16 + (code[1][i] >> 4),
85
+ 16 + (code[0][i] >> 4));
86
+ }
87
+
88
+ inline __m512i load_byte_indexes_8(const uint8_t* const code[8], size_t i) {
89
+ const __m256i indexes = _mm256_setr_epi32(
90
+ code[0][i],
91
+ code[1][i],
92
+ code[2][i],
93
+ code[3][i],
94
+ code[4][i],
95
+ code[5][i],
96
+ code[6][i],
97
+ code[7][i]);
98
+ return _mm512_castsi256_si512(indexes);
99
+ }
100
+
101
+ inline __m512 gather_lower_8_lanes(const float* table, __m512i indexes) {
102
+ constexpr __mmask16 active_lanes = 0x00ff;
103
+ return _mm512_mask_i32gather_ps(
104
+ _mm512_setzero_ps(), active_lanes, indexes, table, 4);
105
+ }
106
+
107
+ inline __m512i load_half_byte_indexes_8(
108
+ const uint8_t* const code[8],
109
+ size_t i) {
110
+ return _mm512_set_epi32(
111
+ 16 + (code[7][i] >> 4),
112
+ 16 + (code[6][i] >> 4),
113
+ 16 + (code[5][i] >> 4),
114
+ 16 + (code[4][i] >> 4),
115
+ 16 + (code[3][i] >> 4),
116
+ 16 + (code[2][i] >> 4),
117
+ 16 + (code[1][i] >> 4),
118
+ 16 + (code[0][i] >> 4),
119
+ code[7][i] & 0x0f,
120
+ code[6][i] & 0x0f,
121
+ code[5][i] & 0x0f,
122
+ code[4][i] & 0x0f,
123
+ code[3][i] & 0x0f,
124
+ code[2][i] & 0x0f,
125
+ code[1][i] & 0x0f,
126
+ code[0][i] & 0x0f);
127
+ }
128
+
129
+ inline __m512i load_byte_pair_indexes_8(
130
+ const uint8_t* const code[8],
131
+ size_t i) {
132
+ return _mm512_set_epi32(
133
+ 256 + code[7][i + 1],
134
+ 256 + code[6][i + 1],
135
+ 256 + code[5][i + 1],
136
+ 256 + code[4][i + 1],
137
+ 256 + code[3][i + 1],
138
+ 256 + code[2][i + 1],
139
+ 256 + code[1][i + 1],
140
+ 256 + code[0][i + 1],
141
+ code[7][i],
142
+ code[6][i],
143
+ code[5][i],
144
+ code[4][i],
145
+ code[3][i],
146
+ code[2][i],
147
+ code[1][i],
148
+ code[0][i]);
149
+ }
150
+
151
+ } // namespace
152
+
153
+ void compute_code_dot_lut_batch_8_avx512(
154
+ const uint8_t* const code[8],
155
+ const float* lut,
156
+ int lut_kind,
157
+ size_t packed_size,
158
+ float dots[8]) {
159
+ __m512 acc = _mm512_setzero_ps();
160
+
161
+ if (lut_kind == kCodeDotLUTKindHalfByte) {
162
+ for (size_t i = 0; i < packed_size; i++) {
163
+ acc = _mm512_add_ps(
164
+ acc,
165
+ _mm512_i32gather_ps(
166
+ load_half_byte_indexes_8(code, i), lut, 4));
167
+ lut += 32;
168
+ }
169
+ } else {
170
+ size_t i = 0;
171
+ for (; i + 1 < packed_size; i += 2) {
172
+ acc = _mm512_add_ps(
173
+ acc,
174
+ _mm512_i32gather_ps(
175
+ load_byte_pair_indexes_8(code, i), lut, 4));
176
+ lut += 512;
177
+ }
178
+ if (i < packed_size) {
179
+ acc = _mm512_add_ps(
180
+ acc,
181
+ gather_lower_8_lanes(lut, load_byte_indexes_8(code, i)));
182
+ }
183
+ }
184
+
185
+ alignas(64) float lanes[16];
186
+ _mm512_store_ps(lanes, acc);
187
+ for (size_t i = 0; i < 8; i++) {
188
+ dots[i] = lanes[i] + lanes[i + 8];
189
+ }
190
+ }
191
+
192
+ void compute_code_dot_lut_batch_16_avx512(
193
+ const uint8_t* const code[16],
194
+ const float* lut,
195
+ int lut_kind,
196
+ size_t packed_size,
197
+ float dots[16]) {
198
+ __m512 acc = _mm512_setzero_ps();
199
+
200
+ if (lut_kind == kCodeDotLUTKindHalfByte) {
201
+ for (size_t i = 0; i < packed_size; i++) {
202
+ acc = _mm512_add_ps(
203
+ acc,
204
+ _mm512_i32gather_ps(
205
+ load_low_half_byte_indexes_16(code, i), lut, 4));
206
+ acc = _mm512_add_ps(
207
+ acc,
208
+ _mm512_i32gather_ps(
209
+ load_high_half_byte_indexes_16(code, i), lut, 4));
210
+ lut += 32;
211
+ }
212
+ } else {
213
+ for (size_t i = 0; i < packed_size; i++) {
214
+ acc = _mm512_add_ps(
215
+ acc,
216
+ _mm512_i32gather_ps(load_byte_indexes_16(code, i), lut, 4));
217
+ lut += 256;
218
+ }
219
+ }
220
+
221
+ _mm512_storeu_ps(dots, acc);
222
+ }
223
+
224
+ } // namespace eden_distance
225
+
226
+ } // namespace faiss
227
+
228
+ #endif