Replace distance_to_code() in IVFPQScanner and PQDistanceComputer (#2717)

Summary:
Pull Request resolved: https://github.com/facebookresearch/faiss/pull/2717

Use avx2-optimized distance_to_code(), if appropriate

Reviewed By: mlomeli1

Differential Revision: D43369478

fbshipit-source-id: 0a68c07057710644342e0993a47f26e77a397636
This commit is contained in:
Alexandr Guzhva
2023-02-21 14:19:13 -08:00
committed by Facebook GitHub Bot
parent 55b2d54ee1
commit 67d2a779ea
2 changed files with 9 additions and 16 deletions
+3 -8
View File
@@ -1261,14 +1261,9 @@ struct IVFPQScanner : IVFPQScannerT<idx_t, METRIC_TYPE, PQDecoder>,
float distance_to_code(const uint8_t* code) const override {
assert(precompute_mode == 2);
float dis = this->dis0;
const float* tab = this->sim_table;
PQDecoder decoder(code, this->pq.nbits);
for (size_t m = 0; m < this->pq.M; m++) {
dis += tab[decoder.decode()];
tab += this->pq.ksub;
}
float dis = this->dis0 +
distance_single_code<PQDecoder>(
this->pq, this->sim_table, code);
return dis;
}
+6 -8
View File
@@ -19,6 +19,8 @@
#include <faiss/impl/FaissAssert.h>
#include <faiss/utils/hamming.h>
#include <faiss/impl/code_distance/code_distance.h>
namespace faiss {
/*********************************************************
@@ -81,15 +83,11 @@ struct PQDistanceComputer : FlatCodesDistanceComputer {
size_t ndis;
float distance_to_code(const uint8_t* code) final {
const float* dt = precomputed_table.data();
PQDecoder decoder(code, pq.nbits);
float accu = 0;
for (int j = 0; j < pq.M; j++) {
accu += dt[decoder.decode()];
dt += 1 << decoder.nbits;
}
ndis++;
return accu;
float dis = distance_single_code<PQDecoder>(
pq, precomputed_table.data(), code);
return dis;
}
float symmetric_dis(idx_t i, idx_t j) override {