Skip to content

Commit 29318b3

Browse files
Alexandr Guzhvafacebook-github-bot
Alexandr Guzhva
authored andcommitted
improve PQ/IVFPQ code_distance() for avx2 for 4 and 8 subquantizers (facebookresearch#2831)
Summary: Pull Request resolved: facebookresearch#2831 Reviewed By: mdouze Differential Revision: D45329803 fbshipit-source-id: 627be46036b313f4be05e9a54b13562b414d2789
1 parent bc12015 commit 29318b3

7 files changed

+585
-74
lines changed

faiss/IndexIVFPQ.cpp

+29-16
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,8 @@ struct IVFPQScannerT : QueryTables {
937937
float distance_2 = 0;
938938
float distance_3 = 0;
939939
distance_four_codes<PQDecoder>(
940-
pq,
940+
pq.M,
941+
pq.nbits,
941942
sim_table,
942943
codes + saved_j[0] * pq.code_size,
943944
codes + saved_j[1] * pq.code_size,
@@ -957,24 +958,30 @@ struct IVFPQScannerT : QueryTables {
957958
}
958959

959960
if (counter >= 1) {
960-
float dis =
961-
dis0 +
961+
float dis = dis0 +
962962
distance_single_code<PQDecoder>(
963-
pq, sim_table, codes + saved_j[0] * pq.code_size);
963+
pq.M,
964+
pq.nbits,
965+
sim_table,
966+
codes + saved_j[0] * pq.code_size);
964967
res.add(saved_j[0], dis);
965968
}
966969
if (counter >= 2) {
967-
float dis =
968-
dis0 +
970+
float dis = dis0 +
969971
distance_single_code<PQDecoder>(
970-
pq, sim_table, codes + saved_j[1] * pq.code_size);
972+
pq.M,
973+
pq.nbits,
974+
sim_table,
975+
codes + saved_j[1] * pq.code_size);
971976
res.add(saved_j[1], dis);
972977
}
973978
if (counter >= 3) {
974-
float dis =
975-
dis0 +
979+
float dis = dis0 +
976980
distance_single_code<PQDecoder>(
977-
pq, sim_table, codes + saved_j[2] * pq.code_size);
981+
pq.M,
982+
pq.nbits,
983+
sim_table,
984+
codes + saved_j[2] * pq.code_size);
978985
res.add(saved_j[2], dis);
979986
}
980987
}
@@ -1137,7 +1144,8 @@ struct IVFPQScannerT : QueryTables {
11371144
float distance_2 = dis0;
11381145
float distance_3 = dis0;
11391146
distance_four_codes<PQDecoder>(
1140-
pq,
1147+
pq.M,
1148+
pq.nbits,
11411149
sim_table,
11421150
codes + saved_j[0] * pq.code_size,
11431151
codes + saved_j[1] * pq.code_size,
@@ -1165,10 +1173,12 @@ struct IVFPQScannerT : QueryTables {
11651173
for (size_t kk = 0; kk < counter; kk++) {
11661174
n_hamming_pass++;
11671175

1168-
float dis =
1169-
dis0 +
1176+
float dis = dis0 +
11701177
distance_single_code<PQDecoder>(
1171-
pq, sim_table, codes + saved_j[kk] * pq.code_size);
1178+
pq.M,
1179+
pq.nbits,
1180+
sim_table,
1181+
codes + saved_j[kk] * pq.code_size);
11721182

11731183
res.add(saved_j[kk], dis);
11741184
}
@@ -1185,7 +1195,10 @@ struct IVFPQScannerT : QueryTables {
11851195

11861196
float dis = dis0 +
11871197
distance_single_code<PQDecoder>(
1188-
pq, sim_table, codes + j * code_size);
1198+
pq.M,
1199+
pq.nbits,
1200+
sim_table,
1201+
codes + j * code_size);
11891202

11901203
res.add(j, dis);
11911204
}
@@ -1263,7 +1276,7 @@ struct IVFPQScanner : IVFPQScannerT<idx_t, METRIC_TYPE, PQDecoder>,
12631276
assert(precompute_mode == 2);
12641277
float dis = this->dis0 +
12651278
distance_single_code<PQDecoder>(
1266-
this->pq, this->sim_table, code);
1279+
this->pq.M, this->pq.nbits, this->sim_table, code);
12671280
return dis;
12681281
}
12691282

faiss/IndexPQ.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ struct PQDistanceComputer : FlatCodesDistanceComputer {
8686
ndis++;
8787

8888
float dis = distance_single_code<PQDecoder>(
89-
pq, precomputed_table.data(), code);
89+
pq.M, pq.nbits, precomputed_table.data(), code);
9090
return dis;
9191
}
9292

0 commit comments

Comments
 (0)