From 127649c0f45a791b7092f3dca22b3319789ba9da Mon Sep 17 00:00:00 2001 From: Rafik Saliev Date: Wed, 8 Jul 2026 10:00:55 -0700 Subject: [PATCH 1/2] [SVS] Add SVS Index TopK benchmark --- .../bm_basics_svs_initialize_fp32.h | 14 ++++++++++ tests/benchmark/bm_vecsim_svs.h | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/tests/benchmark/bm_initialization/bm_basics_svs_initialize_fp32.h b/tests/benchmark/bm_initialization/bm_basics_svs_initialize_fp32.h index bdbb7e007..225758018 100644 --- a/tests/benchmark/bm_initialization/bm_basics_svs_initialize_fp32.h +++ b/tests/benchmark/bm_initialization/bm_basics_svs_initialize_fp32.h @@ -54,3 +54,17 @@ BENCHMARK_REGISTER_F(BM_VecSimSVS, BM_FUNC_NAME(BM_AddVectorsDuringTraining)) {2, 4}}) ->ArgNames({"training_threshold", "thread_count"}) ->UseRealTime(); + +// TopK search on the loaded SVS index, using the search window_size and k defined below. +// {window_size, k} (recall that always window_size >= k) +BENCHMARK_TEMPLATE_DEFINE_F(BM_VecSimSVS, BM_FUNC_NAME(BM_TopK), DATA_TYPE_INDEX_T) +(benchmark::State &st) { TopK_SVS(st); } +BENCHMARK_REGISTER_F(BM_VecSimSVS, BM_FUNC_NAME(BM_TopK)) + ->Unit(benchmark::kMillisecond) + ->Iterations(10) + ->Args({10, 10}) + ->Args({200, 10}) + ->Args({100, 100}) + ->Args({200, 100}) + ->Args({500, 500}) + ->ArgNames({"window_size", "k"}); diff --git a/tests/benchmark/bm_vecsim_svs.h b/tests/benchmark/bm_vecsim_svs.h index 5acb882c0..b7628b920 100644 --- a/tests/benchmark/bm_vecsim_svs.h +++ b/tests/benchmark/bm_vecsim_svs.h @@ -54,6 +54,10 @@ class BM_VecSimSVS : public BM_VecSimGeneral { // Deletes an amount of labels from the index that triggers inplace consolidation. void RunGC(benchmark::State &st); + // TopK search benchmark. The search window size and k are provided by the benchmark + // registration. + void TopK_SVS(benchmark::State &st); + private: static const char *svs_index_tar_file; static std::string base_path; @@ -463,6 +467,29 @@ void BM_VecSimSVS::RunGC(benchmark::State &st) { ASSERT_EQ(VecSimIndex_IndexSize(tiered_index), N_VECTORS - num_deletions); } +template +void BM_VecSimSVS::TopK_SVS(benchmark::State &st) { + // Search window size (Vamana graph accuracy/latency tuning) and number of results, as + // defined by the benchmark registration. + size_t window_size = st.range(0); + size_t k = st.range(1); + + // Load the SVS index from file (update_threshold is irrelevant for a search-only benchmark). + auto *index = CreateSVSIndexFromFile(1); + + VecSimQueryParams query_params = {.svsRuntimeParams = {.windowSize = window_size}}; + + size_t iter = 0; + for (auto _ : st) { + auto results = VecSimIndex_TopKQuery(index, test_vectors[iter % N_QUERIES].data(), k, + &query_params, BY_SCORE); + VecSimQueryReply_Free(results); + iter++; + } + + VecSimIndex_Free(index); +} + #define UNIT_AND_ITERATIONS Unit(benchmark::kMillisecond)->Iterations(2) #if HAVE_SVS_LVQ From 225902cd30bb8ecb748b7b06fc2034dfbf13a182 Mon Sep 17 00:00:00 2001 From: Rafik Saliev Date: Thu, 9 Jul 2026 07:48:42 -0700 Subject: [PATCH 2/2] Try to workaround GCC 11.2.0 issue --- tests/benchmark/bm_vecsim_svs.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/benchmark/bm_vecsim_svs.h b/tests/benchmark/bm_vecsim_svs.h index b7628b920..852973a50 100644 --- a/tests/benchmark/bm_vecsim_svs.h +++ b/tests/benchmark/bm_vecsim_svs.h @@ -477,7 +477,9 @@ void BM_VecSimSVS::TopK_SVS(benchmark::State &st) { // Load the SVS index from file (update_threshold is irrelevant for a search-only benchmark). auto *index = CreateSVSIndexFromFile(1); - VecSimQueryParams query_params = {.svsRuntimeParams = {.windowSize = window_size}}; + SVSRuntimeParams svs_params = {.windowSize = window_size}; + + VecSimQueryParams query_params = {.svsRuntimeParams = svs_params}; size_t iter = 0; for (auto _ : st) {