Skip to content

Commit d9ca85d

Browse files
committed
Improve: Runtime-defined dimensions
No need to re-compile to speed-test a different vector dimensionality
1 parent e5dad6c commit d9ca85d

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

scripts/bench.cxx

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ constexpr std::size_t default_seconds = 10;
4444
constexpr std::size_t default_threads = 1;
4545
constexpr 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

5354
namespace bm = benchmark;
5455

@@ -680,23 +681,32 @@ void vdot_f64c_blas(simsimd_f64c_t const *a, simsimd_f64c_t const *b, simsimd_si
680681

681682
void 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

689693
void 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

697704
void 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

708718
void 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

Comments
 (0)