/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include using namespace faiss; template void hamming_cpt_test( int code_size, uint8_t* data1, uint8_t* data2, int n, int* rst) { T computer(data1, code_size); for (int i = 0; i < n; i++) { rst[i] = computer.hamming(data2); data2 += code_size; } } int main() { size_t n = 4 * 1000 * 1000; std::vector code_size = {128, 256, 512, 1000}; std::vector x(n * code_size.back()); byte_rand(x.data(), n, 12345); int nrun = 100; for (size_t cs : code_size) { printf("benchmark with code_size=%zd n=%zd nrun=%d\n", cs, n, nrun); double tot_t1 = 0, tot_t2 = 0, tot_t3 = 0; #pragma omp parallel reduction(+ : tot_t1, tot_t2, tot_t3) { std::vector rst_m4(n); std::vector rst_m8(n); std::vector rst_default(n); #pragma omp for for (int run = 0; run < nrun; run++) { double t0, t1, t2, t3; t0 = getmillisecs(); // new implem from Zilliz hamming_cpt_test( cs, x.data(), x.data(), n, rst_default.data()); t1 = getmillisecs(); // M8 hamming_cpt_test( cs, x.data(), x.data(), n, rst_m8.data()); t2 = getmillisecs(); // M4 hamming_cpt_test( cs, x.data(), x.data(), n, rst_m4.data()); t3 = getmillisecs(); tot_t1 += t1 - t0; tot_t2 += t2 - t1; tot_t3 += t3 - t2; } for (int i = 0; i < n; i++) { FAISS_THROW_IF_NOT_FMT( (rst_m4[i] == rst_m8[i] && rst_m4[i] == rst_default[i]), "wrong result i=%d, m4 %d m8 %d default %d", i, rst_m4[i], rst_m8[i], rst_default[i]); } } printf("Hamming_Dft implem: %.3f ms\n", tot_t1 / nrun); printf("Hamming_M8 implem: %.3f ms\n", tot_t2 / nrun); printf("Hamming_M4 implem: %.3f ms\n", tot_t3 / nrun); } return 0; }