faiss 0.6.4 → 0.6.5
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 +4 -0
- data/ext/faiss/extconf.rb +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +175 -0
- data/vendor/faiss/faiss/Clustering.cpp +150 -60
- data/vendor/faiss/faiss/Clustering.h +29 -0
- data/vendor/faiss/faiss/IVFlib.cpp +99 -0
- data/vendor/faiss/faiss/IVFlib.h +15 -0
- data/vendor/faiss/faiss/Index.cpp +44 -0
- data/vendor/faiss/faiss/Index.h +19 -14
- data/vendor/faiss/faiss/IndexBinary.cpp +8 -0
- data/vendor/faiss/faiss/IndexBinary.h +8 -0
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +82 -4
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +19 -0
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +34 -0
- data/vendor/faiss/faiss/IndexFastScan.cpp +33 -17
- data/vendor/faiss/faiss/IndexFastScan.h +6 -3
- data/vendor/faiss/faiss/IndexFlat.cpp +56 -0
- data/vendor/faiss/faiss/IndexFlat.h +31 -0
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +6 -1
- data/vendor/faiss/faiss/IndexHNSW.cpp +456 -10
- data/vendor/faiss/faiss/IndexHNSW.h +38 -0
- data/vendor/faiss/faiss/IndexIDMap.cpp +32 -0
- data/vendor/faiss/faiss/IndexIDMap.h +7 -0
- data/vendor/faiss/faiss/IndexIVF.cpp +281 -31
- data/vendor/faiss/faiss/IndexIVF.h +53 -1
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +46 -14
- data/vendor/faiss/faiss/IndexIVFFastScan.h +4 -2
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +33 -0
- data/vendor/faiss/faiss/IndexIVFFlat.h +16 -0
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +1 -0
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +3 -20
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +50 -14
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -2
- data/vendor/faiss/faiss/IndexIVFSQFastScan.cpp +855 -0
- data/vendor/faiss/faiss/IndexIVFSQFastScan.h +145 -0
- data/vendor/faiss/faiss/IndexNNDescent.cpp +0 -3
- data/vendor/faiss/faiss/IndexPiPNN.cpp +201 -0
- data/vendor/faiss/faiss/IndexPiPNN.h +83 -0
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +6 -3
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +10 -4
- data/vendor/faiss/faiss/IndexReplicas.cpp +20 -0
- data/vendor/faiss/faiss/IndexReplicas.h +9 -0
- data/vendor/faiss/faiss/IndexSQFastScan.cpp +648 -0
- data/vendor/faiss/faiss/IndexSQFastScan.h +129 -0
- data/vendor/faiss/faiss/IndexShards.cpp +10 -0
- data/vendor/faiss/faiss/IndexShards.h +5 -0
- data/vendor/faiss/faiss/SuperKMeans.cpp +57 -15
- data/vendor/faiss/faiss/SuperKMeans.h +9 -4
- data/vendor/faiss/faiss/VectorTransform.cpp +3 -2
- data/vendor/faiss/faiss/clone_index.cpp +24 -0
- data/vendor/faiss/faiss/gpu/Dataset.h +112 -0
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +16 -13
- data/vendor/faiss/faiss/gpu/GpuCloner.h +4 -0
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +3 -0
- data/vendor/faiss/faiss/gpu/GpuIndex.h +4 -13
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryCagra.h +26 -13
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +45 -22
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +11 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +6 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuDatasetHeader.cpp +18 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +215 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +98 -0
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +11 -0
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +1 -1
- data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +11 -0
- data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +92 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +4 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexBinaryFlat.h +69 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +38 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +106 -0
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +10 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +2 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +1 -6
- data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +134 -45
- data/vendor/faiss/faiss/impl/ClusteringHelpers.h +36 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +286 -136
- data/vendor/faiss/faiss/impl/DistanceComputer.cpp +63 -0
- data/vendor/faiss/faiss/impl/DistanceComputer.h +3 -29
- data/vendor/faiss/faiss/impl/HNSW.cpp +46 -10
- data/vendor/faiss/faiss/impl/HNSW.h +72 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +6 -19
- data/vendor/faiss/faiss/impl/NNDescent.cpp +2 -1
- data/vendor/faiss/faiss/impl/NSG.cpp +3 -2
- data/vendor/faiss/faiss/impl/Panorama.h +3 -2
- data/vendor/faiss/faiss/impl/PiPNN.cpp +822 -0
- data/vendor/faiss/faiss/impl/PiPNN.h +122 -0
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +54 -11
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +1 -1
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +81 -57
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +15 -0
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +29 -0
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +1 -6
- data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +0 -4
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +5 -2
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +0 -4
- data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +0 -4
- data/vendor/faiss/faiss/impl/expanded_scanners.h +88 -0
- data/vendor/faiss/faiss/impl/fast_scan/FastScanDistancePostProcessing.h +4 -0
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +61 -64
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +13 -14
- data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +17 -129
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +25 -19
- data/vendor/faiss/faiss/impl/fast_scan/fast_scan.cpp +5 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +0 -88
- data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +0 -4
- data/vendor/faiss/faiss/impl/fast_scan/kernels_neon.h +155 -0
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +22 -1
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd512.h +3 -2
- data/vendor/faiss/faiss/impl/fast_scan/simd_result_handlers.h +41 -23
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/index_read.cpp +172 -0
- data/vendor/faiss/faiss/impl/index_write.cpp +95 -0
- data/vendor/faiss/faiss/impl/pipnn/HashPrune.cpp +159 -0
- data/vendor/faiss/faiss/impl/pipnn/HashPrune.h +69 -0
- data/vendor/faiss/faiss/impl/pipnn/Partition.cpp +587 -0
- data/vendor/faiss/faiss/impl/pipnn/Partition.h +93 -0
- data/vendor/faiss/faiss/impl/pipnn/kernels.cpp +326 -0
- data/vendor/faiss/faiss/impl/pipnn/kernels.h +92 -0
- data/vendor/faiss/faiss/impl/platform_macros.h +45 -0
- data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +79 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +6 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +0 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx2.h +4 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-avx512.h +4 -1
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +19 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +6 -6
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +131 -6
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +0 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_rvv_kernel.h +89 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +21 -10
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +45 -18
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +2 -1
- data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +0 -4
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +0 -4
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +5 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +28 -52
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +59 -11
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +226 -77
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +482 -103
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +2 -149
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +3 -698
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +66 -57
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +101 -96
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +3185 -144
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq8_coefficients.h +48 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq8_rvv_kernel.h +546 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +2 -2
- data/vendor/faiss/faiss/impl/simd_dispatch.h +7 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_avx2.h +14 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +7 -8
- data/vendor/faiss/faiss/impl/sq_fastscan_utils.h +232 -0
- data/vendor/faiss/faiss/index_factory.cpp +76 -0
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +3 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +3 -2
- data/vendor/faiss/faiss/utils/AlignedTable.h +6 -1
- data/vendor/faiss/faiss/utils/Heap.cpp +4 -3
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +16 -5
- data/vendor/faiss/faiss/utils/bf16.h +36 -0
- data/vendor/faiss/faiss/utils/distances.cpp +226 -15
- data/vendor/faiss/faiss/utils/distances.h +34 -0
- data/vendor/faiss/faiss/utils/distances_dispatch.h +6 -4
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +2 -5
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +0 -14
- data/vendor/faiss/faiss/utils/distances_fused/rvv.cpp +25 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +0 -4
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +0 -4
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +2 -1
- data/vendor/faiss/faiss/utils/distances_simd.cpp +9 -0
- data/vendor/faiss/faiss/utils/fp16-fp16c.h +4 -0
- data/vendor/faiss/faiss/utils/fp16-inl.h +26 -52
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +0 -4
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +0 -4
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_vpopcnt.cpp +0 -4
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +33 -5
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_vpopcnt.h +15 -30
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +0 -4
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +2 -1
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +0 -4
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +0 -4
- data/vendor/faiss/faiss/utils/pq_code_distance.h +8 -4
- data/vendor/faiss/faiss/utils/prefetch.h +1 -26
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +26 -27
- data/vendor/faiss/faiss/utils/quantize_lut.h +11 -0
- data/vendor/faiss/faiss/utils/rabitq_simd.h +51 -16
- data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +9 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +37 -5
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +64 -5
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +64 -5
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +353 -71
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv_kernel.h +68 -0
- data/vendor/faiss/faiss/utils/simd_impl/exhaustive_L2sqr_blas_cmax.h +93 -0
- data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels.h +76 -0
- data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels_avx2.cpp +52 -0
- data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels_avx512.cpp +52 -0
- data/vendor/faiss/faiss/utils/simd_impl/fp16_kernels_neon.cpp +48 -0
- data/vendor/faiss/faiss/utils/simd_impl/masked_sum-avx2.h +44 -0
- data/vendor/faiss/faiss/utils/simd_impl/masked_sum-avx512.h +43 -0
- data/vendor/faiss/faiss/utils/simd_impl/masked_sum.h +38 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +0 -4
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +0 -4
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +54 -15
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +38 -21
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_vpopcnt.cpp +51 -14
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +297 -10
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +0 -4
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +0 -4
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +0 -4
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_sve.cpp +0 -4
- data/vendor/faiss/faiss/utils/simd_levels.cpp +19 -3
- data/vendor/faiss/faiss/utils/simd_levels.h +74 -1
- data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +0 -4
- data/vendor/faiss/faiss/utils/transpose/transpose-avx512-inl.h +0 -4
- data/vendor/faiss/faiss/utils/utils.cpp +80 -0
- data/vendor/faiss/faiss/utils/utils.h +24 -0
- metadata +33 -1
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
#include <faiss/utils/distances.h>
|
|
9
|
+
#include <faiss/utils/simd_impl/masked_sum-avx2.h>
|
|
9
10
|
|
|
10
11
|
#include <immintrin.h>
|
|
11
12
|
|
|
@@ -105,6 +106,19 @@ void fvec_madd<SIMDLevel::AVX2>(
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
|
|
109
|
+
template <>
|
|
110
|
+
float fvec_masked_sum<SIMDLevel::AVX2>(
|
|
111
|
+
const float* x,
|
|
112
|
+
const uint8_t* bits,
|
|
113
|
+
size_t d) {
|
|
114
|
+
return masked_sum<SIMDLevel::AVX2>(x, bits, d);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Internal linkage: the same template is compiled with other -m flags in
|
|
118
|
+
// the other per-SIMD distances TU, and a shared symbol would let the linker
|
|
119
|
+
// hand one level the other's code.
|
|
120
|
+
namespace {
|
|
121
|
+
|
|
108
122
|
template <size_t DIM>
|
|
109
123
|
void fvec_L2sqr_ny_y_transposed_D(
|
|
110
124
|
float* distances,
|
|
@@ -181,6 +195,8 @@ void fvec_L2sqr_ny_y_transposed_D(
|
|
|
181
195
|
}
|
|
182
196
|
}
|
|
183
197
|
|
|
198
|
+
} // namespace
|
|
199
|
+
|
|
184
200
|
template <>
|
|
185
201
|
void fvec_L2sqr_ny_transposed<SIMDLevel::AVX2>(
|
|
186
202
|
float* dis,
|
|
@@ -199,8 +215,12 @@ void fvec_L2sqr_ny_transposed<SIMDLevel::AVX2>(
|
|
|
199
215
|
switch (d) {
|
|
200
216
|
DISPATCH(1)
|
|
201
217
|
DISPATCH(2)
|
|
218
|
+
DISPATCH(3)
|
|
202
219
|
DISPATCH(4)
|
|
220
|
+
DISPATCH(6)
|
|
203
221
|
DISPATCH(8)
|
|
222
|
+
DISPATCH(12)
|
|
223
|
+
DISPATCH(16)
|
|
204
224
|
default:
|
|
205
225
|
return fvec_L2sqr_ny_transposed<SIMDLevel::NONE>(
|
|
206
226
|
dis, x, y, y_sqlen, d, d_offset, ny);
|
|
@@ -1060,6 +1080,11 @@ size_t fvec_L2sqr_ny_nearest<SIMDLevel::AVX2>(
|
|
|
1060
1080
|
&fvec_L2sqr_ny_nearest_D8<SIMDLevel::AVX2>);
|
|
1061
1081
|
}
|
|
1062
1082
|
|
|
1083
|
+
// Internal linkage: the same template is compiled with other -m flags in
|
|
1084
|
+
// the other per-SIMD distances TU, and a shared symbol would let the linker
|
|
1085
|
+
// hand one level the other's code.
|
|
1086
|
+
namespace {
|
|
1087
|
+
|
|
1063
1088
|
template <size_t DIM>
|
|
1064
1089
|
size_t fvec_L2sqr_ny_nearest_y_transposed_D(
|
|
1065
1090
|
float* /*distances_tmp_buffer*/,
|
|
@@ -1176,6 +1201,8 @@ size_t fvec_L2sqr_ny_nearest_y_transposed_D(
|
|
|
1176
1201
|
return current_min_index;
|
|
1177
1202
|
}
|
|
1178
1203
|
|
|
1204
|
+
} // namespace
|
|
1205
|
+
|
|
1179
1206
|
template <>
|
|
1180
1207
|
size_t fvec_L2sqr_ny_nearest_y_transposed<SIMDLevel::AVX2>(
|
|
1181
1208
|
float* distances_tmp_buffer,
|
|
@@ -1213,9 +1240,11 @@ int fvec_madd_and_argmin<SIMDLevel::AVX2>(
|
|
|
1213
1240
|
return fvec_madd_and_argmin_sse(n, a, bf, b, c);
|
|
1214
1241
|
}
|
|
1215
1242
|
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1243
|
+
namespace {
|
|
1244
|
+
|
|
1245
|
+
template <class QueryTiles>
|
|
1246
|
+
void exhaustive_L2sqr_blas_cmax_avx2(
|
|
1247
|
+
QueryTiles& queries,
|
|
1219
1248
|
const float* y,
|
|
1220
1249
|
size_t d,
|
|
1221
1250
|
size_t nx,
|
|
@@ -1235,7 +1264,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
|
|
|
1235
1264
|
std::unique_ptr<float[]> x_norms(new float[nx]);
|
|
1236
1265
|
std::unique_ptr<float[]> del2;
|
|
1237
1266
|
|
|
1238
|
-
|
|
1267
|
+
queries.prepare_norms(nx, x_norms.get());
|
|
1239
1268
|
|
|
1240
1269
|
if (!y_norms) {
|
|
1241
1270
|
float* y_norms2 = new float[ny];
|
|
@@ -1250,6 +1279,8 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
|
|
|
1250
1279
|
i1 = nx;
|
|
1251
1280
|
}
|
|
1252
1281
|
|
|
1282
|
+
const float* xt = queries.tile(i0, i1, x_norms.get());
|
|
1283
|
+
|
|
1253
1284
|
res.begin_multiple(i0, i1);
|
|
1254
1285
|
|
|
1255
1286
|
for (size_t j0 = 0; j0 < ny; j0 += bs_y) {
|
|
@@ -1269,7 +1300,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
|
|
|
1269
1300
|
&one,
|
|
1270
1301
|
y + j0 * d,
|
|
1271
1302
|
&di,
|
|
1272
|
-
|
|
1303
|
+
xt,
|
|
1273
1304
|
&di,
|
|
1274
1305
|
&zero,
|
|
1275
1306
|
ip_block.get(),
|
|
@@ -1427,4 +1458,32 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
|
|
|
1427
1458
|
}
|
|
1428
1459
|
}
|
|
1429
1460
|
|
|
1461
|
+
} // namespace
|
|
1462
|
+
|
|
1463
|
+
template <>
|
|
1464
|
+
void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX2>(
|
|
1465
|
+
const float* x,
|
|
1466
|
+
const float* y,
|
|
1467
|
+
size_t d,
|
|
1468
|
+
size_t nx,
|
|
1469
|
+
size_t ny,
|
|
1470
|
+
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
|
1471
|
+
const float* y_norms) {
|
|
1472
|
+
Fp32QueryTiles queries{x, d};
|
|
1473
|
+
exhaustive_L2sqr_blas_cmax_avx2(queries, y, d, nx, ny, res, y_norms);
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
template <>
|
|
1477
|
+
void exhaustive_L2sqr_blas_cmax_fp16<SIMDLevel::AVX2>(
|
|
1478
|
+
const uint16_t* x,
|
|
1479
|
+
const float* y,
|
|
1480
|
+
size_t d,
|
|
1481
|
+
size_t nx,
|
|
1482
|
+
size_t ny,
|
|
1483
|
+
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
|
1484
|
+
const float* y_norms) {
|
|
1485
|
+
Fp16QueryTiles queries(x, d, nx);
|
|
1486
|
+
exhaustive_L2sqr_blas_cmax_avx2(queries, y, d, nx, ny, res, y_norms);
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1430
1489
|
} // namespace faiss
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
#include <faiss/utils/distances.h>
|
|
9
|
+
#include <faiss/utils/simd_impl/masked_sum-avx512.h>
|
|
9
10
|
|
|
10
11
|
#include <immintrin.h>
|
|
11
12
|
|
|
@@ -78,6 +79,19 @@ void fvec_madd<SIMDLevel::AVX512>(
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
|
|
82
|
+
template <>
|
|
83
|
+
float fvec_masked_sum<SIMDLevel::AVX512>(
|
|
84
|
+
const float* x,
|
|
85
|
+
const uint8_t* bits,
|
|
86
|
+
size_t d) {
|
|
87
|
+
return masked_sum<SIMDLevel::AVX512>(x, bits, d);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Internal linkage: the same template is compiled with other -m flags in
|
|
91
|
+
// the other per-SIMD distances TU, and a shared symbol would let the linker
|
|
92
|
+
// hand one level the other's code.
|
|
93
|
+
namespace {
|
|
94
|
+
|
|
81
95
|
template <size_t DIM>
|
|
82
96
|
void fvec_L2sqr_ny_y_transposed_D(
|
|
83
97
|
float* distances,
|
|
@@ -151,6 +165,8 @@ void fvec_L2sqr_ny_y_transposed_D(
|
|
|
151
165
|
}
|
|
152
166
|
}
|
|
153
167
|
|
|
168
|
+
} // namespace
|
|
169
|
+
|
|
154
170
|
template <>
|
|
155
171
|
void fvec_L2sqr_ny_transposed<SIMDLevel::AVX512>(
|
|
156
172
|
float* dis,
|
|
@@ -169,8 +185,12 @@ void fvec_L2sqr_ny_transposed<SIMDLevel::AVX512>(
|
|
|
169
185
|
switch (d) {
|
|
170
186
|
DISPATCH(1)
|
|
171
187
|
DISPATCH(2)
|
|
188
|
+
DISPATCH(3)
|
|
172
189
|
DISPATCH(4)
|
|
190
|
+
DISPATCH(6)
|
|
173
191
|
DISPATCH(8)
|
|
192
|
+
DISPATCH(12)
|
|
193
|
+
DISPATCH(16)
|
|
174
194
|
default:
|
|
175
195
|
return fvec_L2sqr_ny_transposed<SIMDLevel::NONE>(
|
|
176
196
|
dis, x, y, y_sqlen, d, d_offset, ny);
|
|
@@ -983,6 +1003,11 @@ size_t fvec_L2sqr_ny_nearest<SIMDLevel::AVX512>(
|
|
|
983
1003
|
&fvec_L2sqr_ny_nearest_D8<SIMDLevel::AVX512>);
|
|
984
1004
|
}
|
|
985
1005
|
|
|
1006
|
+
// Internal linkage: the same template is compiled with other -m flags in
|
|
1007
|
+
// the other per-SIMD distances TU, and a shared symbol would let the linker
|
|
1008
|
+
// hand one level the other's code.
|
|
1009
|
+
namespace {
|
|
1010
|
+
|
|
986
1011
|
template <size_t DIM>
|
|
987
1012
|
size_t fvec_L2sqr_ny_nearest_y_transposed_D(
|
|
988
1013
|
float* /* distances_tmp_buffer */,
|
|
@@ -1096,6 +1121,8 @@ size_t fvec_L2sqr_ny_nearest_y_transposed_D(
|
|
|
1096
1121
|
return current_min_index;
|
|
1097
1122
|
}
|
|
1098
1123
|
|
|
1124
|
+
} // namespace
|
|
1125
|
+
|
|
1099
1126
|
template <>
|
|
1100
1127
|
size_t fvec_L2sqr_ny_nearest_y_transposed<SIMDLevel::AVX512>(
|
|
1101
1128
|
float* distances_tmp_buffer,
|
|
@@ -1133,9 +1160,11 @@ int fvec_madd_and_argmin<SIMDLevel::AVX512>(
|
|
|
1133
1160
|
return fvec_madd_and_argmin_sse(n, a, bf, b, c);
|
|
1134
1161
|
}
|
|
1135
1162
|
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1163
|
+
namespace {
|
|
1164
|
+
|
|
1165
|
+
template <class QueryTiles>
|
|
1166
|
+
void exhaustive_L2sqr_blas_cmax_avx512(
|
|
1167
|
+
QueryTiles& queries,
|
|
1139
1168
|
const float* y,
|
|
1140
1169
|
size_t d,
|
|
1141
1170
|
size_t nx,
|
|
@@ -1154,7 +1183,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
|
|
|
1154
1183
|
std::unique_ptr<float[]> x_norms(new float[nx]);
|
|
1155
1184
|
std::unique_ptr<float[]> del2;
|
|
1156
1185
|
|
|
1157
|
-
|
|
1186
|
+
queries.prepare_norms(nx, x_norms.get());
|
|
1158
1187
|
|
|
1159
1188
|
if (!y_norms) {
|
|
1160
1189
|
float* y_norms2 = new float[ny];
|
|
@@ -1169,6 +1198,8 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
|
|
|
1169
1198
|
i1 = nx;
|
|
1170
1199
|
}
|
|
1171
1200
|
|
|
1201
|
+
const float* xt = queries.tile(i0, i1, x_norms.get());
|
|
1202
|
+
|
|
1172
1203
|
res.begin_multiple(i0, i1);
|
|
1173
1204
|
|
|
1174
1205
|
for (size_t j0 = 0; j0 < ny; j0 += bs_y) {
|
|
@@ -1188,7 +1219,7 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
|
|
|
1188
1219
|
&one,
|
|
1189
1220
|
y + j0 * d,
|
|
1190
1221
|
&di,
|
|
1191
|
-
|
|
1222
|
+
xt,
|
|
1192
1223
|
&di,
|
|
1193
1224
|
&zero,
|
|
1194
1225
|
ip_block.get(),
|
|
@@ -1340,4 +1371,32 @@ void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
|
|
|
1340
1371
|
}
|
|
1341
1372
|
}
|
|
1342
1373
|
|
|
1374
|
+
} // namespace
|
|
1375
|
+
|
|
1376
|
+
template <>
|
|
1377
|
+
void exhaustive_L2sqr_blas_cmax<SIMDLevel::AVX512>(
|
|
1378
|
+
const float* x,
|
|
1379
|
+
const float* y,
|
|
1380
|
+
size_t d,
|
|
1381
|
+
size_t nx,
|
|
1382
|
+
size_t ny,
|
|
1383
|
+
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
|
1384
|
+
const float* y_norms) {
|
|
1385
|
+
Fp32QueryTiles queries{x, d};
|
|
1386
|
+
exhaustive_L2sqr_blas_cmax_avx512(queries, y, d, nx, ny, res, y_norms);
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
template <>
|
|
1390
|
+
void exhaustive_L2sqr_blas_cmax_fp16<SIMDLevel::AVX512>(
|
|
1391
|
+
const uint16_t* x,
|
|
1392
|
+
const float* y,
|
|
1393
|
+
size_t d,
|
|
1394
|
+
size_t nx,
|
|
1395
|
+
size_t ny,
|
|
1396
|
+
Top1BlockResultHandler<CMax<float, int64_t>>& res,
|
|
1397
|
+
const float* y_norms) {
|
|
1398
|
+
Fp16QueryTiles queries(x, d, nx);
|
|
1399
|
+
exhaustive_L2sqr_blas_cmax_avx512(queries, y, d, nx, ny, res, y_norms);
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1343
1402
|
} // namespace faiss
|