@@ -44,11 +44,12 @@ constexpr std::size_t default_seconds = 10;
4444constexpr std::size_t default_threads = 1 ;
4545constexpr simsimd_distance_t signaling_distance = std::numeric_limits<simsimd_distance_t >::signaling_NaN();
4646
47- // / Matches OpenAI embedding size
4847// / For sub-byte data types
49- constexpr std::size_t dense_dimensions = 1536 ;
48+ // / Can be overridden at runtime via `SIMSIMD_BENCH_DENSE_DIMENSIONS` environment variable
49+ std::size_t dense_dimensions = 1536 ;
5050// / Has quadratic impact on the number of operations
51- constexpr std::size_t curved_dimensions = 8 ;
51+ // / Can be overridden at runtime via `SIMSIMD_BENCH_CURVED_DIMENSIONS` environment variable
52+ std::size_t curved_dimensions = 8 ;
5253
5354namespace bm = benchmark;
5455
@@ -680,23 +681,32 @@ void vdot_f64c_blas(simsimd_f64c_t const *a, simsimd_f64c_t const *b, simsimd_si
680681
681682void bilinear_f32_blas (simsimd_f32_t const *a, simsimd_f32_t const *b, simsimd_f32_t const *c, simsimd_size_t n,
682683 simsimd_distance_t *result) {
683- std::array<simsimd_f32_t , curved_dimensions> intermediate;
684+ // Thread-local buffer to avoid allocation in hot path
685+ static thread_local std::vector<simsimd_f32_t > intermediate;
686+ if (intermediate.size () < n) intermediate.resize (n);
687+
684688 simsimd_f32_t alpha = 1 .0f , beta = 0 .0f ;
685689 cblas_sgemv (CblasRowMajor, CblasNoTrans, (int )n, (int )n, alpha, c, (int )n, b, 1 , beta, intermediate.data (), 1 );
686690 *result = cblas_sdot ((int )n, a, 1 , intermediate.data (), 1 );
687691}
688692
689693void bilinear_f64_blas (simsimd_f64_t const *a, simsimd_f64_t const *b, simsimd_f64_t const *c, simsimd_size_t n,
690694 simsimd_distance_t *result) {
691- std::array<simsimd_f64_t , curved_dimensions> intermediate;
695+ // Thread-local buffer to avoid allocation in hot path
696+ static thread_local std::vector<simsimd_f64_t > intermediate;
697+ if (intermediate.size () < n) intermediate.resize (n);
698+
692699 simsimd_f64_t alpha = 1.0 , beta = 0.0 ;
693700 cblas_dgemv (CblasRowMajor, CblasNoTrans, (int )n, (int )n, alpha, c, n, b, 1 , beta, intermediate.data (), 1 );
694701 *result = cblas_ddot ((int )n, a, 1 , intermediate.data (), 1 );
695702}
696703
697704void bilinear_f32c_blas (simsimd_f32c_t const *a, simsimd_f32c_t const *b, simsimd_f32c_t const *c, simsimd_size_t n,
698705 simsimd_distance_t *results) {
699- std::array<simsimd_f32c_t , curved_dimensions> intermediate;
706+ // Thread-local buffer to avoid allocation in hot path
707+ static thread_local std::vector<simsimd_f32c_t > intermediate;
708+ if (intermediate.size () < n) intermediate.resize (n);
709+
700710 simsimd_f32c_t alpha = {1 .0f , 0 .0f }, beta = {0 .0f , 0 .0f };
701711 cblas_cgemv (CblasRowMajor, CblasNoTrans, (int )n, (int )n, &alpha, c, n, b, 1 , &beta, intermediate.data (), 1 );
702712 simsimd_f32_t f32_result[2 ] = {0 , 0 };
@@ -707,7 +717,10 @@ void bilinear_f32c_blas(simsimd_f32c_t const *a, simsimd_f32c_t const *b, simsim
707717
708718void bilinear_f64c_blas (simsimd_f64c_t const *a, simsimd_f64c_t const *b, simsimd_f64c_t const *c, simsimd_size_t n,
709719 simsimd_distance_t *results) {
710- std::array<simsimd_f64c_t , curved_dimensions> intermediate;
720+ // Thread-local buffer to avoid allocation in hot path
721+ static thread_local std::vector<simsimd_f64c_t > intermediate;
722+ if (intermediate.size () < n) intermediate.resize (n);
723+
711724 simsimd_f64c_t alpha = {1.0 , 0.0 }, beta = {0.0 , 0.0 };
712725 cblas_zgemv (CblasRowMajor, CblasNoTrans, (int )n, (int )n, &alpha, c, n, b, 1 , &beta, intermediate.data (), 1 );
713726 cblas_zdotu_sub ((int )n, (simsimd_f64_t const *)a, 1 , (simsimd_f64_t const *)intermediate.data (), 1 , results);
@@ -755,6 +768,24 @@ int main(int argc, char **argv) {
755768 std::printf (" - x86 Sierra Forest support enabled: %s\n " , flags[(runtime_caps & simsimd_cap_sierra_k) != 0 ]);
756769 std::printf (" \n " );
757770
771+ // Override dimensions from environment variables if provided
772+ if (char const *env_dense = std::getenv (" SIMSIMD_BENCH_DENSE_DIMENSIONS" )) {
773+ std::size_t parsed_dense = std::atoi (env_dense);
774+ if (parsed_dense > 0 ) {
775+ dense_dimensions = parsed_dense;
776+ std::printf (" Overriding `dense_dimensions` to %zu from SIMSIMD_BENCH_DENSE_DIMENSIONS\n " , dense_dimensions);
777+ }
778+ }
779+ if (char const *env_curved = std::getenv (" SIMSIMD_BENCH_CURVED_DIMENSIONS" )) {
780+ std::size_t parsed_curved = std::atoi (env_curved);
781+ if (parsed_curved > 0 ) {
782+ curved_dimensions = parsed_curved;
783+ std::printf (" Overriding `curved_dimensions` to %zu from SIMSIMD_BENCH_CURVED_DIMENSIONS\n " ,
784+ curved_dimensions);
785+ }
786+ }
787+ std::printf (" \n " );
788+
758789 // Run the benchmarks
759790 bm::Initialize (&argc, argv);
760791 if (bm::ReportUnrecognizedArguments (argc, argv)) return 1 ;
0 commit comments