From e3dd6a85f3125d3338b2a5918e007230927c929f Mon Sep 17 00:00:00 2001 From: Tom Jackson Date: Fri, 19 Jun 2026 03:30:45 -0700 Subject: [PATCH] Remove unused fields in various DistanceComputers (#5318) Summary: Pull Request resolved: https://github.com/facebookresearch/faiss/pull/5318 * `size_t nb`, and `size_t ndis` are all write-only, just wasting space in the structure. In the case of `ndis`, the needless writes could lead to actual performance costs due to cache contention. * `const float* q` is now defined in the `FlatCodesDistanceComputer` base class, but many child classes still have a redundant field. * `const float *b` is just a type alias of the base class's `codes`, which can be done at the usage site. * Constructor argument `const float* q_in` seems to never be used. Most `DistanceComputer` implementations have internal linkage, so no consumers can be broken by the removal of an apparently-unused fields. Even DC's without internal linkage are effectively implementation details, so there is no reasonable expectation of these fields being preserved. Reviewed By: limqiying Differential Revision: D108796936 fbshipit-source-id: a9bc9ef54ce08d6de3f0ff5c57da6ab5ad6cbe8c --- faiss/IndexFlat.cpp | 57 ++++++--------------------------- faiss/utils/extra_distances.cpp | 18 +++-------- faiss/utils/extra_distances.h | 3 +- 3 files changed, 15 insertions(+), 63 deletions(-) diff --git a/faiss/IndexFlat.cpp b/faiss/IndexFlat.cpp index f503d9877..9a1d91a71 100644 --- a/faiss/IndexFlat.cpp +++ b/faiss/IndexFlat.cpp @@ -105,13 +105,8 @@ namespace { template struct FlatL2Dis : FlatCodesDistanceComputer { size_t d; - idx_t nb; - const float* b; - size_t ndis; - size_t npartial_dot_products; float distance_to_code(const uint8_t* code) final { - ndis++; return fvec_L2sqr(q, (float*)code, d); } @@ -119,25 +114,21 @@ struct FlatL2Dis : FlatCodesDistanceComputer { const idx_t i, const uint32_t offset, const uint32_t num_components) final override { - npartial_dot_products++; + const float* b = (const float*)this->codes; return fvec_inner_product( q + offset, b + i * d + offset, num_components); } float symmetric_dis(idx_t i, idx_t j) override { + const float* b = (const float*)this->codes; return fvec_L2sqr(b + j * d, b + i * d, d); } - explicit FlatL2Dis(const IndexFlat& storage, const float* q_ = nullptr) + explicit FlatL2Dis(const IndexFlat& storage) : FlatCodesDistanceComputer( storage.codes.data(), - storage.code_size, - q_), - d(storage.d), - nb(storage.ntotal), - b(storage.get_xb()), - ndis(0), - npartial_dot_products(0) {} + storage.code_size), + d(storage.d) {} void set_query(const float* x) override { q = x; @@ -153,8 +144,6 @@ struct FlatL2Dis : FlatCodesDistanceComputer { float& dis1, float& dis2, float& dis3) final override { - ndis += 4; - // compute first, assign next const float* __restrict y0 = reinterpret_cast(codes + idx0 * code_size); @@ -187,8 +176,6 @@ struct FlatL2Dis : FlatCodesDistanceComputer { float& dp3, const uint32_t offset, const uint32_t num_components) final override { - npartial_dot_products += 4; - // compute first, assign next const float* __restrict y0 = reinterpret_cast(codes + idx0 * code_size); @@ -224,29 +211,21 @@ struct FlatL2Dis : FlatCodesDistanceComputer { template struct FlatIPDis : FlatCodesDistanceComputer { size_t d; - idx_t nb; - const float* q; - const float* b; - size_t ndis; float symmetric_dis(idx_t i, idx_t j) final override { + const float* b = (const float*)this->codes; return fvec_inner_product(b + j * d, b + i * d, d); } float distance_to_code(const uint8_t* code) final override { - ndis++; return fvec_inner_product(q, (const float*)code, d); } - explicit FlatIPDis(const IndexFlat& storage, const float* q_in = nullptr) + explicit FlatIPDis(const IndexFlat& storage) : FlatCodesDistanceComputer( storage.codes.data(), storage.code_size), - d(storage.d), - nb(storage.ntotal), - q(q_in), - b(storage.get_xb()), - ndis(0) {} + d(storage.d) {} void set_query(const float* x) override { q = x; @@ -262,8 +241,6 @@ struct FlatIPDis : FlatCodesDistanceComputer { float& dis1, float& dis2, float& dis3) final override { - ndis += 4; - // compute first, assign next const float* __restrict y0 = reinterpret_cast(codes + idx0 * code_size); @@ -296,8 +273,7 @@ FlatCodesDistanceComputer* IndexFlat::get_FlatCodesDistanceComputer() const { } else if (metric_type == METRIC_INNER_PRODUCT) { with_simd_level([&]() { dc = new FlatIPDis(*this); }); } else { - dc = get_extra_distance_computer( - d, metric_type, metric_arg, ntotal, get_xb()); + dc = get_extra_distance_computer(d, metric_type, metric_arg, get_xb()); } return dc; } @@ -327,16 +303,11 @@ namespace { template struct FlatL2WithNormsDis : FlatCodesDistanceComputer { size_t d; - idx_t nb; - const float* q; - const float* b; - size_t ndis; const float* l2norms; float query_l2norm; float distance_to_code(const uint8_t* code) final override { - ndis++; return fvec_L2sqr(q, (float*)code, d); } @@ -361,17 +332,11 @@ struct FlatL2WithNormsDis : FlatCodesDistanceComputer { return l2norms[i] + l2norms[j] - 2 * dp0; } - explicit FlatL2WithNormsDis( - const IndexFlatL2& storage, - const float* q_in = nullptr) + explicit FlatL2WithNormsDis(const IndexFlatL2& storage) : FlatCodesDistanceComputer( storage.codes.data(), storage.code_size), d(storage.d), - nb(storage.ntotal), - q(q_in), - b(storage.get_xb()), - ndis(0), l2norms(storage.cached_l2norms.data()), query_l2norm(0) {} @@ -390,8 +355,6 @@ struct FlatL2WithNormsDis : FlatCodesDistanceComputer { float& dis1, float& dis2, float& dis3) final override { - ndis += 4; - // compute first, assign next const float* __restrict y0 = reinterpret_cast(codes + idx0 * code_size); diff --git a/faiss/utils/extra_distances.cpp b/faiss/utils/extra_distances.cpp index 363005d59..2fc8ac7fa 100644 --- a/faiss/utils/extra_distances.cpp +++ b/faiss/utils/extra_distances.cpp @@ -29,11 +29,9 @@ namespace { template struct ExtraDistanceComputer : FlatCodesDistanceComputer { VD vd; - idx_t nb; - const float* q; - const float* b; float symmetric_dis(idx_t i, idx_t j) final { + const float* b = (const float*)codes; return vd(b + j * vd.d, b + i * vd.d); } @@ -41,16 +39,9 @@ struct ExtraDistanceComputer : FlatCodesDistanceComputer { return vd(q, (float*)code); } - ExtraDistanceComputer( - const VD& vd_in, - const float* xb, - size_t nb_in, - const float* q_in = nullptr) + ExtraDistanceComputer(const VD& vd_in, const float* xb) : FlatCodesDistanceComputer((uint8_t*)xb, vd_in.d * sizeof(float)), - vd(vd_in), - nb(nb_in), - q(q_in), - b(xb) {} + vd(vd_in) {} void set_query(const float* x) override { q = x; @@ -149,11 +140,10 @@ FlatCodesDistanceComputer* get_extra_distance_computer( size_t d, MetricType mt, float metric_arg, - size_t nb, const float* xb) { return with_VectorDistance( d, mt, metric_arg, [&](auto vd) -> FlatCodesDistanceComputer* { - return new ExtraDistanceComputer(vd, xb, nb); + return new ExtraDistanceComputer(vd, xb); }); } diff --git a/faiss/utils/extra_distances.h b/faiss/utils/extra_distances.h index 519849984..a59ad59e6 100644 --- a/faiss/utils/extra_distances.h +++ b/faiss/utils/extra_distances.h @@ -49,12 +49,11 @@ void knn_extra_metrics( const IDSelector* sel = nullptr); /** get a DistanceComputer that refers to this type of distance and - * indexes a flat array of size nb */ + * indexes a flat array */ FlatCodesDistanceComputer* get_extra_distance_computer( size_t d, MetricType mt, float metric_arg, - size_t nb, const float* xb); /// Dispatch to a lambda with MetricType as a compile-time constant.