From f339124cc1412624c2234a53f04718533998b9d4 Mon Sep 17 00:00:00 2001 From: "xufeihong.xfh" Date: Mon, 2 Mar 2026 14:43:29 +0800 Subject: [PATCH 1/5] remove vla --- src/ailego/algorithm/lloyd_cluster.h | 19 +++++----- .../math/mips_euclidean_distance_matrix.h | 37 ++++++++++--------- .../inner_product_distance_batch_impl_fp16.h | 20 +++++----- .../inner_product_distance_batch_impl_int8.h | 28 +++++++------- src/core/algorithm/hnsw/hnsw_algorithm.cc | 22 ++++++----- .../hnsw_sparse/hnsw_sparse_algorithm.cc | 12 +++--- src/core/algorithm/ivf/ivf_entity.cc | 8 ++-- ...ips_euclidean_distance_matrix_fp32_test.cc | 8 ++-- tests/ailego/math/norm_matrix_fp16_test.cc | 4 +- tests/ailego/math/norm_matrix_fp32_test.cc | 4 +- tests/ailego/math/norm_matrix_int4_test.cc | 2 +- tests/ailego/math/norm_matrix_int8_test.cc | 6 +-- .../algorithm/hnsw/hnsw_searcher_test.cpp | 8 ++-- 13 files changed, 92 insertions(+), 86 deletions(-) diff --git a/src/ailego/algorithm/lloyd_cluster.h b/src/ailego/algorithm/lloyd_cluster.h index f7f3c96f..454a63c7 100644 --- a/src/ailego/algorithm/lloyd_cluster.h +++ b/src/ailego/algorithm/lloyd_cluster.h @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -247,7 +248,7 @@ class LloydCluster { protected: //! Cluster the cache features void cluster_cache_features(void) { - float scores[BatchCount]; + std::vector scores(BatchCount); for (size_t i = 0, n = feature_cache_.count(); i != n; ++i) { size_t count = centroids_matrix_.count() / BatchCount * BatchCount; @@ -258,7 +259,7 @@ class LloydCluster { for (size_t j = 0; j != count; j += BatchCount) { ContextType::template BatchDistance<1>(centroids_matrix_[j], feature, centroids_matrix_.dimension(), - scores); + scores.data()); for (size_t k = 0; k < BatchCount; ++k) { if (scores[k] < nearest_score) { @@ -271,7 +272,7 @@ class LloydCluster { for (size_t j = count, total = centroids_matrix_.count(); j != total; ++j) { ContextType::Distance(centroids_matrix_[j], feature, - centroids_matrix_.dimension(), scores); + centroids_matrix_.dimension(), scores.data()); if (scores[0] < nearest_score) { nearest_score = scores[0]; @@ -295,8 +296,8 @@ class LloydCluster { return i < j; }; - float nearest_scores[BatchCount]; - size_t nearest_indexes[BatchCount]; + std::vector nearest_scores(BatchCount); + std::vector nearest_indexes(BatchCount); rows.resize(BatchCount); for (size_t i = first * BatchCount; i != last * BatchCount; @@ -304,14 +305,14 @@ class LloydCluster { size_t count = centroids_matrix_.count() / BatchCount * BatchCount; const StoreType *block = feature_matrix_[i]; - std::fill(nearest_indexes, nearest_indexes + BatchCount, 0); - std::fill(nearest_scores, nearest_scores + BatchCount, + std::fill(nearest_indexes.data(), nearest_indexes.data() + BatchCount, 0); + std::fill(nearest_scores.data(), nearest_scores.data() + BatchCount, std::numeric_limits::max()); for (size_t j = 0; j != count; j += BatchCount) { ContextType::template BatchDistance( centroids_matrix_[j], block, centroids_matrix_.dimension(), - &scores[0]); + scores.data()); for (size_t k = 0; k < BatchCount; ++k) { const float *start = &scores[k * BatchCount]; @@ -328,7 +329,7 @@ class LloydCluster { ++j) { ContextType::template BatchDistance<1>(block, centroids_matrix_[j], centroids_matrix_.dimension(), - &scores[0]); + scores.data()); for (size_t k = 0; k < BatchCount; ++k) { float score = scores[k]; diff --git a/src/ailego/math/mips_euclidean_distance_matrix.h b/src/ailego/math/mips_euclidean_distance_matrix.h index 666d16ce..34e9ee02 100644 --- a/src/ailego/math/mips_euclidean_distance_matrix.h +++ b/src/ailego/math/mips_euclidean_distance_matrix.h @@ -14,6 +14,7 @@ #pragma once +#include #include #include #include @@ -108,8 +109,8 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; - float v2[N]; + std::vector u2(M); + std::vector v2(N); for (size_t i = 0; i < M; ++i) { const ValueType p_val = p[i]; u2[i] = static_cast(p_val * p_val); @@ -161,8 +162,8 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; - float v2[N]; + std::vector u2(M); + std::vector v2(N); for (size_t i = 0; i < M; ++i) { const ValueType p_val = p[i]; u2[i] = static_cast(p_val * p_val); @@ -240,7 +241,7 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; + std::vector u2(M); ValueType q_val = *q++; float v2 = static_cast(q_val * q_val); for (size_t i = 0; i < M; ++i) { @@ -274,7 +275,7 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; + std::vector u2(M); ValueType q_val = *q++; float v2 = static_cast(q_val * q_val); for (size_t i = 0; i < M; ++i) { @@ -327,8 +328,8 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; - float v2[N]; + std::vector u2(M); + std::vector v2(N); const uint32_t *p_it = reinterpret_cast(p); const uint32_t *q_it = reinterpret_cast(q); for (size_t i = 0; i < M; ++i) { @@ -383,8 +384,8 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; - float v2[N]; + std::vector u2(M); + std::vector v2(N); const uint32_t *p_it = reinterpret_cast(p); const uint32_t *q_it = reinterpret_cast(q); for (size_t i = 0; i < M; ++i) { @@ -495,7 +496,7 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; + std::vector u2(M); uint32_t q_val = *q_it++; float v2 = Squared(q_val); for (size_t i = 0; i < M; ++i) { @@ -531,7 +532,7 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; + std::vector u2(M); uint32_t q_val = *q_it++; float v2 = Squared(q_val); for (size_t i = 0; i < M; ++i) { @@ -613,8 +614,8 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; - float v2[N]; + std::vector u2(M); + std::vector v2(N); const uint32_t *p_it = reinterpret_cast(p); const uint32_t *q_it = reinterpret_cast(q); for (size_t i = 0; i < M; ++i) { @@ -669,8 +670,8 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; - float v2[N]; + std::vector u2(M); + std::vector v2(N); const uint32_t *p_it = reinterpret_cast(p); const uint32_t *q_it = reinterpret_cast(q); for (size_t i = 0; i < M; ++i) { @@ -856,7 +857,7 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; + std::vector u2(M); uint32_t q_val = *q_it++; float v2 = Squared(q_val); for (size_t i = 0; i < M; ++i) { @@ -892,7 +893,7 @@ struct MipsSquaredEuclideanDistanceMatrix< return; } - float u2[M]; + std::vector u2(M); uint32_t q_val = *q_it++; float v2 = Squared(q_val); for (size_t i = 0; i < M; ++i) { diff --git a/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h b/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h index db9e81e0..a8617df8 100644 --- a/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h +++ b/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h @@ -30,7 +30,7 @@ compute_one_to_many_avx512fp16_fp16( const ailego::Float16 *query, const ailego::Float16 **ptrs, std::array &prefetch_ptrs, size_t dimensionality, float *results) { - __m512h accs[dp_batch]; + std::vector<__m512h> accs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { accs[i] = _mm512_setzero_ph(); @@ -86,7 +86,7 @@ compute_one_to_many_avx512f_fp16( const ailego::Float16 *query, const ailego::Float16 **ptrs, std::array &prefetch_ptrs, size_t dimensionality, float *results) { - __m512 accs[dp_batch]; + std::vector<__m512> accs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { accs[i] = _mm512_setzero_ps(); @@ -100,8 +100,8 @@ compute_one_to_many_avx512f_fp16( __m512 q1 = _mm512_cvtph_ps(_mm512_castsi512_si256(q)); __m512 q2 = _mm512_cvtph_ps(_mm512_extracti64x4_epi64(q, 1)); - __m512 data_regs_1[dp_batch]; - __m512 data_regs_2[dp_batch]; + std::vector<__m512> data_regs_1(dp_batch); + std::vector<__m512> data_regs_2(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { __m512i m = _mm512_loadu_si512(reinterpret_cast(ptrs[i] + dim)); @@ -126,7 +126,7 @@ compute_one_to_many_avx512f_fp16( __m512 q = _mm512_cvtph_ps( _mm256_loadu_si256(reinterpret_cast(query + dim))); - __m512 data_regs[dp_batch]; + std::vector<__m512> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm512_cvtph_ps( _mm256_loadu_si256(reinterpret_cast(ptrs[i] + dim))); @@ -136,7 +136,7 @@ compute_one_to_many_avx512f_fp16( dim += 16; } - __m256 acc_new[dp_batch]; + std::vector<__m256> acc_new(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { acc_new[i] = _mm256_add_ps( _mm512_castps512_ps256(accs[i]), @@ -176,7 +176,7 @@ compute_one_to_many_avx2_fp16( const ailego::Float16 *query, const ailego::Float16 **ptrs, std::array &prefetch_ptrs, size_t dimensionality, float *results) { - __m256 accs[dp_batch]; + std::vector<__m256> accs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { accs[i] = _mm256_setzero_ps(); @@ -190,8 +190,8 @@ compute_one_to_many_avx2_fp16( __m256 q1 = _mm256_cvtph_ps(_mm256_castsi256_si128(q)); __m256 q2 = _mm256_cvtph_ps(_mm256_extractf128_si256(q, 1)); - __m256 data_regs_1[dp_batch]; - __m256 data_regs_2[dp_batch]; + std::vector<__m256> data_regs_1(dp_batch); + std::vector<__m256> data_regs_2(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { __m256i m = _mm256_loadu_si256(reinterpret_cast(ptrs[i] + dim)); @@ -216,7 +216,7 @@ compute_one_to_many_avx2_fp16( __m256 q = _mm256_cvtph_ps( _mm_loadu_si128(reinterpret_cast(query + dim))); - __m256 data_regs[dp_batch]; + std::vector<__m256> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm256_cvtph_ps( _mm_loadu_si128(reinterpret_cast(ptrs[i] + dim))); diff --git a/src/ailego/math_batch/inner_product_distance_batch_impl_int8.h b/src/ailego/math_batch/inner_product_distance_batch_impl_int8.h index 9f49effd..3c3721fb 100644 --- a/src/ailego/math_batch/inner_product_distance_batch_impl_int8.h +++ b/src/ailego/math_batch/inner_product_distance_batch_impl_int8.h @@ -55,7 +55,7 @@ static void compute_one_to_many_avx512_vnni_int8( const int8_t *query, const int8_t **ptrs, std::array &prefetch_ptrs, size_t dimensionality, float *results) { - __m512i accs[dp_batch]; + std::vector<__m512i> accs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { accs[i] = _mm512_setzero_si512(); } @@ -63,7 +63,7 @@ static void compute_one_to_many_avx512_vnni_int8( for (; dim + 64 <= dimensionality; dim += 64) { __m512i q = _mm512_loadu_si512(reinterpret_cast(query + dim)); - __m512i data_regs[dp_batch]; + std::vector<__m512i> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm512_loadu_si512(reinterpret_cast(ptrs[i] + dim)); @@ -100,12 +100,12 @@ static void compute_one_to_many_avx512_vnni_int8( // const int8_t *query, const int8_t **ptrs, // std::array &prefetch_ptrs, size_t // dimensionality, float *results) { -// __m512i accs[dp_batch]; +// std::vector<__m512i> accs(dp_batch); // size_t dim = 0; // for (; dim + 64 <= dimensionality; dim += 64) { // __m512i q = // _mm512_loadu_si512(reinterpret_cast(query + dim)); -// __m512i data_regs[dp_batch]; +// std::vector<__m512i> data_regs(dp_batch); // for (size_t i = 0; i < dp_batch; ++i) { // data_regs[i] = // _mm512_loadu_si512(reinterpret_cast(ptrs[i] + @@ -118,16 +118,16 @@ static void compute_one_to_many_avx512_vnni_int8( // } // __m512i q_lo = _mm512_cvtepi8_epi16(_mm512_extracti64x4_epi64(q, 0)); // __m512i q_hi = _mm512_cvtepi8_epi16(_mm512_extracti64x4_epi64(q, 1)); -// __m512i data_lo[dp_batch]; -// __m512i data_hi[dp_batch]; +// std::vector<__m512i> data_lo(dp_batch); +// std::vector<__m512i> data_hi(dp_batch); // for (size_t i = 0; i < dp_batch; ++i) { // data_lo[i] = // _mm512_cvtepi8_epi16(_mm512_extracti64x4_epi64(data_regs[i], 0)); // data_hi[i] = // _mm512_cvtepi8_epi16(_mm512_extracti64x4_epi64(data_regs[i], 1)); // } -// __m512i prod_lo[dp_batch]; -// __m512i prod_hi[dp_batch]; +// std::vector<__m512i> prod_lo(dp_batch); +// std::vector<__m512i> prod_hi(dp_batch); // for (size_t i = 0; i < dp_batch; ++i) { // prod_lo[i] = _mm512_madd_epi16(q_lo, data_lo[i]); // prod_hi[i] = _mm512_madd_epi16(q_hi, data_hi[i]); @@ -163,14 +163,14 @@ compute_one_to_many_avx2_int8( const int8_t *query, const int8_t **ptrs, std::array &prefetch_ptrs, size_t dimensionality, float *results) { - __m256i accs[dp_batch]; + std::vector<__m256i> accs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { accs[i] = _mm256_setzero_si256(); } size_t dim = 0; for (; dim + 32 <= dimensionality; dim += 32) { __m256i q = _mm256_loadu_si256((const __m256i *)(query + dim)); - __m256i data_regs[dp_batch]; + std::vector<__m256i> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm256_loadu_si256((const __m256i *)(ptrs[i] + dim)); } @@ -181,15 +181,15 @@ compute_one_to_many_avx2_int8( } __m256i q_lo = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(q)); __m256i q_hi = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(q, 1)); - __m256i data_lo[dp_batch]; - __m256i data_hi[dp_batch]; + std::vector<__m256i> data_lo(dp_batch); + std::vector<__m256i> data_hi(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_lo[i] = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(data_regs[i])); data_hi[i] = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(data_regs[i], 1)); } - __m256i prod_lo[dp_batch]; - __m256i prod_hi[dp_batch]; + std::vector<__m256i> prod_lo(dp_batch); + std::vector<__m256i> prod_hi(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { prod_lo[i] = _mm256_madd_epi16(q_lo, data_lo[i]); prod_hi[i] = _mm256_madd_epi16(q_hi, data_hi[i]); diff --git a/src/core/algorithm/hnsw/hnsw_algorithm.cc b/src/core/algorithm/hnsw/hnsw_algorithm.cc index 955d2f4c..fa553f55 100644 --- a/src/core/algorithm/hnsw/hnsw_algorithm.cc +++ b/src/core/algorithm/hnsw/hnsw_algorithm.cc @@ -14,6 +14,7 @@ #include "hnsw_algorithm.h" #include #include +#include #include namespace zvec { @@ -132,13 +133,13 @@ void HnswAlgorithm::select_entry_point(level_t level, node_id_t *entry_point, bool find_closer = false; - float dists[size]; - const void *neighbor_vecs[size]; + std::vector dists(size); + std::vector neighbor_vecs(size); for (uint32_t i = 0; i < size; ++i) { neighbor_vecs[i] = neighbor_vec_blocks[i].data(); } - dc.batch_dist(neighbor_vecs, size, dists); + dc.batch_dist(neighbor_vecs.data(), size, dists.data()); for (uint32_t i = 0; i < size; ++i) { dist_t cur_dist = dists[i]; @@ -213,7 +214,7 @@ void HnswAlgorithm::search_neighbors(level_t level, node_id_t *entry_point, (*ctx->mutable_stats_get_neighbors())++; } - node_id_t neighbor_ids[neighbors.size()]; + std::vector neighbor_ids(neighbors.size()); uint32_t size = 0; for (uint32_t i = 0; i < neighbors.size(); ++i) { node_id_t node = neighbors[i]; @@ -231,7 +232,7 @@ void HnswAlgorithm::search_neighbors(level_t level, node_id_t *entry_point, } std::vector neighbor_vec_blocks; - int ret = entity.get_vector(neighbor_ids, size, neighbor_vec_blocks); + int ret = entity.get_vector(neighbor_ids.data(), size, neighbor_vec_blocks); if (ailego_unlikely(ctx->debugging())) { (*ctx->mutable_stats_get_vector())++; } @@ -247,14 +248,14 @@ void HnswAlgorithm::search_neighbors(level_t level, node_id_t *entry_point, } // done - float dists[size]; - const void *neighbor_vecs[size]; + std::vector dists(size); + std::vector neighbor_vecs(size); for (uint32_t i = 0; i < size; ++i) { neighbor_vecs[i] = neighbor_vec_blocks[i].data(); } - dc.batch_dist(neighbor_vecs, size, dists); + dc.batch_dist(neighbor_vecs.data(), size, dists.data()); for (uint32_t i = 0; i < size; ++i) { node_id_t node = neighbor_ids[i]; @@ -336,7 +337,7 @@ void HnswAlgorithm::expand_neighbors_by_group(TopkHeap &topk, (*ctx->mutable_stats_get_neighbors())++; } - node_id_t neighbor_ids[neighbors.size()]; + std::vector neighbor_ids(neighbors.size()); uint32_t size = 0; for (uint32_t i = 0; i < neighbors.size(); ++i) { node_id_t node = neighbors[i]; @@ -354,7 +355,8 @@ void HnswAlgorithm::expand_neighbors_by_group(TopkHeap &topk, } std::vector neighbor_vec_blocks; - int ret = entity.get_vector(neighbor_ids, size, neighbor_vec_blocks); + int ret = + entity.get_vector(neighbor_ids.data(), size, neighbor_vec_blocks); if (ailego_unlikely(ctx->debugging())) { (*ctx->mutable_stats_get_vector())++; } diff --git a/src/core/algorithm/hnsw_sparse/hnsw_sparse_algorithm.cc b/src/core/algorithm/hnsw_sparse/hnsw_sparse_algorithm.cc index 99b8058f..7538dfc8 100644 --- a/src/core/algorithm/hnsw_sparse/hnsw_sparse_algorithm.cc +++ b/src/core/algorithm/hnsw_sparse/hnsw_sparse_algorithm.cc @@ -15,6 +15,7 @@ #include "hnsw_sparse_algorithm.h" #include #include +#include #include namespace zvec { @@ -208,7 +209,7 @@ void HnswSparseAlgorithm::search_neighbors(level_t level, (*ctx->mutable_stats_get_neighbors())++; } - node_id_t neighbor_ids[neighbors.size()]; + std::vector neighbor_ids(neighbors.size()); uint32_t size = 0; for (uint32_t i = 0; i < neighbors.size(); ++i) { node_id_t node = neighbors[i]; @@ -226,7 +227,8 @@ void HnswSparseAlgorithm::search_neighbors(level_t level, } std::vector neighbor_block_vecs; - int ret = entity.get_vector_metas(neighbor_ids, size, neighbor_block_vecs); + int ret = + entity.get_vector_metas(neighbor_ids.data(), size, neighbor_block_vecs); if (ailego_unlikely(ctx->debugging())) { (*ctx->mutable_stats_get_vector())++; } @@ -337,7 +339,7 @@ void HnswSparseAlgorithm::expand_neighbors_by_group( (*ctx->mutable_stats_get_neighbors())++; } - node_id_t neighbor_ids[neighbors.size()]; + std::vector neighbor_ids(neighbors.size()); uint32_t size = 0; for (uint32_t i = 0; i < neighbors.size(); ++i) { node_id_t node = neighbors[i]; @@ -355,8 +357,8 @@ void HnswSparseAlgorithm::expand_neighbors_by_group( } std::vector neighbor_block_vecs; - int ret = - entity.get_vector_metas(neighbor_ids, size, neighbor_block_vecs); + int ret = entity.get_vector_metas(neighbor_ids.data(), size, + neighbor_block_vecs); if (ailego_unlikely(ctx->debugging())) { (*ctx->mutable_stats_get_vector())++; } diff --git a/src/core/algorithm/ivf/ivf_entity.cc b/src/core/algorithm/ivf/ivf_entity.cc index b096c92d..6dccc2b2 100644 --- a/src/core/algorithm/ivf/ivf_entity.cc +++ b/src/core/algorithm/ivf/ivf_entity.cc @@ -595,7 +595,7 @@ int IVFEntity::search(size_t inverted_list_id, const void *query, const void *data = nullptr; const size_t block_vecs = header_.block_vector_count; - float distances[block_vecs]; + std::vector distances(block_vecs); const size_t batch_size = kBatchBlocks; const size_t block_size = header_.block_size; const auto norm_val = this->inverted_list_normalize_value(inverted_list_id); @@ -639,7 +639,7 @@ int IVFEntity::search(size_t inverted_list_id, const void *query, const void *block_data = static_cast(data) + b * block_size; calculator_->query_features_distance(query, block_data, vecs_count, - distances); + distances.data()); *(context_stats->mutable_dist_calced_count()) += vecs_count; @@ -669,7 +669,7 @@ int IVFEntity::search(size_t inverted_list_id, const void *query, const void *data = nullptr; const size_t block_vecs = header_.block_vector_count; - float distances[block_vecs]; + std::vector distances(block_vecs); const size_t batch_size = kBatchBlocks; const size_t block_size = header_.block_size; const auto norm_val = this->inverted_list_normalize_value(inverted_list_id); @@ -700,7 +700,7 @@ int IVFEntity::search(size_t inverted_list_id, const void *query, auto block_keys = keys + b * block_vecs; const void *block_data = static_cast(data) + b * block_size; calculator_->query_features_distance(query, block_data, vecs_count, - distances); + distances.data()); for (size_t k = 0; k < vecs_count; ++k) { if (block_keys[k] != kInvalidKey) { uint32_t id = list_meta->id_offset + (i + b) * block_vecs + k; diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc index cb2a58c7..a22ff40c 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc @@ -417,7 +417,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -446,7 +446,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; MipsSquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, m_val, e2, results); + matrix_batch, &query2[0], dimension, m_val, e2, results.data()); } std::cout << "* N Batched MipsSquaredEuclidean(RepeatedQuadraticInjection) (us) \t" @@ -873,7 +873,7 @@ void MipsSphericalInjectionBenchMarkk(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -901,7 +901,7 @@ void MipsSphericalInjectionBenchMarkk(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; MipsSquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, e2, results); + matrix_batch, &query2[0], dimension, e2, results.data()); } std::cout << "* N Batched MipsSquaredEuclidean(SphericalInjection) (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/norm_matrix_fp16_test.cc b/tests/ailego/math/norm_matrix_fp16_test.cc index e68a3b07..bc4dacd0 100644 --- a/tests/ailego/math/norm_matrix_fp16_test.cc +++ b/tests/ailego/math/norm_matrix_fp16_test.cc @@ -251,7 +251,7 @@ void Norm1Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; @@ -302,7 +302,7 @@ void Norm2Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; diff --git a/tests/ailego/math/norm_matrix_fp32_test.cc b/tests/ailego/math/norm_matrix_fp32_test.cc index 494827b4..38a476ec 100644 --- a/tests/ailego/math/norm_matrix_fp32_test.cc +++ b/tests/ailego/math/norm_matrix_fp32_test.cc @@ -247,7 +247,7 @@ void Norm1Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; @@ -298,7 +298,7 @@ void Norm2Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; diff --git a/tests/ailego/math/norm_matrix_int4_test.cc b/tests/ailego/math/norm_matrix_int4_test.cc index 7dc69cf7..6822695f 100644 --- a/tests/ailego/math/norm_matrix_int4_test.cc +++ b/tests/ailego/math/norm_matrix_int4_test.cc @@ -150,7 +150,7 @@ void Norm2Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") INT4 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; diff --git a/tests/ailego/math/norm_matrix_int8_test.cc b/tests/ailego/math/norm_matrix_int8_test.cc index 483800c7..e8571d8f 100644 --- a/tests/ailego/math/norm_matrix_int8_test.cc +++ b/tests/ailego/math/norm_matrix_int8_test.cc @@ -199,7 +199,7 @@ void Norm1Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; @@ -251,7 +251,7 @@ void Norm2Benchmark(void) { } ElapsedTime elapsed_time; - float results[batch_size]; + std::vector results(batch_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << block_size << std::endl; @@ -261,7 +261,7 @@ void Norm2Benchmark(void) { for (size_t i = 0; i < block_size; ++i) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; Norm2Matrix::Compute(matrix_batch, dimension, - &results[0]); + results.data()); } std::cout << "* Batched Norm2 (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/core/algorithm/hnsw/hnsw_searcher_test.cpp b/tests/core/algorithm/hnsw/hnsw_searcher_test.cpp index c9585d96..d3a7004f 100644 --- a/tests/core/algorithm/hnsw/hnsw_searcher_test.cpp +++ b/tests/core/algorithm/hnsw/hnsw_searcher_test.cpp @@ -453,11 +453,11 @@ TEST_F(HnswSearcherTest, TestGeneral) { // do linear search test { - float query[dim]; + std::vector query(dim); for (size_t i = 0; i < dim; ++i) { query[i] = 3.1f; } - ASSERT_EQ(0, searcher->search_bf_impl(query, qmeta, linearCtx)); + ASSERT_EQ(0, searcher->search_bf_impl(query.data(), qmeta, linearCtx)); auto &linearResult = linearCtx->result(); ASSERT_EQ(3UL, linearResult[0].key()); ASSERT_EQ(4UL, linearResult[1].key()); @@ -477,11 +477,11 @@ TEST_F(HnswSearcherTest, TestGeneral) { p_keys.resize(1); p_keys[0] = {8, 9, 10, 11, 3, 2, 1, 0}; { - float query[dim]; + std::vector query(dim); for (size_t i = 0; i < dim; ++i) { query[i] = 3.1f; } - ASSERT_EQ(0, searcher->search_bf_by_p_keys_impl(query, p_keys, qmeta, + ASSERT_EQ(0, searcher->search_bf_by_p_keys_impl(query.data(), p_keys, qmeta, linearByPKeysCtx)); auto &linearByPKeysResult = linearByPKeysCtx->result(); ASSERT_EQ(8, linearByPKeysResult.size()); From 59c613adea552ae96536613013daaedbbeffc99b Mon Sep 17 00:00:00 2001 From: "xufeihong.xfh" Date: Mon, 2 Mar 2026 17:06:54 +0800 Subject: [PATCH 2/5] update --- src/core/algorithm/hnsw/hnsw_entity.cc | 22 ++++----- .../algorithm/hnsw/hnsw_streamer_entity.cc | 4 +- .../hnsw_sparse/hnsw_sparse_entity.cc | 14 +++--- .../hnsw_sparse_streamer_entity.cc | 4 +- .../math/cosine_distance_matrix_fp16_test.cc | 4 +- .../math/cosine_distance_matrix_fp32_test.cc | 4 +- .../math/cosine_distance_matrix_int8_test.cc | 4 +- .../euclidean_distance_matrix_fp16_test.cc | 8 ++-- .../euclidean_distance_matrix_fp32_test.cc | 8 ++-- .../euclidean_distance_matrix_int4_test.cc | 8 ++-- .../euclidean_distance_matrix_int8_test.cc | 8 ++-- .../math/hamming_distance_matrix_test.cc | 8 ++-- .../math/inner_product_matrix_fp16_test.cc | 8 ++-- .../math/inner_product_matrix_fp32_test.cc | 8 ++-- .../math/inner_product_matrix_int4_test.cc | 4 +- .../math/inner_product_matrix_int8_test.cc | 8 ++-- ...ips_euclidean_distance_matrix_fp16_test.cc | 26 ++++++----- ...ips_euclidean_distance_matrix_fp32_test.cc | 45 ++++++++++--------- ...ips_euclidean_distance_matrix_int4_test.cc | 45 ++++++++++--------- ...ips_euclidean_distance_matrix_int8_test.cc | 24 +++++----- .../ailego/parallel/multi_thread_list_test.cc | 8 ++-- tests/ailego/parallel/semaphore_test.cc | 4 +- .../core/algorithm/flat/flat_streamer_test.cc | 8 ++-- .../core/algorithm/hnsw/hnsw_streamer_test.cc | 20 ++++----- tests/db/index/storage/wal_file_test.cc | 4 +- 25 files changed, 163 insertions(+), 145 deletions(-) diff --git a/src/core/algorithm/hnsw/hnsw_entity.cc b/src/core/algorithm/hnsw/hnsw_entity.cc index 24a3af56..e0716e1e 100644 --- a/src/core/algorithm/hnsw/hnsw_entity.cc +++ b/src/core/algorithm/hnsw/hnsw_entity.cc @@ -172,8 +172,8 @@ int64_t HnswEntity::dump_vectors( size_t padding_size = AlignSize(vector_dump_size) - vector_dump_size; - char padding[padding_size]; - memset(padding, 0, sizeof(padding)); + std::vector padding(padding_size); + memset(padding.data(), 0, sizeof(char) * padding_size); const void *data = nullptr; uint32_t crc = 0U; size_t vecs_size = 0UL; @@ -198,12 +198,12 @@ int64_t HnswEntity::dump_vectors( continue; } - len = dumper->write(padding, padding_size); + len = dumper->write(padding.data(), padding_size); if (len != padding_size) { LOG_ERROR("Dump vectors failed, write=%zu expect=%zu", len, padding_size); return IndexError_WriteData; } - crc = ailego::Crc32c::Hash(padding, padding_size, crc); + crc = ailego::Crc32c::Hash(padding.data(), padding_size, crc); vecs_size += padding_size; } @@ -224,7 +224,7 @@ int64_t HnswEntity::dump_graph_neighbors( graph_meta.reserve(doc_cnt()); size_t offset = 0; uint32_t crc = 0; - node_id_t mapping[l0_neighbor_cnt()]; + std::vector mapping(l0_neighbor_cnt()); uint32_t min_neighbor_count = 10000; uint32_t max_neighbor_count = 0; @@ -253,7 +253,7 @@ int64_t HnswEntity::dump_graph_neighbors( for (node_id_t i = 0; i < neighbors.size(); ++i) { mapping[i] = neighbor_mapping[neighbors[i]]; } - data = mapping; + data = mapping.data(); } if (dumper->write(data, size) != size) { LOG_ERROR("Dump graph neighbor id=%u failed, size %lu", id, size); @@ -303,7 +303,7 @@ int64_t HnswEntity::dump_upper_neighbors( hnsw_meta.reserve(doc_cnt()); size_t offset = 0; uint32_t crc = 0; - node_id_t buffer[upper_neighbor_cnt() + 1]; + std::vector buffer(upper_neighbor_cnt() + 1); for (node_id_t id = 0; id < doc_cnt(); ++id) { node_id_t new_id = reorder_mapping.empty() ? id : reorder_mapping[id]; auto level = get_level(new_id); @@ -318,7 +318,7 @@ int64_t HnswEntity::dump_upper_neighbors( ailego_assert_with(!!neighbors.data, "invalid neighbors"); ailego_assert_with(neighbors.size() <= neighbor_cnt(cur_level), "invalid neighbors"); - memset(buffer, 0, sizeof(buffer)); + memset(buffer.data(), 0, sizeof(node_id_t) * buffer.size()); buffer[0] = neighbors.size(); if (neighbor_mapping.empty()) { memcpy(&buffer[1], &neighbors[0], neighbors.size() * sizeof(node_id_t)); @@ -327,12 +327,14 @@ int64_t HnswEntity::dump_upper_neighbors( buffer[i + 1] = neighbor_mapping[neighbors[i]]; } } - if (dumper->write(buffer, sizeof(buffer)) != sizeof(buffer)) { + if (dumper->write(buffer.data(), sizeof(node_id_t) * buffer.size()) != + sizeof(node_id_t) * buffer.size()) { LOG_ERROR("Dump graph neighbor id=%u failed, size %lu", id, sizeof(buffer)); return IndexError_WriteData; } - crc = ailego::Crc32c::Hash(buffer, sizeof(buffer), crc); + crc = ailego::Crc32c::Hash(buffer.data(), + sizeof(node_id_t) * buffer.size(), crc); offset += sizeof(buffer); } } diff --git a/src/core/algorithm/hnsw/hnsw_streamer_entity.cc b/src/core/algorithm/hnsw/hnsw_streamer_entity.cc index feafa573..71e2e477 100644 --- a/src/core/algorithm/hnsw/hnsw_streamer_entity.cc +++ b/src/core/algorithm/hnsw/hnsw_streamer_entity.cc @@ -80,8 +80,8 @@ int HnswStreamerEntity::cleanup() { int HnswStreamerEntity::update_neighbors( level_t level, node_id_t id, const std::vector> &neighbors) { - char buffer[neighbor_size_]; - NeighborsHeader *hd = reinterpret_cast(buffer); + std::vector buffer(neighbor_size_); + NeighborsHeader *hd = reinterpret_cast(buffer.data()); hd->neighbor_cnt = neighbors.size(); size_t i = 0; for (; i < neighbors.size(); ++i) { diff --git a/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc b/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc index fd88720e..64eaa8b4 100644 --- a/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc +++ b/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc @@ -299,7 +299,7 @@ int64_t HnswSparseEntity::dump_graph_neighbors( graph_meta.reserve(doc_cnt()); size_t offset = 0; uint32_t crc = 0; - node_id_t mapping[l0_neighbor_cnt()]; + std::vector mapping(l0_neighbor_cnt()); uint32_t min_neighbor_count = 10000; uint32_t max_neighbor_count = 0; @@ -328,7 +328,7 @@ int64_t HnswSparseEntity::dump_graph_neighbors( for (node_id_t i = 0; i < neighbors.size(); ++i) { mapping[i] = neighbor_mapping[neighbors[i]]; } - data = mapping; + data = mapping.data(); } if (dumper->write(data, size) != size) { LOG_ERROR("Dump graph neighbor id=%u failed, size %lu", id, size); @@ -380,7 +380,7 @@ int64_t HnswSparseEntity::dump_upper_neighbors( hnsw_meta.reserve(doc_cnt()); size_t offset = 0; uint32_t crc = 0; - node_id_t buffer[upper_neighbor_cnt() + 1]; + std::vector buffer(upper_neighbor_cnt() + 1); for (node_id_t id = 0; id < doc_cnt(); ++id) { node_id_t new_id = reorder_mapping.empty() ? id : reorder_mapping[id]; auto level = get_level(new_id); @@ -395,7 +395,7 @@ int64_t HnswSparseEntity::dump_upper_neighbors( ailego_assert_with(!!neighbors.data, "invalid neighbors"); ailego_assert_with(neighbors.size() <= neighbor_cnt(cur_level), "invalid neighbors"); - memset(buffer, 0, sizeof(buffer)); + memset(buffer.data(), 0, sizeof(node_id_t) * buffer.size()); buffer[0] = neighbors.size(); if (neighbor_mapping.empty()) { memcpy(&buffer[1], &neighbors[0], neighbors.size() * sizeof(node_id_t)); @@ -404,12 +404,14 @@ int64_t HnswSparseEntity::dump_upper_neighbors( buffer[i + 1] = neighbor_mapping[neighbors[i]]; } } - if (dumper->write(buffer, sizeof(buffer)) != sizeof(buffer)) { + if (dumper->write(buffer.data(), sizeof(node_id_t) * buffer.size()) != + sizeof(node_id_t) * buffer.size()) { LOG_ERROR("Dump graph neighbor id=%u failed, size %lu", id, sizeof(buffer)); return IndexError_WriteData; } - crc = ailego::Crc32c::Hash(buffer, sizeof(buffer), crc); + crc = ailego::Crc32c::Hash(buffer.data(), + sizeof(node_id_t) * buffer.size(), crc); offset += sizeof(buffer); } } diff --git a/src/core/algorithm/hnsw_sparse/hnsw_sparse_streamer_entity.cc b/src/core/algorithm/hnsw_sparse/hnsw_sparse_streamer_entity.cc index b60fe4e1..aaffd9c1 100644 --- a/src/core/algorithm/hnsw_sparse/hnsw_sparse_streamer_entity.cc +++ b/src/core/algorithm/hnsw_sparse/hnsw_sparse_streamer_entity.cc @@ -84,8 +84,8 @@ int HnswSparseStreamerEntity::cleanup() { int HnswSparseStreamerEntity::update_neighbors( level_t level, node_id_t id, const std::vector> &neighbors) { - char buffer[neighbor_size_]; - NeighborsHeader *hd = reinterpret_cast(buffer); + std::vector buffer(neighbor_size_); + NeighborsHeader *hd = reinterpret_cast(buffer.data()); hd->neighbor_cnt = neighbors.size(); size_t i = 0; for (; i < neighbors.size(); ++i) { diff --git a/tests/ailego/math/cosine_distance_matrix_fp16_test.cc b/tests/ailego/math/cosine_distance_matrix_fp16_test.cc index be575ce0..fc1705c7 100644 --- a/tests/ailego/math/cosine_distance_matrix_fp16_test.cc +++ b/tests/ailego/math/cosine_distance_matrix_fp16_test.cc @@ -387,7 +387,7 @@ void CosineBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -415,7 +415,7 @@ void CosineBenchmark(void) { const Float16 *matrix_batch = &matrix2[i * batch_size * dimension]; CosineDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Cosine (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/cosine_distance_matrix_fp32_test.cc b/tests/ailego/math/cosine_distance_matrix_fp32_test.cc index 4e7c2ccf..9987f8ef 100644 --- a/tests/ailego/math/cosine_distance_matrix_fp32_test.cc +++ b/tests/ailego/math/cosine_distance_matrix_fp32_test.cc @@ -323,7 +323,7 @@ void CosineBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -351,7 +351,7 @@ void CosineBenchmark(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; CosineDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Cosine (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/cosine_distance_matrix_int8_test.cc b/tests/ailego/math/cosine_distance_matrix_int8_test.cc index 0ef36a6e..ea0cf1a1 100644 --- a/tests/ailego/math/cosine_distance_matrix_int8_test.cc +++ b/tests/ailego/math/cosine_distance_matrix_int8_test.cc @@ -343,7 +343,7 @@ void CosineBenchmark(void) { dimension / 4, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -371,7 +371,7 @@ void CosineBenchmark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; CosineDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Cosine (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/euclidean_distance_matrix_fp16_test.cc b/tests/ailego/math/euclidean_distance_matrix_fp16_test.cc index 6d647c3c..c1a5ca45 100644 --- a/tests/ailego/math/euclidean_distance_matrix_fp16_test.cc +++ b/tests/ailego/math/euclidean_distance_matrix_fp16_test.cc @@ -550,7 +550,7 @@ void EuclideanBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -578,7 +578,7 @@ void EuclideanBenchmark(void) { const Float16 *matrix_batch = &matrix2[i * batch_size * dimension]; EuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Euclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -634,7 +634,7 @@ void SquaredEuclideanBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -662,7 +662,7 @@ void SquaredEuclideanBenchmark(void) { const Float16 *matrix_batch = &matrix2[i * batch_size * dimension]; SquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched SquaredEuclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/euclidean_distance_matrix_fp32_test.cc b/tests/ailego/math/euclidean_distance_matrix_fp32_test.cc index 10fe3da6..cd46f703 100644 --- a/tests/ailego/math/euclidean_distance_matrix_fp32_test.cc +++ b/tests/ailego/math/euclidean_distance_matrix_fp32_test.cc @@ -540,7 +540,7 @@ void EuclideanBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -568,7 +568,7 @@ void EuclideanBenchmark(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; EuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Euclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -624,7 +624,7 @@ void SquaredEuclideanBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -652,7 +652,7 @@ void SquaredEuclideanBenchmark(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; SquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched SquaredEuclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/euclidean_distance_matrix_int4_test.cc b/tests/ailego/math/euclidean_distance_matrix_int4_test.cc index 94c1bd0f..89476fd3 100644 --- a/tests/ailego/math/euclidean_distance_matrix_int4_test.cc +++ b/tests/ailego/math/euclidean_distance_matrix_int4_test.cc @@ -487,7 +487,7 @@ void EuclideanBenchmark(void) { query1.data(), dimension / 8, &query2[0]); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT4 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -515,7 +515,7 @@ void EuclideanBenchmark(void) { const uint8_t *matrix_batch = &matrix2[i * batch_size * dimension / 2]; EuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Euclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -572,7 +572,7 @@ void SquaredEuclideanBenchmark(void) { query1.data(), dimension / 8, &query2[0]); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT4 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -600,7 +600,7 @@ void SquaredEuclideanBenchmark(void) { const uint8_t *matrix_batch = &matrix2[i * batch_size * dimension / 2]; SquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched SquaredEuclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/euclidean_distance_matrix_int8_test.cc b/tests/ailego/math/euclidean_distance_matrix_int8_test.cc index 6fd003b2..9fd3fbc8 100644 --- a/tests/ailego/math/euclidean_distance_matrix_int8_test.cc +++ b/tests/ailego/math/euclidean_distance_matrix_int8_test.cc @@ -764,7 +764,7 @@ void EuclideanBenchmark(void) { dimension / 4, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -792,7 +792,7 @@ void EuclideanBenchmark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; EuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched Euclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -850,7 +850,7 @@ void SquaredEuclideanBenchmark(void) { dimension / 4, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -878,7 +878,7 @@ void SquaredEuclideanBenchmark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; SquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched SquaredEuclidean (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/hamming_distance_matrix_test.cc b/tests/ailego/math/hamming_distance_matrix_test.cc index 3c423815..364a1923 100644 --- a/tests/ailego/math/hamming_distance_matrix_test.cc +++ b/tests/ailego/math/hamming_distance_matrix_test.cc @@ -504,7 +504,7 @@ void Hamming32Benchmark(void) { MatrixTranspose(&query2[0], query1.data(), count, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") UINT32 " << count << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -532,7 +532,7 @@ void Hamming32Benchmark(void) { const uint32_t *matrix_batch = &matrix2[i * batch_size * count]; HammingDistanceMatrix::Compute( - matrix_batch, &query2[0], count * 32, results); + matrix_batch, &query2[0], count * 32, results.data()); } std::cout << "* N Batched Hamming (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -1001,7 +1001,7 @@ void Hamming64Benchmark(void) { MatrixTranspose(&query2[0], query1.data(), count, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") UINT64 " << count << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -1029,7 +1029,7 @@ void Hamming64Benchmark(void) { const uint64_t *matrix_batch = &matrix2[i * batch_size * count]; HammingDistanceMatrix::Compute( - matrix_batch, &query2[0], count * 64, results); + matrix_batch, &query2[0], count * 64, results.data()); } std::cout << "* N Batched Hamming (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/inner_product_matrix_fp16_test.cc b/tests/ailego/math/inner_product_matrix_fp16_test.cc index 2d3999c0..8bfd851a 100644 --- a/tests/ailego/math/inner_product_matrix_fp16_test.cc +++ b/tests/ailego/math/inner_product_matrix_fp16_test.cc @@ -652,7 +652,7 @@ void InnerProductBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -680,7 +680,7 @@ void InnerProductBenchmark(void) { const Float16 *matrix_batch = &matrix2[i * batch_size * dimension]; InnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched InnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -736,7 +736,7 @@ void MinusInnerProductBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -764,7 +764,7 @@ void MinusInnerProductBenchmark(void) { const Float16 *matrix_batch = &matrix2[i * batch_size * dimension]; MinusInnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched MinusInnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/inner_product_matrix_fp32_test.cc b/tests/ailego/math/inner_product_matrix_fp32_test.cc index 1c3377fa..b247c870 100644 --- a/tests/ailego/math/inner_product_matrix_fp32_test.cc +++ b/tests/ailego/math/inner_product_matrix_fp32_test.cc @@ -623,7 +623,7 @@ void InnerProductBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -651,7 +651,7 @@ void InnerProductBenchmark(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; InnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched InnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -707,7 +707,7 @@ void MinusInnerProductBenchmark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP32 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -735,7 +735,7 @@ void MinusInnerProductBenchmark(void) { const float *matrix_batch = &matrix2[i * batch_size * dimension]; MinusInnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched MinusInnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/inner_product_matrix_int4_test.cc b/tests/ailego/math/inner_product_matrix_int4_test.cc index 04a540bf..dbc8fdcb 100644 --- a/tests/ailego/math/inner_product_matrix_int4_test.cc +++ b/tests/ailego/math/inner_product_matrix_int4_test.cc @@ -488,7 +488,7 @@ void InnerProductBenchmark(void) { query1.data(), dimension / 8, &query2[0]); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT4 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -516,7 +516,7 @@ void InnerProductBenchmark(void) { const uint8_t *matrix_batch = &matrix2[i * batch_size * dimension / 2]; InnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched InnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/inner_product_matrix_int8_test.cc b/tests/ailego/math/inner_product_matrix_int8_test.cc index b47f23eb..ccfff5eb 100644 --- a/tests/ailego/math/inner_product_matrix_int8_test.cc +++ b/tests/ailego/math/inner_product_matrix_int8_test.cc @@ -534,7 +534,7 @@ void InnerProductBenchmark(void) { dimension / 4, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -562,7 +562,7 @@ void InnerProductBenchmark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; InnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched InnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; @@ -620,7 +620,7 @@ void MinusInnerProductBenchmark(void) { dimension / 4, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -648,7 +648,7 @@ void MinusInnerProductBenchmark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; MinusInnerProductMatrix::Compute( - matrix_batch, &query2[0], dimension, results); + matrix_batch, &query2[0], dimension, results.data()); } std::cout << "* N Batched MinusInnerProduct (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc index 8175bcbd..7dc034aa 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc @@ -58,7 +58,7 @@ static float MipsSquaredEuclideanDistance(const FixedVector &lhs, static float ConvertAndComputeByMips(const Float16 *lhs, const Float16 *rhs, size_t dim, size_t m_value, float e2) { float squ = 0.0f; - float lhs_vec[dim + m_value]; + std::vector lhs_vec(dim + m_value); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; ++i) { float val = lhs[i] * eta; @@ -69,7 +69,7 @@ static float ConvertAndComputeByMips(const Float16 *lhs, const Float16 *rhs, lhs_vec[i] = 0.5f - squ; squ *= squ; } - float rhs_vec[dim + m_value]; + std::vector rhs_vec(dim + m_value); squ = 0.0f; for (size_t i = 0; i < dim; ++i) { float val = rhs[i] * eta; @@ -80,7 +80,8 @@ static float ConvertAndComputeByMips(const Float16 *lhs, const Float16 *rhs, rhs_vec[i] = 0.5f - squ; squ *= squ; } - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + m_value); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + m_value); } template @@ -432,7 +433,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -465,7 +466,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { query_size>::Compute(matrix_batch, &query2[0], dimension, m_val, - e2, results); + e2, results.data()); } std::cout << "* N Batched MipsSquaredEuclideanDistance(RepeatedQuadraticInjection) " @@ -539,7 +540,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const Float16 *lhs, const Float16 *rhs, size_t dim, float e2) { float squ = 0.0f; - float lhs_vec[dim + 1]; + std::vector lhs_vec(dim + 1); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; ++i) { float val = lhs[i] * eta; @@ -547,10 +548,10 @@ static float ConvertAndComputeByMips(const Float16 *lhs, const Float16 *rhs, squ += val * val; } float norm2; - ailego::SquaredNorm2Matrix::Compute(lhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(lhs_vec.data(), dim, &norm2); lhs_vec[dim] = std::sqrt(1 - norm2); - float rhs_vec[dim + 1]; + std::vector rhs_vec(dim + 1); squ = 0.0f; for (size_t i = 0; i < dim; ++i) { float val = rhs[i] * eta; @@ -558,9 +559,10 @@ static float ConvertAndComputeByMips(const Float16 *lhs, const Float16 *rhs, squ += val * val; } std::cout << "squ: " << squ << std::endl; - ailego::SquaredNorm2Matrix::Compute(rhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(rhs_vec.data(), dim, &norm2); rhs_vec[dim] = std::sqrt(1 - norm2); - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + 1); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + 1); } template @@ -897,7 +899,7 @@ void MipsSphericalInjectionBenchMarkk(void) { MatrixTranspose(&query2[0], query1.data(), dimension, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") FP16 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -928,7 +930,7 @@ void MipsSphericalInjectionBenchMarkk(void) { query_size>::Compute(matrix_batch, &query2[0], dimension, e2, - results); + results.data()); } std::cout << "* N Batched MipsSquaredEuclidean(SphericalInjection) (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc index a22ff40c..20b568a4 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_fp32_test.cc @@ -56,7 +56,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const float *lhs, const float *rhs, size_t dim, size_t m_value, float e2) { float squ = 0.0f; - float lhs_vec[dim + m_value]; + std::vector lhs_vec(dim + m_value); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; ++i) { float val = lhs[i] * eta; @@ -68,7 +68,7 @@ static float ConvertAndComputeByMips(const float *lhs, const float *rhs, squ *= squ; } - float rhs_vec[dim + m_value]; + std::vector rhs_vec(dim + m_value); squ = 0.0f; for (size_t i = 0; i < dim; ++i) { float val = rhs[i] * eta; @@ -79,7 +79,8 @@ static float ConvertAndComputeByMips(const float *lhs, const float *rhs, rhs_vec[i] = 0.5f - squ; squ *= squ; } - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + m_value); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + m_value); } TEST(DistanceMatrix, GeneralRepeatedQuadraticInjection) { @@ -91,18 +92,20 @@ TEST(DistanceMatrix, GeneralRepeatedQuadraticInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_real_distribution dist(-1.0, 1.0); for (size_t i = 0; i < count; ++i) { - float vec1[dim]; - float vec2[dim]; + std::vector vec1(dim); + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } float norm1, norm2; - SquaredNorm2Matrix::Compute(vec1, dim, &norm1); - SquaredNorm2Matrix::Compute(vec2, dim, &norm2); + SquaredNorm2Matrix::Compute(vec1.data(), dim, &norm1); + SquaredNorm2Matrix::Compute(vec2.data(), dim, &norm2); const float e2 = u_val * u_val / std::max(norm1, norm2); - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, m_val, e2), - MipsSquaredEuclidean(vec1, vec2, dim, m_val, e2), epsilon); + ASSERT_NEAR( + ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, m_val, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, m_val, e2), + epsilon); } } @@ -517,7 +520,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const float *lhs, const float *rhs, size_t dim, float e2) { float squ = 0.0f; - float lhs_vec[dim + 1]; + std::vector lhs_vec(dim + 1); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; ++i) { float val = lhs[i] * eta; @@ -525,10 +528,10 @@ static float ConvertAndComputeByMips(const float *lhs, const float *rhs, squ += val * val; } float norm2; - ailego::SquaredNorm2Matrix::Compute(lhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(lhs_vec.data(), dim, &norm2); lhs_vec[dim] = std::sqrt(1 - norm2); - float rhs_vec[dim + 1]; + std::vector rhs_vec(dim + 1); squ = 0.0f; for (size_t i = 0; i < dim; ++i) { float val = rhs[i] * eta; @@ -536,9 +539,10 @@ static float ConvertAndComputeByMips(const float *lhs, const float *rhs, squ += val * val; } std::cout << "squ: " << squ << std::endl; - ailego::SquaredNorm2Matrix::Compute(rhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(rhs_vec.data(), dim, &norm2); rhs_vec[dim] = std::sqrt(1 - norm2); - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + 1); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + 1); } template @@ -556,18 +560,19 @@ TEST(DistanceMatrix, GeneralSphericalInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_real_distribution dist(-1.0, 1.0); for (size_t i = 0; i < count; ++i) { - float vec1[dim]; - float vec2[dim]; + std::vector vec1(dim); + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } float norm1, norm2; - SquaredNorm2Matrix::Compute(vec1, dim, &norm1); - SquaredNorm2Matrix::Compute(vec2, dim, &norm2); + SquaredNorm2Matrix::Compute(vec1.data(), dim, &norm1); + SquaredNorm2Matrix::Compute(vec2.data(), dim, &norm2); const float e2 = u_val * u_val / std::max(norm1, norm2); - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, e2), - MipsSquaredEuclidean(vec1, vec2, dim, e2), epsilon); + ASSERT_NEAR(ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, e2), + epsilon); } } diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_int4_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_int4_test.cc index d4144ee8..7a536d28 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_int4_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_int4_test.cc @@ -58,7 +58,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const uint8_t *lhs, const uint8_t *rhs, size_t dim, size_t m_value, float e2) { float squ = 0.0f; - float lhs_vec[dim + m_value]; + std::vector lhs_vec(dim + m_value); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; i += 2) { uint8_t v = lhs[i / 2]; @@ -75,7 +75,7 @@ static float ConvertAndComputeByMips(const uint8_t *lhs, const uint8_t *rhs, lhs_vec[i] = 0.5f - squ; squ *= squ; } - float rhs_vec[dim + m_value]; + std::vector rhs_vec(dim + m_value); squ = 0.0f; for (size_t i = 0; i < dim; i += 2) { uint8_t v = rhs[i / 2]; @@ -92,7 +92,8 @@ static float ConvertAndComputeByMips(const uint8_t *lhs, const uint8_t *rhs, rhs_vec[i] = 0.5f - squ; squ *= squ; } - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + m_value); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + m_value); } template @@ -116,14 +117,16 @@ TEST(DistanceMatrix, GeneralRepeatedQuadraticInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_int_distribution dist(0, 255); for (size_t i = 0; i < count; ++i) { - uint8_t vec1[dim / 2]; - uint8_t vec2[dim / 2]; + std::vector vec1(dim / 2); + std::vector vec2(dim / 2); for (size_t d = 0; d < dim / 2; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, m_val, e2), - MipsSquaredEuclidean(vec1, vec2, dim, m_val, e2), epsilon); + ASSERT_NEAR( + ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, m_val, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, m_val, e2), + epsilon); } } @@ -436,7 +439,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { dimension / 8, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT4 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -468,7 +471,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { query_size>::Compute(matrix_batch, &query2[0], dimension, m_val, - e2, results); + e2, results.data()); } std::cout << "* N Batched MipsSquaredEuclidean(RepeatedQuadraticInjection) (us) \t" @@ -539,7 +542,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const uint8_t *lhs, const uint8_t *rhs, size_t dim, float e2) { float squ = 0.0f; - float lhs_vec[dim + 1]; + std::vector lhs_vec(dim + 1); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; i += 2) { uint8_t v = lhs[i / 2]; @@ -553,10 +556,10 @@ static float ConvertAndComputeByMips(const uint8_t *lhs, const uint8_t *rhs, squ += val * val; } float norm2; - ailego::SquaredNorm2Matrix::Compute(lhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(lhs_vec.data(), dim, &norm2); lhs_vec[dim] = std::sqrt(1 - norm2); - float rhs_vec[dim + 1]; + std::vector rhs_vec(dim + 1); squ = 0.0f; for (size_t i = 0; i < dim; i += 2) { uint8_t v = rhs[i / 2]; @@ -570,9 +573,10 @@ static float ConvertAndComputeByMips(const uint8_t *lhs, const uint8_t *rhs, squ += val * val; } std::cout << "squ: " << squ << std::endl; - ailego::SquaredNorm2Matrix::Compute(rhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(rhs_vec.data(), dim, &norm2); rhs_vec[dim] = std::sqrt(1 - norm2); - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + 1); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + 1); } template @@ -594,14 +598,15 @@ TEST(DistanceMatrix, GeneralSphericalInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_int_distribution dist(0, 255); for (size_t i = 0; i < count; ++i) { - uint8_t vec1[dim / 2]; - uint8_t vec2[dim / 2]; + std::vector vec1(dim / 2); + std::vector vec2(dim / 2); for (size_t d = 0; d < dim / 2; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, e2), - MipsSquaredEuclidean(vec1, vec2, dim, e2), epsilon); + ASSERT_NEAR(ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, e2), + epsilon); } } @@ -908,7 +913,7 @@ void MipsSphericalInjectionBenchMark(void) { dimension / 8, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT4 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -939,7 +944,7 @@ void MipsSphericalInjectionBenchMark(void) { query_size>::Compute(matrix_batch, &query2[0], dimension, e2, - results); + results.data()); } std::cout << "* N Batched MipsSquaredEuclidean(SphericalInjection) (us) \t" << elapsed_time.micro_seconds() << std::endl; diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc index f371896f..6eaa5443 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc @@ -56,7 +56,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const int8_t *lhs, const int8_t *rhs, size_t dim, size_t m_value, float e2) { float squ = 0.0f; - float lhs_vec[dim + m_value]; + std::vector lhs_vec(dim + m_value); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; ++i) { float val = lhs[i] * eta; @@ -67,7 +67,7 @@ static float ConvertAndComputeByMips(const int8_t *lhs, const int8_t *rhs, lhs_vec[i] = 0.5f - squ; squ *= squ; } - float rhs_vec[dim + m_value]; + std::vector rhs_vec(dim + m_value); squ = 0.0f; for (size_t i = 0; i < dim; ++i) { float val = rhs[i] * eta; @@ -78,7 +78,8 @@ static float ConvertAndComputeByMips(const int8_t *lhs, const int8_t *rhs, rhs_vec[i] = 0.5f - squ; squ *= squ; } - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + m_value); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + m_value); } template @@ -417,7 +418,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { dimension / 4, query_size); ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size @@ -446,7 +447,7 @@ void MipsRepeatedQuadraticInjectionBenchMark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; MipsSquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, m_val, e2, results); + matrix_batch, &query2[0], dimension, m_val, e2, results.data()); } std::cout << "* N Batched MipsSquaredErclidean(RepeatedQuadraticInjection) (us) \t" @@ -517,7 +518,7 @@ static float MipsSquaredEuclidean(const FixedVector &lhs, static float ConvertAndComputeByMips(const int8_t *lhs, const int8_t *rhs, size_t dim, float e2) { float squ = 0.0f; - float lhs_vec[dim + 1]; + std::vector lhs_vec(dim + 1); const float eta = std::sqrt(e2); for (size_t i = 0; i < dim; ++i) { float val = lhs[i] * eta; @@ -525,20 +526,21 @@ static float ConvertAndComputeByMips(const int8_t *lhs, const int8_t *rhs, squ += val * val; } float norm2; - ailego::SquaredNorm2Matrix::Compute(lhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(lhs_vec.data(), dim, &norm2); lhs_vec[dim] = std::sqrt(1 - norm2); - float rhs_vec[dim + 1]; + std::vector rhs_vec(dim + 1); squ = 0.0f; for (size_t i = 0; i < dim; ++i) { float val = rhs[i] * eta; rhs_vec[i] = val; squ += val * val; } - ailego::SquaredNorm2Matrix::Compute(rhs_vec, dim, &norm2); + ailego::SquaredNorm2Matrix::Compute(rhs_vec.data(), dim, &norm2); rhs_vec[dim] = std::sqrt(1 - norm2); std::cout << "squ: " << squ << std::endl; - return ailego::Distance::SquaredEuclidean(lhs_vec, rhs_vec, dim + 1); + return ailego::Distance::SquaredEuclidean(lhs_vec.data(), rhs_vec.data(), + dim + 1); } template @@ -878,7 +880,7 @@ void MipsSphericalInjectionBenchMark(void) { } const float e2 = 0.98f / squared_l2_norm; ElapsedTime elapsed_time; - float results[batch_size * query_size]; + std::vector results(batch_size * query_size); std::cout << "# (" << IntelIntrinsics() << ") INT8 " << dimension << "d, " << batch_size << " * " << query_size << " * " << block_size diff --git a/tests/ailego/parallel/multi_thread_list_test.cc b/tests/ailego/parallel/multi_thread_list_test.cc index 07fd8a92..cf389dbe 100644 --- a/tests/ailego/parallel/multi_thread_list_test.cc +++ b/tests/ailego/parallel/multi_thread_list_test.cc @@ -68,8 +68,8 @@ TEST(MultiThreadListTest, General) { uint32_t num_of_producer = 100; uint32_t num_of_producer_done = 100; - uint32_t consumer_results[num_of_consumer]; - memset(consumer_results, 0, sizeof(uint32_t) * num_of_consumer); + std::vector consumer_results(num_of_consumer); + std::fill(consumer_results.begin(), consumer_results.end(), 0); for (uint32_t i = 0; i < num_of_consumer; i++) { consumer_pool.execute(consumer, i + 1, &consumer_results[i]); @@ -227,8 +227,8 @@ TEST(MultiThreadListTest, General_Moveable) { uint32_t num_of_producer = 100; uint32_t num_of_producer_done = 100; - uint32_t consumer_results[num_of_consumer]; - memset(consumer_results, 0, sizeof(uint32_t) * num_of_consumer); + std::vector consumer_results(num_of_consumer); + std::fill(consumer_results.begin(), consumer_results.end(), 0); for (uint32_t i = 0; i < num_of_consumer; i++) { consumer_pool.execute(consumer_moveable, i + 1, &consumer_results[i]); diff --git a/tests/ailego/parallel/semaphore_test.cc b/tests/ailego/parallel/semaphore_test.cc index b9e61a83..19ccee98 100644 --- a/tests/ailego/parallel/semaphore_test.cc +++ b/tests/ailego/parallel/semaphore_test.cc @@ -46,7 +46,7 @@ TEST(BinarySemaphores, General) { ailego::BinarySemaphores<1> sem_mutex1(sem_count); std::atomic total{0u}; - uint32_t counts[sem_count] = {0u}; + std::vector counts(sem_count, 0u); for (int i = 0; i < 2000; ++i) { pool.execute([&]() { int index1 = sem_mutex32.acquire(); @@ -71,7 +71,7 @@ TEST(BinarySemaphores, General2) { const int sem_count = 32; ailego::BinarySemaphores<64> sem_mutex64(sem_count); std::atomic total{0u}; - uint32_t counts[sem_count] = {0u}; + std::vector counts(sem_count, 0u); bool flag = true; for (int i = 0; i < 64; ++i) { pool.execute([&]() { diff --git a/tests/core/algorithm/flat/flat_streamer_test.cc b/tests/core/algorithm/flat/flat_streamer_test.cc index f03012d7..61be3293 100644 --- a/tests/core/algorithm/flat/flat_streamer_test.cc +++ b/tests/core/algorithm/flat/flat_streamer_test.cc @@ -392,24 +392,24 @@ TEST_F(FlatStreamerTest, TestOpenClose) { ASSERT_EQ(0, streamer->open(storage1)); auto ctx = streamer->create_context(); ASSERT_TRUE(!!ctx); - float vec1[dim]; + std::vector vec1(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = v1; } - ASSERT_EQ(0, streamer->add_impl(i, vec1, qmeta, ctx)); + ASSERT_EQ(0, streamer->add_impl(i, vec1.data(), qmeta, ctx)); checkIter(0, i / 2 + 1, streamer); ASSERT_EQ(0, streamer->flush(0UL)); ASSERT_EQ(0, streamer->close()); float v2 = (float)(i + 1); - float vec2[dim]; + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec2[d] = v2; } ASSERT_EQ(0, streamer->open(storage2)); ctx = streamer->create_context(); ASSERT_TRUE(!!ctx); - ASSERT_EQ(0, streamer->add_impl(i + 1, vec2, qmeta, ctx)); + ASSERT_EQ(0, streamer->add_impl(i + 1, vec2.data(), qmeta, ctx)); checkIter(1, i / 2 + 1, streamer); ASSERT_EQ(0, streamer->flush(0UL)); ASSERT_EQ(0, streamer->close()); diff --git a/tests/core/algorithm/hnsw/hnsw_streamer_test.cc b/tests/core/algorithm/hnsw/hnsw_streamer_test.cc index d39f1c07..27f7beef 100644 --- a/tests/core/algorithm/hnsw/hnsw_streamer_test.cc +++ b/tests/core/algorithm/hnsw/hnsw_streamer_test.cc @@ -592,24 +592,24 @@ TEST_F(HnswStreamerTest, TestOpenClose) { ASSERT_EQ(0, streamer->open(storage1)); auto ctx = streamer->create_context(); ASSERT_TRUE(!!ctx); - float vec1[dim]; + std::vector vec1(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = v1; } - ASSERT_EQ(0, streamer->add_impl(i, vec1, qmeta, ctx)); + ASSERT_EQ(0, streamer->add_impl(i, vec1.data(), qmeta, ctx)); checkIter(0, i / 2 + 1, streamer); ASSERT_EQ(0, streamer->flush(0UL)); ASSERT_EQ(0, streamer->close()); float v2 = (float)(i + 1); - float vec2[dim]; + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec2[d] = v2; } ASSERT_EQ(0, streamer->open(storage2)); ctx = streamer->create_context(); ASSERT_TRUE(!!ctx); - ASSERT_EQ(0, streamer->add_impl(i + 1, vec2, qmeta, ctx)); + ASSERT_EQ(0, streamer->add_impl(i + 1, vec2.data(), qmeta, ctx)); checkIter(1, i / 2 + 1, streamer); ASSERT_EQ(0, streamer->flush(0UL)); ASSERT_EQ(0, streamer->close()); @@ -1949,11 +1949,11 @@ TEST_F(HnswStreamerTest, TestMipsEuclideanMetric) { "proxima.mips_euclidean.metric.max_l2_norm")); auto ctx = streamer->create_context(); for (size_t i = COUNT; i < 2 * COUNT; i++) { - float vec[dim]; + std::vector vec(dim); for (size_t d = 0; d < dim; ++d) { vec[d] = i; } - ASSERT_EQ(0, streamer->add_impl(i, vec, qmeta, ctx)); + ASSERT_EQ(0, streamer->add_impl(i, vec.data(), qmeta, ctx)); } ASSERT_EQ(0, streamer->flush(0UL)); ASSERT_EQ(0, streamer->close()); @@ -1970,19 +1970,19 @@ TEST_F(HnswStreamerTest, TestMipsEuclideanMetric) { metric_params.get_as_float("proxima.mips_euclidean.metric.max_l2_norm")); auto ctx = streamer->create_context(); for (size_t i = 0; i < COUNT; i++) { - float vec[dim]; + std::vector vec(dim); for (size_t d = 0; d < dim; ++d) { vec[d] = i; } - ASSERT_EQ(0, streamer->add_impl(i, vec, qmeta, ctx)); + ASSERT_EQ(0, streamer->add_impl(i, vec.data(), qmeta, ctx)); } - float vec[dim]; + std::vector vec(dim); for (size_t d = 0; d < dim; ++d) { vec[d] = 1.0; } ctx->set_topk(10); - ASSERT_EQ(0, streamer->search_impl(vec, qmeta, ctx)); + ASSERT_EQ(0, streamer->search_impl(vec.data(), qmeta, ctx)); const auto &results = ctx->result(); EXPECT_EQ(results.size(), 10); EXPECT_NEAR((uint64_t)(2 * COUNT - 1), results[0].key(), 10); diff --git a/tests/db/index/storage/wal_file_test.cc b/tests/db/index/storage/wal_file_test.cc index f430d0a4..e2a073f1 100644 --- a/tests/db/index/storage/wal_file_test.cc +++ b/tests/db/index/storage/wal_file_test.cc @@ -288,12 +288,12 @@ TEST_F(WalFileTest, TestBoundaryCondition) { // write very large record 4Mb size_t BIG_DATA_SIZE = 4 * 1024 * 1024; - uint8_t big_data[BIG_DATA_SIZE]; + std::vector big_data(BIG_DATA_SIZE); for (size_t i = 0; i < BIG_DATA_SIZE; i++) { big_data[i] = i % 256; } str.clear(); - str.assign((const char *)big_data, BIG_DATA_SIZE); + str.assign((const char *)big_data.data(), BIG_DATA_SIZE); wal_option.create_new = true; ret = wal_file->open(wal_option); ASSERT_EQ(ret, 0); From 078aeeec60bbf624111d1b3294951e9423535c8a Mon Sep 17 00:00:00 2001 From: "xufeihong.xfh" Date: Mon, 2 Mar 2026 17:55:40 +0800 Subject: [PATCH 3/5] update --- .../inner_product_distance_batch_impl.h | 10 +++---- .../inner_product_distance_batch_impl_fp16.h | 2 +- ...ips_euclidean_distance_matrix_fp16_test.cc | 28 ++++++++++--------- ...ips_euclidean_distance_matrix_int8_test.cc | 19 +++++++------ .../ailego/parallel/multi_thread_list_test.cc | 4 +-- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/ailego/math_batch/inner_product_distance_batch_impl.h b/src/ailego/math_batch/inner_product_distance_batch_impl.h index 1554426f..d3ad6f0d 100644 --- a/src/ailego/math_batch/inner_product_distance_batch_impl.h +++ b/src/ailego/math_batch/inner_product_distance_batch_impl.h @@ -53,14 +53,14 @@ compute_one_to_many_avx2_fp32( const ValueType *query, const ValueType **ptrs, std::array &prefetch_ptrs, size_t dimensionality, float *results) { - __m256 accs[dp_batch]; + std::vector<__m256> accs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { accs[i] = _mm256_setzero_ps(); } size_t dim = 0; for (; dim + 8 <= dimensionality; dim += 8) { __m256 q = _mm256_loadu_ps(query + dim); - __m256 data_regs[dp_batch]; + std::vector<__m256> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm256_loadu_ps(ptrs[i] + dim); } @@ -73,13 +73,13 @@ compute_one_to_many_avx2_fp32( accs[i] = _mm256_fnmadd_ps(q, data_regs[i], accs[i]); } } - __m128 sum128_regs[dp_batch]; + std::vector<__m128> sum128_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { sum128_regs[i] = sum_top_bottom_avx(accs[i]); } if (dim + 4 <= dimensionality) { __m128 q = _mm_loadu_ps(query + dim); - __m128 data_regs[dp_batch]; + std::vector<__m128> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm_loadu_ps(ptrs[i] + dim); } @@ -95,7 +95,7 @@ compute_one_to_many_avx2_fp32( } if (dim + 2 <= dimensionality) { __m128 q = _mm_setzero_ps(); - __m128 data_regs[dp_batch]; + std::vector<__m128> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm_setzero_ps(); } diff --git a/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h b/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h index a8617df8..0ff65f8d 100644 --- a/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h +++ b/src/ailego/math_batch/inner_product_distance_batch_impl_fp16.h @@ -40,7 +40,7 @@ compute_one_to_many_avx512fp16_fp16( for (; dim + 32 <= dimensionality; dim += 32) { __m512h q = _mm512_loadu_ph(query + dim); - __m512h data_regs[dp_batch]; + std::vector<__m512h> data_regs(dp_batch); for (size_t i = 0; i < dp_batch; ++i) { data_regs[i] = _mm512_loadu_ph(ptrs[i] + dim); } diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc index 7dc034aa..9d6f0b85 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_fp16_test.cc @@ -101,19 +101,20 @@ TEST(DistanceMatrix, GeneralRepeatedQuadraticInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_real_distribution dist(-1.0, 1.0); for (size_t i = 0; i < count; ++i) { - Float16 vec1[dim]; - Float16 vec2[dim]; + std::vector vec1(dim); + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } float norm1{0.0}, norm2{0.0}; - SquaredNorm2Matrix::Compute(vec1, dim, &norm1); - SquaredNorm2Matrix::Compute(vec2, dim, &norm2); + SquaredNorm2Matrix::Compute(vec1.data(), dim, &norm1); + SquaredNorm2Matrix::Compute(vec2.data(), dim, &norm2); const float e2 = u_val * u_val / std::max(norm1, norm2); - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, m_val, e2), - MipsSquaredEuclideanDistance(vec1, vec2, dim, m_val, e2), - epsilon); + ASSERT_NEAR( + ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, m_val, e2), + MipsSquaredEuclideanDistance(vec1.data(), vec2.data(), dim, m_val, e2), + epsilon); } } @@ -580,18 +581,19 @@ TEST(DistanceMatrix, GeneralSphericalInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_real_distribution dist(-1.0, 1.0); for (size_t i = 0; i < count; ++i) { - Float16 vec1[dim]; - Float16 vec2[dim]; + std::vector vec1(dim); + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } float norm1{0.0}, norm2{0.0}; - SquaredNorm2Matrix::Compute(vec1, dim, &norm1); - SquaredNorm2Matrix::Compute(vec2, dim, &norm2); + SquaredNorm2Matrix::Compute(vec1.data(), dim, &norm1); + SquaredNorm2Matrix::Compute(vec2.data(), dim, &norm2); const float e2 = u_val * u_val / std::max(norm1, norm2); - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, e2), - MipsSquaredEuclidean(vec1, vec2, dim, e2), epsilon); + ASSERT_NEAR(ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, e2), + epsilon); } } diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc index 6eaa5443..0e580249 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc @@ -102,14 +102,16 @@ TEST(DistanceMatrix, GeneralRepeatedQuadraticInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_int_distribution dist(-127, 127); for (size_t i = 0; i < count; ++i) { - int8_t vec1[dim]; - int8_t vec2[dim]; + std::vector vec1(dim); + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, m_val, e2), - MipsSquaredEuclidean(vec1, vec2, dim, m_val, e2), epsilon); + ASSERT_NEAR( + ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, m_val, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, m_val, e2), + epsilon); } } @@ -561,14 +563,15 @@ TEST(DistanceMatrix, GeneralSphericalInjection) { const uint32_t count = std::uniform_int_distribution(1, 1000)(gen); std::uniform_int_distribution dist(-127, 127); for (size_t i = 0; i < count; ++i) { - int8_t vec1[dim]; - int8_t vec2[dim]; + std::vector vec1(dim); + std::vector vec2(dim); for (size_t d = 0; d < dim; ++d) { vec1[d] = dist(gen); vec2[d] = dist(gen); } - ASSERT_NEAR(ConvertAndComputeByMips(vec1, vec2, dim, e2), - MipsSquaredEuclidean(vec1, vec2, dim, e2), epsilon); + ASSERT_NEAR(ConvertAndComputeByMips(vec1.data(), vec2.data(), dim, e2), + MipsSquaredEuclidean(vec1.data(), vec2.data(), dim, e2), + epsilon); } } diff --git a/tests/ailego/parallel/multi_thread_list_test.cc b/tests/ailego/parallel/multi_thread_list_test.cc index cf389dbe..1d3be229 100644 --- a/tests/ailego/parallel/multi_thread_list_test.cc +++ b/tests/ailego/parallel/multi_thread_list_test.cc @@ -124,8 +124,8 @@ TEST(MultiThreadListTest, ConsumeStopResume) { uint32_t num_of_consumer = 100; uint32_t num_of_producer = 100; - uint32_t consumer_results[2 * num_of_consumer]; - memset(consumer_results, 0, sizeof(uint32_t) * 2 * num_of_consumer); + std::vector consumer_results(2 * num_of_consumer); + std::fill(consumer_results.begin(), consumer_results.end(), 0); for (uint32_t i = 0; i < num_of_consumer; i++) { consumer_pool.execute(consumer, i + 1, &consumer_results[i]); From 769a76bc954a4818f4ae9a9ac186aaa9d305a040 Mon Sep 17 00:00:00 2001 From: "xufeihong.xfh" Date: Mon, 2 Mar 2026 19:06:07 +0800 Subject: [PATCH 4/5] fix --- tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc b/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc index 0e580249..8a5f7c5b 100644 --- a/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc +++ b/tests/ailego/math/mips_euclidean_distance_matrix_int8_test.cc @@ -911,7 +911,7 @@ void MipsSphericalInjectionBenchMark(void) { const int8_t *matrix_batch = &matrix2[i * batch_size * dimension]; MipsSquaredEuclideanDistanceMatrix::Compute( - matrix_batch, &query2[0], dimension, e2, results); + matrix_batch, &query2[0], dimension, e2, results.data()); } std::cout << "* N Batched MipsSquaredErclidean(SphericalInjection) (us) \t" << elapsed_time.micro_seconds() << std::endl; From 7c6244e9362576b58d41aaf37f7e09bdf6cf4596 Mon Sep 17 00:00:00 2001 From: "xufeihong.xfh" Date: Mon, 2 Mar 2026 20:40:20 +0800 Subject: [PATCH 5/5] fix --- src/core/algorithm/hnsw/hnsw_entity.cc | 4 ++-- src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/algorithm/hnsw/hnsw_entity.cc b/src/core/algorithm/hnsw/hnsw_entity.cc index e0716e1e..53f07dd4 100644 --- a/src/core/algorithm/hnsw/hnsw_entity.cc +++ b/src/core/algorithm/hnsw/hnsw_entity.cc @@ -330,12 +330,12 @@ int64_t HnswEntity::dump_upper_neighbors( if (dumper->write(buffer.data(), sizeof(node_id_t) * buffer.size()) != sizeof(node_id_t) * buffer.size()) { LOG_ERROR("Dump graph neighbor id=%u failed, size %lu", id, - sizeof(buffer)); + sizeof(node_id_t) * buffer.size()); return IndexError_WriteData; } crc = ailego::Crc32c::Hash(buffer.data(), sizeof(node_id_t) * buffer.size(), crc); - offset += sizeof(buffer); + offset += sizeof(node_id_t) * buffer.size(); } } size_t padding_size = 0; diff --git a/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc b/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc index 64eaa8b4..a0ecb2fc 100644 --- a/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc +++ b/src/core/algorithm/hnsw_sparse/hnsw_sparse_entity.cc @@ -407,12 +407,12 @@ int64_t HnswSparseEntity::dump_upper_neighbors( if (dumper->write(buffer.data(), sizeof(node_id_t) * buffer.size()) != sizeof(node_id_t) * buffer.size()) { LOG_ERROR("Dump graph neighbor id=%u failed, size %lu", id, - sizeof(buffer)); + sizeof(node_id_t) * buffer.size()); return IndexError_WriteData; } crc = ailego::Crc32c::Hash(buffer.data(), sizeof(node_id_t) * buffer.size(), crc); - offset += sizeof(buffer); + offset += sizeof(node_id_t) * buffer.size(); } } size_t padding_size = 0;