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
This commit is contained in:
Tom Jackson
2026-06-19 03:30:45 -07:00
committed by meta-codesync[bot]
parent 5826578a7e
commit e3dd6a85f3
3 changed files with 15 additions and 63 deletions
+10 -47
View File
@@ -105,13 +105,8 @@ namespace {
template <SIMDLevel SL>
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<SL>(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<SL>(
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<SL>(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<const float*>(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<const float*>(codes + idx0 * code_size);
@@ -224,29 +211,21 @@ struct FlatL2Dis : FlatCodesDistanceComputer {
template <SIMDLevel SL>
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<SL>(b + j * d, b + i * d, d);
}
float distance_to_code(const uint8_t* code) final override {
ndis++;
return fvec_inner_product<SL>(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<const float*>(codes + idx0 * code_size);
@@ -296,8 +273,7 @@ FlatCodesDistanceComputer* IndexFlat::get_FlatCodesDistanceComputer() const {
} else if (metric_type == METRIC_INNER_PRODUCT) {
with_simd_level([&]<SIMDLevel SL>() { dc = new FlatIPDis<SL>(*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 <SIMDLevel SL>
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<SL>(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<const float*>(codes + idx0 * code_size);
+4 -14
View File
@@ -29,11 +29,9 @@ namespace {
template <class VD>
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<decltype(vd)>(vd, xb, nb);
return new ExtraDistanceComputer<decltype(vd)>(vd, xb);
});
}
+1 -2
View File
@@ -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.