From 1a76707e369136176d42e25aac9f626fb822164a Mon Sep 17 00:00:00 2001 From: Cai Yudong Date: Wed, 29 Dec 2021 16:13:20 +0800 Subject: [PATCH] Abstract distances_simd.h from distances.h (#14512) Signed-off-by: yudong.cai --- .../src/index/thirdparty/faiss/FaissHook.cpp | 6 +- .../thirdparty/faiss/utils/distances.cpp | 7 +- .../index/thirdparty/faiss/utils/distances.h | 35 +-------- .../thirdparty/faiss/utils/distances_simd.cpp | 7 +- .../thirdparty/faiss/utils/distances_simd.h | 77 +++++++++++++++++++ .../faiss/utils/distances_simd_avx.cpp | 5 +- .../{distances_avx.h => distances_simd_avx.h} | 0 .../faiss/utils/distances_simd_avx512.cpp | 9 +-- ...ances_avx512.h => distances_simd_avx512.h} | 0 .../thirdparty/faiss/utils/hamming-inl.h | 4 +- .../index/thirdparty/faiss/utils/hamming.cpp | 1 - .../thirdparty/faiss/utils/jaccard-inl.h | 4 +- 12 files changed, 94 insertions(+), 61 deletions(-) create mode 100644 internal/core/src/index/thirdparty/faiss/utils/distances_simd.h rename internal/core/src/index/thirdparty/faiss/utils/{distances_avx.h => distances_simd_avx.h} (100%) rename internal/core/src/index/thirdparty/faiss/utils/{distances_avx512.h => distances_simd_avx512.h} (100%) diff --git a/internal/core/src/index/thirdparty/faiss/FaissHook.cpp b/internal/core/src/index/thirdparty/faiss/FaissHook.cpp index f4d2794d9a..1f68ffb805 100644 --- a/internal/core/src/index/thirdparty/faiss/FaissHook.cpp +++ b/internal/core/src/index/thirdparty/faiss/FaissHook.cpp @@ -9,9 +9,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include namespace faiss { diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances.cpp b/internal/core/src/index/thirdparty/faiss/utils/distances.cpp index b2806a8019..ed727b23ef 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/distances.cpp +++ b/internal/core/src/index/thirdparty/faiss/utils/distances.cpp @@ -7,16 +7,15 @@ // -*- c++ -*- -#include - #include #include #include #include - #include -#include + #include +#include +#include #ifndef FINTEGER diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances.h b/internal/core/src/index/thirdparty/faiss/utils/distances.h index b59f94616a..de9743099f 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/distances.h +++ b/internal/core/src/index/thirdparty/faiss/utils/distances.h @@ -16,6 +16,7 @@ #include #include +#include namespace faiss { @@ -24,28 +25,6 @@ namespace faiss { * Optimized distance/norm/inner prod computations *********************************************************/ -#ifdef __SSE__ -float fvec_L2sqr_sse ( - const float * x, - const float * y, - size_t d); - -float fvec_inner_product_sse ( - const float * x, - const float * y, - size_t d); - -float fvec_L1_sse ( - const float * x, - const float * y, - size_t d); - -float fvec_Linf_sse ( - const float * x, - const float * y, - size_t d); -#endif - /** Compute pairwise distances between sets of vectors * * @param d dimension of the vectors @@ -69,18 +48,6 @@ void fvec_inner_products_ny ( const float * y, size_t d, size_t ny); -/* compute ny square L2 distance bewteen x and a set of contiguous y vectors */ -void fvec_L2sqr_ny ( - float * dis, - const float * x, - const float * y, - size_t d, size_t ny); - - -/** squared norm of a vector */ -float fvec_norm_L2sqr (const float * x, - size_t d); - /** compute the L2 norms for a set of vectors * * @param ip output norms, size nx diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances_simd.cpp b/internal/core/src/index/thirdparty/faiss/utils/distances_simd.cpp index bb51938723..91587cb85c 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/distances_simd.cpp +++ b/internal/core/src/index/thirdparty/faiss/utils/distances_simd.cpp @@ -7,9 +7,6 @@ // -*- c++ -*- -#include -#include - #include #include #include @@ -118,14 +115,12 @@ void fvec_L2sqr_ny_ref (float * dis, size_t d, size_t ny) { for (size_t i = 0; i < ny; i++) { - dis[i] = fvec_L2sqr (x, y, d); + dis[i] = fvec_L2sqr_ref (x, y, d); y += d; } } - - /********************************************************* * SSE and AVX implementations */ diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances_simd.h b/internal/core/src/index/thirdparty/faiss/utils/distances_simd.h new file mode 100644 index 0000000000..ac80110eb0 --- /dev/null +++ b/internal/core/src/index/thirdparty/faiss/utils/distances_simd.h @@ -0,0 +1,77 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// -*- c++ -*- + +#pragma once + +#include + +#include + + +namespace faiss { + + /********************************************************* + * Optimized distance/norm/inner prod computations + *********************************************************/ + +float fvec_L2sqr_ref ( + const float * x, + const float * y, + size_t d); + +float fvec_inner_product_ref ( + const float * x, + const float * y, + size_t d); + +float fvec_L1_ref ( + const float * x, + const float * y, + size_t d); + +float fvec_Linf_ref ( + const float * x, + const float * y, + size_t d); + +#ifdef __SSE__ +float fvec_L2sqr_sse ( + const float * x, + const float * y, + size_t d); + +float fvec_inner_product_sse ( + const float * x, + const float * y, + size_t d); + +float fvec_L1_sse ( + const float * x, + const float * y, + size_t d); + +float fvec_Linf_sse ( + const float * x, + const float * y, + size_t d); +#endif + +/* compute ny square L2 distance bewteen x and a set of contiguous y vectors */ +void fvec_L2sqr_ny ( + float * dis, + const float * x, + const float * y, + size_t d, size_t ny); + + +/** squared norm of a vector */ +float fvec_norm_L2sqr (const float * x, + size_t d); + +} // namespace faiss diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx.cpp b/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx.cpp index d286a3815c..0db1897ae5 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx.cpp +++ b/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx.cpp @@ -1,14 +1,11 @@ // -*- c++ -*- -#include +#include #include #include #include -#include -#include - #include namespace faiss { diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances_avx.h b/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx.h similarity index 100% rename from internal/core/src/index/thirdparty/faiss/utils/distances_avx.h rename to internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx.h diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx512.cpp b/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx512.cpp index 5e1eb74e05..bebb61bb60 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx512.cpp +++ b/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx512.cpp @@ -1,14 +1,11 @@ // -*- c++ -*- -#include -#include + +#include #include #include #include -#include -#include - #include namespace faiss { @@ -33,6 +30,8 @@ static inline __m128 masked_read (int d, const float *x) { #if (defined(__AVX512F__) && defined(__AVX512DQ__)) +extern uint8_t lookup8bit[256]; + float fvec_inner_product_avx512(const float* x, const float* y, size_t d) { __m512 msum0 = _mm512_setzero_ps(); diff --git a/internal/core/src/index/thirdparty/faiss/utils/distances_avx512.h b/internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx512.h similarity index 100% rename from internal/core/src/index/thirdparty/faiss/utils/distances_avx512.h rename to internal/core/src/index/thirdparty/faiss/utils/distances_simd_avx512.h diff --git a/internal/core/src/index/thirdparty/faiss/utils/hamming-inl.h b/internal/core/src/index/thirdparty/faiss/utils/hamming-inl.h index 4772c3a153..36a34ae65f 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/hamming-inl.h +++ b/internal/core/src/index/thirdparty/faiss/utils/hamming-inl.h @@ -6,8 +6,8 @@ */ #include -#include -#include +#include +#include namespace faiss { diff --git a/internal/core/src/index/thirdparty/faiss/utils/hamming.cpp b/internal/core/src/index/thirdparty/faiss/utils/hamming.cpp index d84c36ffd0..1d96d0d953 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/hamming.cpp +++ b/internal/core/src/index/thirdparty/faiss/utils/hamming.cpp @@ -33,7 +33,6 @@ #include #include -#include #include #include #include diff --git a/internal/core/src/index/thirdparty/faiss/utils/jaccard-inl.h b/internal/core/src/index/thirdparty/faiss/utils/jaccard-inl.h index 3e82666e1a..9eb4908ac4 100644 --- a/internal/core/src/index/thirdparty/faiss/utils/jaccard-inl.h +++ b/internal/core/src/index/thirdparty/faiss/utils/jaccard-inl.h @@ -13,8 +13,8 @@ #define FAISS_JACCARD_INL_H #include -#include -#include +#include +#include namespace faiss {