faiss 0.2.0 → 0.2.4

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +7 -7
  5. data/ext/faiss/extconf.rb +6 -3
  6. data/ext/faiss/numo.hpp +4 -4
  7. data/ext/faiss/utils.cpp +1 -1
  8. data/ext/faiss/utils.h +1 -1
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  11. data/vendor/faiss/faiss/AutoTune.h +55 -56
  12. data/vendor/faiss/faiss/Clustering.cpp +365 -194
  13. data/vendor/faiss/faiss/Clustering.h +102 -35
  14. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  15. data/vendor/faiss/faiss/IVFlib.h +48 -51
  16. data/vendor/faiss/faiss/Index.cpp +85 -103
  17. data/vendor/faiss/faiss/Index.h +54 -48
  18. data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
  19. data/vendor/faiss/faiss/Index2Layer.h +22 -36
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
  22. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  23. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  24. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  25. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  26. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  28. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  30. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  31. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  32. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  33. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  34. data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
  35. data/vendor/faiss/faiss/IndexFlat.h +42 -59
  36. data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
  37. data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
  38. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  39. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  40. data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
  41. data/vendor/faiss/faiss/IndexIVF.h +169 -118
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
  48. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  49. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  50. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  51. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  52. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +163 -150
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
  54. data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
  55. data/vendor/faiss/faiss/IndexLSH.h +20 -38
  56. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  57. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  58. data/vendor/faiss/faiss/IndexNNDescent.cpp +229 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -82
  64. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  65. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  66. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  67. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  68. data/vendor/faiss/faiss/IndexRefine.cpp +139 -127
  69. data/vendor/faiss/faiss/IndexRefine.h +32 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
  73. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
  74. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  75. data/vendor/faiss/faiss/IndexShards.h +85 -73
  76. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  77. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  78. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  79. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  80. data/vendor/faiss/faiss/MetricType.h +7 -7
  81. data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
  82. data/vendor/faiss/faiss/VectorTransform.h +64 -89
  83. data/vendor/faiss/faiss/clone_index.cpp +78 -73
  84. data/vendor/faiss/faiss/clone_index.h +4 -9
  85. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  86. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  87. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
  88. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  89. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  90. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  91. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  92. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  93. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
  94. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  95. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  96. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  97. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  101. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  102. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  106. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  108. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  110. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  112. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  113. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  114. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  115. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  116. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  121. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  122. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  124. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  125. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  126. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  128. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  129. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  130. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  135. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  136. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  137. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  138. data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
  139. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
  142. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  144. data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
  145. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  146. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  148. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  149. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  151. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
  153. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  154. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  156. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  157. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  158. data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
  159. data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
  160. data/vendor/faiss/faiss/impl/io.cpp +76 -95
  161. data/vendor/faiss/faiss/impl/io.h +31 -41
  162. data/vendor/faiss/faiss/impl/io_macros.h +60 -29
  163. data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
  164. data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
  165. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  166. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  167. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  171. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  172. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  173. data/vendor/faiss/faiss/index_factory.cpp +619 -397
  174. data/vendor/faiss/faiss/index_factory.h +8 -6
  175. data/vendor/faiss/faiss/index_io.h +23 -26
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  177. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  178. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  179. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  180. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  181. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  183. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  185. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  186. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  187. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  188. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  189. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  190. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  191. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  192. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  193. data/vendor/faiss/faiss/utils/distances.cpp +305 -312
  194. data/vendor/faiss/faiss/utils/distances.h +170 -122
  195. data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
  196. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  197. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  198. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  199. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  200. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  201. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  202. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  203. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  204. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  205. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  206. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  207. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  208. data/vendor/faiss/faiss/utils/random.h +13 -16
  209. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  210. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  211. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  212. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  213. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  214. data/vendor/faiss/faiss/utils/utils.h +54 -49
  215. metadata +29 -4
@@ -13,9 +13,8 @@
13
13
 
14
14
  #pragma once
15
15
 
16
- #include <random>
17
16
  #include <stdint.h>
18
-
17
+ #include <random>
19
18
 
20
19
  namespace faiss {
21
20
 
@@ -25,36 +24,34 @@ namespace faiss {
25
24
 
26
25
  /// random generator that can be used in multithreaded contexts
27
26
  struct RandomGenerator {
28
-
29
27
  std::mt19937 mt;
30
28
 
31
29
  /// random positive integer
32
- int rand_int ();
30
+ int rand_int();
33
31
 
34
32
  /// random int64_t
35
- int64_t rand_int64 ();
33
+ int64_t rand_int64();
36
34
 
37
35
  /// generate random integer between 0 and max-1
38
- int rand_int (int max);
36
+ int rand_int(int max);
39
37
 
40
38
  /// between 0 and 1
41
- float rand_float ();
39
+ float rand_float();
42
40
 
43
- double rand_double ();
41
+ double rand_double();
44
42
 
45
- explicit RandomGenerator (int64_t seed = 1234);
43
+ explicit RandomGenerator(int64_t seed = 1234);
46
44
  };
47
45
 
48
46
  /* Generate an array of uniform random floats / multi-threaded implementation */
49
- void float_rand (float * x, size_t n, int64_t seed);
50
- void float_randn (float * x, size_t n, int64_t seed);
51
- void int64_rand (int64_t * x, size_t n, int64_t seed);
52
- void byte_rand (uint8_t * x, size_t n, int64_t seed);
47
+ void float_rand(float* x, size_t n, int64_t seed);
48
+ void float_randn(float* x, size_t n, int64_t seed);
49
+ void int64_rand(int64_t* x, size_t n, int64_t seed);
50
+ void byte_rand(uint8_t* x, size_t n, int64_t seed);
53
51
  // max is actually the maximum value + 1
54
- void int64_rand_max (int64_t * x, size_t n, uint64_t max, int64_t seed);
52
+ void int64_rand_max(int64_t* x, size_t n, uint64_t max, int64_t seed);
55
53
 
56
54
  /* random permutation */
57
- void rand_perm (int * perm, size_t n, int64_t seed);
58
-
55
+ void rand_perm(int* perm, size_t n, int64_t seed);
59
56
 
60
57
  } // namespace faiss
@@ -7,8 +7,6 @@
7
7
 
8
8
  #pragma once
9
9
 
10
-
11
-
12
10
  /** Abstractions for 256-bit registers
13
11
  *
14
12
  * The objective is to separate the different interpretations of the same
@@ -20,6 +18,10 @@
20
18
 
21
19
  #include <faiss/utils/simdlib_avx2.h>
22
20
 
21
+ #elif defined(__aarch64__)
22
+
23
+ #include <faiss/utils/simdlib_neon.h>
24
+
23
25
  #else
24
26
 
25
27
  // emulated = all operations are implemented as scalars
@@ -7,8 +7,8 @@
7
7
 
8
8
  #pragma once
9
9
 
10
- #include <string>
11
10
  #include <cstdint>
11
+ #include <string>
12
12
 
13
13
  #include <immintrin.h>
14
14
 
@@ -16,7 +16,6 @@
16
16
 
17
17
  namespace faiss {
18
18
 
19
-
20
19
  /** Simple wrapper around the AVX 256-bit registers
21
20
  *
22
21
  * The objective is to separate the different interpretations of the same
@@ -27,36 +26,34 @@ namespace faiss {
27
26
 
28
27
  /// 256-bit representation without interpretation as a vector
29
28
  struct simd256bit {
30
-
31
- union {
29
+ union {
32
30
  __m256i i;
33
31
  __m256 f;
34
32
  };
35
33
 
36
- simd256bit() {}
34
+ simd256bit() {}
37
35
 
38
- explicit simd256bit(__m256i i): i(i) {}
36
+ explicit simd256bit(__m256i i) : i(i) {}
39
37
 
40
- explicit simd256bit(__m256 f): f(f) {}
38
+ explicit simd256bit(__m256 f) : f(f) {}
41
39
 
42
- explicit simd256bit(const void *x):
43
- i(_mm256_load_si256((__m256i const *)x))
44
- {}
40
+ explicit simd256bit(const void* x)
41
+ : i(_mm256_load_si256((__m256i const*)x)) {}
45
42
 
46
43
  void clear() {
47
44
  i = _mm256_setzero_si256();
48
45
  }
49
46
 
50
- void storeu(void *ptr) const {
51
- _mm256_storeu_si256((__m256i *)ptr, i);
47
+ void storeu(void* ptr) const {
48
+ _mm256_storeu_si256((__m256i*)ptr, i);
52
49
  }
53
50
 
54
- void loadu(const void *ptr) {
51
+ void loadu(const void* ptr) {
55
52
  i = _mm256_loadu_si256((__m256i*)ptr);
56
53
  }
57
54
 
58
- void store(void *ptr) const {
59
- _mm256_store_si256((__m256i *)ptr, i);
55
+ void store(void* ptr) const {
56
+ _mm256_store_si256((__m256i*)ptr, i);
60
57
  }
61
58
 
62
59
  void bin(char bits[257]) const {
@@ -73,30 +70,28 @@ struct simd256bit {
73
70
  bin(bits);
74
71
  return std::string(bits);
75
72
  }
76
-
77
73
  };
78
74
 
79
-
80
75
  /// vector of 16 elements in uint16
81
- struct simd16uint16: simd256bit {
76
+ struct simd16uint16 : simd256bit {
82
77
  simd16uint16() {}
83
78
 
84
- explicit simd16uint16(__m256i i): simd256bit(i) {}
79
+ explicit simd16uint16(__m256i i) : simd256bit(i) {}
85
80
 
86
- explicit simd16uint16(int x): simd256bit(_mm256_set1_epi16(x)) {}
81
+ explicit simd16uint16(int x) : simd256bit(_mm256_set1_epi16(x)) {}
87
82
 
88
- explicit simd16uint16(uint16_t x): simd256bit(_mm256_set1_epi16(x)) {}
83
+ explicit simd16uint16(uint16_t x) : simd256bit(_mm256_set1_epi16(x)) {}
89
84
 
90
- explicit simd16uint16(simd256bit x): simd256bit(x) {}
85
+ explicit simd16uint16(simd256bit x) : simd256bit(x) {}
91
86
 
92
- explicit simd16uint16(const uint16_t *x): simd256bit((const void*)x) {}
87
+ explicit simd16uint16(const uint16_t* x) : simd256bit((const void*)x) {}
93
88
 
94
- std::string elements_to_string(const char * fmt) const {
89
+ std::string elements_to_string(const char* fmt) const {
95
90
  uint16_t bytes[16];
96
91
  storeu((void*)bytes);
97
92
  char res[1000];
98
- char *ptr = res;
99
- for(int i = 0; i < 16; i++) {
93
+ char* ptr = res;
94
+ for (int i = 0; i < 16; i++) {
100
95
  ptr += sprintf(ptr, fmt, bytes[i]);
101
96
  }
102
97
  // strip last ,
@@ -117,47 +112,47 @@ struct simd16uint16: simd256bit {
117
112
  }
118
113
 
119
114
  // shift must be known at compile time
120
- simd16uint16 operator >> (const int shift) const {
115
+ simd16uint16 operator>>(const int shift) const {
121
116
  return simd16uint16(_mm256_srli_epi16(i, shift));
122
117
  }
123
118
 
124
119
  // shift must be known at compile time
125
- simd16uint16 operator << (const int shift) const {
120
+ simd16uint16 operator<<(const int shift) const {
126
121
  return simd16uint16(_mm256_slli_epi16(i, shift));
127
122
  }
128
123
 
129
- simd16uint16 operator += (simd16uint16 other) {
124
+ simd16uint16 operator+=(simd16uint16 other) {
130
125
  i = _mm256_add_epi16(i, other.i);
131
126
  return *this;
132
127
  }
133
128
 
134
- simd16uint16 operator -= (simd16uint16 other) {
129
+ simd16uint16 operator-=(simd16uint16 other) {
135
130
  i = _mm256_sub_epi16(i, other.i);
136
131
  return *this;
137
132
  }
138
133
 
139
- simd16uint16 operator + (simd16uint16 other) const {
134
+ simd16uint16 operator+(simd16uint16 other) const {
140
135
  return simd16uint16(_mm256_add_epi16(i, other.i));
141
136
  }
142
137
 
143
- simd16uint16 operator - (simd16uint16 other) const {
138
+ simd16uint16 operator-(simd16uint16 other) const {
144
139
  return simd16uint16(_mm256_sub_epi16(i, other.i));
145
140
  }
146
141
 
147
- simd16uint16 operator & (simd256bit other) const {
142
+ simd16uint16 operator&(simd256bit other) const {
148
143
  return simd16uint16(_mm256_and_si256(i, other.i));
149
144
  }
150
145
 
151
- simd16uint16 operator | (simd256bit other) const {
146
+ simd16uint16 operator|(simd256bit other) const {
152
147
  return simd16uint16(_mm256_or_si256(i, other.i));
153
148
  }
154
149
 
155
150
  // returns binary masks
156
- simd16uint16 operator == (simd256bit other) const {
151
+ simd16uint16 operator==(simd256bit other) const {
157
152
  return simd16uint16(_mm256_cmpeq_epi16(i, other.i));
158
153
  }
159
154
 
160
- simd16uint16 operator ~() const {
155
+ simd16uint16 operator~() const {
161
156
  return simd16uint16(_mm256_xor_si256(i, _mm256_set1_epi32(-1)));
162
157
  }
163
158
 
@@ -188,7 +183,7 @@ struct simd16uint16: simd256bit {
188
183
  }
189
184
 
190
185
  // for debugging only
191
- uint16_t operator [] (int i) const {
186
+ uint16_t operator[](int i) const {
192
187
  ALIGNED(32) uint16_t tab[16];
193
188
  store(tab);
194
189
  return tab[i];
@@ -201,7 +196,6 @@ struct simd16uint16: simd256bit {
201
196
  void accu_max(simd16uint16 incoming) {
202
197
  i = _mm256_max_epu16(i, incoming.i);
203
198
  }
204
-
205
199
  };
206
200
 
207
201
  // not really a std::min because it returns an elementwise min
@@ -213,13 +207,10 @@ inline simd16uint16 max(simd16uint16 a, simd16uint16 b) {
213
207
  return simd16uint16(_mm256_max_epu16(a.i, b.i));
214
208
  }
215
209
 
216
-
217
-
218
210
  // decompose in 128-lanes: a = (a0, a1), b = (b0, b1)
219
211
  // return (a0 + a1, b0 + b1)
220
212
  // TODO find a better name
221
213
  inline simd16uint16 combine2x2(simd16uint16 a, simd16uint16 b) {
222
-
223
214
  __m256i a1b0 = _mm256_permute2f128_si256(a.i, b.i, 0x21);
224
215
  __m256i a0b1 = _mm256_blend_epi32(a.i, b.i, 0xF0);
225
216
 
@@ -229,7 +220,6 @@ inline simd16uint16 combine2x2(simd16uint16 a, simd16uint16 b) {
229
220
  // compare d0 and d1 to thr, return 32 bits corresponding to the concatenation
230
221
  // of d0 and d1 with thr
231
222
  inline uint32_t cmp_ge32(simd16uint16 d0, simd16uint16 d1, simd16uint16 thr) {
232
-
233
223
  __m256i max0 = _mm256_max_epu16(d0.i, thr.i);
234
224
  __m256i ge0 = _mm256_cmpeq_epi16(d0.i, max0);
235
225
 
@@ -245,9 +235,7 @@ inline uint32_t cmp_ge32(simd16uint16 d0, simd16uint16 d1, simd16uint16 thr) {
245
235
  return ge;
246
236
  }
247
237
 
248
-
249
238
  inline uint32_t cmp_le32(simd16uint16 d0, simd16uint16 d1, simd16uint16 thr) {
250
-
251
239
  __m256i max0 = _mm256_min_epu16(d0.i, thr.i);
252
240
  __m256i ge0 = _mm256_cmpeq_epi16(d0.i, max0);
253
241
 
@@ -263,29 +251,26 @@ inline uint32_t cmp_le32(simd16uint16 d0, simd16uint16 d1, simd16uint16 thr) {
263
251
  return ge;
264
252
  }
265
253
 
266
-
267
254
  // vector of 32 unsigned 8-bit integers
268
- struct simd32uint8: simd256bit {
269
-
270
-
255
+ struct simd32uint8 : simd256bit {
271
256
  simd32uint8() {}
272
257
 
273
- explicit simd32uint8(__m256i i): simd256bit(i) {}
258
+ explicit simd32uint8(__m256i i) : simd256bit(i) {}
274
259
 
275
- explicit simd32uint8(int x): simd256bit(_mm256_set1_epi8(x)) {}
260
+ explicit simd32uint8(int x) : simd256bit(_mm256_set1_epi8(x)) {}
276
261
 
277
- explicit simd32uint8(uint8_t x): simd256bit(_mm256_set1_epi8(x)) {}
262
+ explicit simd32uint8(uint8_t x) : simd256bit(_mm256_set1_epi8(x)) {}
278
263
 
279
- explicit simd32uint8(simd256bit x): simd256bit(x) {}
264
+ explicit simd32uint8(simd256bit x) : simd256bit(x) {}
280
265
 
281
- explicit simd32uint8(const uint8_t *x): simd256bit((const void*)x) {}
266
+ explicit simd32uint8(const uint8_t* x) : simd256bit((const void*)x) {}
282
267
 
283
- std::string elements_to_string(const char * fmt) const {
268
+ std::string elements_to_string(const char* fmt) const {
284
269
  uint8_t bytes[32];
285
270
  storeu((void*)bytes);
286
271
  char res[1000];
287
- char *ptr = res;
288
- for(int i = 0; i < 32; i++) {
272
+ char* ptr = res;
273
+ for (int i = 0; i < 32; i++) {
289
274
  ptr += sprintf(ptr, fmt, bytes[i]);
290
275
  }
291
276
  // strip last ,
@@ -305,11 +290,11 @@ struct simd32uint8: simd256bit {
305
290
  i = _mm256_set1_epi8((char)x);
306
291
  }
307
292
 
308
- simd32uint8 operator & (simd256bit other) const {
293
+ simd32uint8 operator&(simd256bit other) const {
309
294
  return simd32uint8(_mm256_and_si256(i, other.i));
310
295
  }
311
296
 
312
- simd32uint8 operator + (simd32uint8 other) const {
297
+ simd32uint8 operator+(simd32uint8 other) const {
313
298
  return simd32uint8(_mm256_add_epi8(i, other.i));
314
299
  }
315
300
 
@@ -329,18 +314,17 @@ struct simd32uint8: simd256bit {
329
314
  return simd16uint16(_mm256_cvtepu8_epi16(x));
330
315
  }
331
316
 
332
- simd32uint8 operator += (simd32uint8 other) {
317
+ simd32uint8 operator+=(simd32uint8 other) {
333
318
  i = _mm256_add_epi8(i, other.i);
334
319
  return *this;
335
320
  }
336
321
 
337
322
  // for debugging only
338
- uint8_t operator [] (int i) const {
323
+ uint8_t operator[](int i) const {
339
324
  ALIGNED(32) uint8_t tab[32];
340
325
  store(tab);
341
326
  return tab[i];
342
327
  }
343
-
344
328
  };
345
329
 
346
330
  // convert with saturation
@@ -359,26 +343,24 @@ inline simd32uint8 blendv(simd32uint8 a, simd32uint8 b, simd32uint8 mask) {
359
343
  return simd32uint8(_mm256_blendv_epi8(a.i, b.i, mask.i));
360
344
  }
361
345
 
362
-
363
-
364
346
  /// vector of 8 unsigned 32-bit integers
365
- struct simd8uint32: simd256bit {
347
+ struct simd8uint32 : simd256bit {
366
348
  simd8uint32() {}
367
349
 
368
- explicit simd8uint32(__m256i i): simd256bit(i) {}
350
+ explicit simd8uint32(__m256i i) : simd256bit(i) {}
369
351
 
370
- explicit simd8uint32(uint32_t x): simd256bit(_mm256_set1_epi32(x)) {}
352
+ explicit simd8uint32(uint32_t x) : simd256bit(_mm256_set1_epi32(x)) {}
371
353
 
372
- explicit simd8uint32(simd256bit x): simd256bit(x) {}
354
+ explicit simd8uint32(simd256bit x) : simd256bit(x) {}
373
355
 
374
- explicit simd8uint32(const uint8_t *x): simd256bit((const void*)x) {}
356
+ explicit simd8uint32(const uint8_t* x) : simd256bit((const void*)x) {}
375
357
 
376
- std::string elements_to_string(const char * fmt) const {
358
+ std::string elements_to_string(const char* fmt) const {
377
359
  uint32_t bytes[8];
378
360
  storeu((void*)bytes);
379
361
  char res[1000];
380
- char *ptr = res;
381
- for(int i = 0; i < 8; i++) {
362
+ char* ptr = res;
363
+ for (int i = 0; i < 8; i++) {
382
364
  ptr += sprintf(ptr, fmt, bytes[i]);
383
365
  }
384
366
  // strip last ,
@@ -397,31 +379,28 @@ struct simd8uint32: simd256bit {
397
379
  void set1(uint32_t x) {
398
380
  i = _mm256_set1_epi32((int)x);
399
381
  }
400
-
401
382
  };
402
383
 
403
- struct simd8float32: simd256bit {
404
-
384
+ struct simd8float32 : simd256bit {
405
385
  simd8float32() {}
406
386
 
387
+ explicit simd8float32(simd256bit x) : simd256bit(x) {}
407
388
 
408
- explicit simd8float32(simd256bit x): simd256bit(x) {}
409
-
410
- explicit simd8float32(__m256 x): simd256bit(x) {}
389
+ explicit simd8float32(__m256 x) : simd256bit(x) {}
411
390
 
412
- explicit simd8float32(float x): simd256bit(_mm256_set1_ps(x)) {}
391
+ explicit simd8float32(float x) : simd256bit(_mm256_set1_ps(x)) {}
413
392
 
414
- explicit simd8float32(const float *x): simd256bit(_mm256_load_ps(x)) {}
393
+ explicit simd8float32(const float* x) : simd256bit(_mm256_load_ps(x)) {}
415
394
 
416
- simd8float32 operator * (simd8float32 other) const {
395
+ simd8float32 operator*(simd8float32 other) const {
417
396
  return simd8float32(_mm256_mul_ps(f, other.f));
418
397
  }
419
398
 
420
- simd8float32 operator + (simd8float32 other) const {
399
+ simd8float32 operator+(simd8float32 other) const {
421
400
  return simd8float32(_mm256_add_ps(f, other.f));
422
401
  }
423
402
 
424
- simd8float32 operator - (simd8float32 other) const {
403
+ simd8float32 operator-(simd8float32 other) const {
425
404
  return simd8float32(_mm256_sub_ps(f, other.f));
426
405
  }
427
406
 
@@ -429,15 +408,14 @@ struct simd8float32: simd256bit {
429
408
  float tab[8];
430
409
  storeu((void*)tab);
431
410
  char res[1000];
432
- char *ptr = res;
433
- for(int i = 0; i < 8; i++) {
411
+ char* ptr = res;
412
+ for (int i = 0; i < 8; i++) {
434
413
  ptr += sprintf(ptr, "%g,", tab[i]);
435
414
  }
436
415
  // strip last ,
437
416
  ptr[-1] = 0;
438
417
  return std::string(res);
439
418
  }
440
-
441
419
  };
442
420
 
443
421
  inline simd8float32 hadd(simd8float32 a, simd8float32 b) {
@@ -457,5 +435,30 @@ inline simd8float32 fmadd(simd8float32 a, simd8float32 b, simd8float32 c) {
457
435
  return simd8float32(_mm256_fmadd_ps(a.f, b.f, c.f));
458
436
  }
459
437
 
438
+ namespace {
439
+
440
+ // get even float32's of a and b, interleaved
441
+ inline simd8float32 geteven(simd8float32 a, simd8float32 b) {
442
+ return simd8float32(
443
+ _mm256_shuffle_ps(a.f, b.f, 0 << 0 | 2 << 2 | 0 << 4 | 2 << 6));
444
+ }
445
+
446
+ // get odd float32's of a and b, interleaved
447
+ inline simd8float32 getodd(simd8float32 a, simd8float32 b) {
448
+ return simd8float32(
449
+ _mm256_shuffle_ps(a.f, b.f, 1 << 0 | 3 << 2 | 1 << 4 | 3 << 6));
450
+ }
451
+
452
+ // 3 cycles
453
+ // if the lanes are a = [a0 a1] and b = [b0 b1], return [a0 b0]
454
+ inline simd8float32 getlow128(simd8float32 a, simd8float32 b) {
455
+ return simd8float32(_mm256_permute2f128_ps(a.f, b.f, 0 | 2 << 4));
456
+ }
457
+
458
+ inline simd8float32 gethigh128(simd8float32 a, simd8float32 b) {
459
+ return simd8float32(_mm256_permute2f128_ps(a.f, b.f, 1 | 3 << 4));
460
+ }
461
+
462
+ } // namespace
460
463
 
461
464
  } // namespace faiss