mirror of
https://github.com/facebookresearch/faiss.git
synced 2026-10-12 02:13:36 +00:00
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:
committed by
meta-codesync[bot]
parent
5826578a7e
commit
e3dd6a85f3
+10
-47
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user