From a58f543f5ac10f8fca4a6e6c0022e170f92b96c9 Mon Sep 17 00:00:00 2001 From: Jonas Nick Date: Sun, 5 Nov 2017 20:17:11 +0000 Subject: [PATCH] Add flags for choosing algorithm in ecmult_multi benchmark --- src/bench.h | 16 ++++++++++++++++ src/bench_ecmult.c | 19 +++++++++++++++++-- src/bench_internal.c | 15 --------------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/bench.h b/src/bench.h index d5ebe01301b81..5b59783f68a95 100644 --- a/src/bench.h +++ b/src/bench.h @@ -8,6 +8,7 @@ #define SECP256K1_BENCH_H #include +#include #include #include "sys/time.h" @@ -63,4 +64,19 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v printf("us\n"); } +int have_flag(int argc, char** argv, char *flag) { + char** argm = argv + argc; + argv++; + if (argv == argm) { + return 1; + } + while (argv != NULL && argv != argm) { + if (strcmp(*argv, flag) == 0) { + return 1; + } + argv++; + } + return 0; +} + #endif /* SECP256K1_BENCH_H */ diff --git a/src/bench_ecmult.c b/src/bench_ecmult.c index c1b032c5253c8..3a7bfe379c67d 100644 --- a/src/bench_ecmult.c +++ b/src/bench_ecmult.c @@ -28,6 +28,7 @@ typedef struct { secp256k1_ge* pubkeys; secp256k1_scalar* seckeys; secp256k1_gej* expected_output; + secp256k1_ecmult_multi_func ecmult_multi; /* Changes per test */ size_t count; @@ -63,7 +64,7 @@ static void bench_ecmult(void* arg) { size_t iter; for (iter = 0; iter < iters; ++iter) { - secp256k1_ecmult_multi_var(&data->ctx->ecmult_ctx, data->scratch, &data->output[iter], data->includes_g ? &data->scalars[data->offset1] : NULL, bench_callback, arg, count - includes_g); + data->ecmult_multi(&data->ctx->ecmult_ctx, data->scratch, &data->output[iter], data->includes_g ? &data->scalars[data->offset1] : NULL, bench_callback, arg, count - includes_g); data->offset1 = (data->offset1 + count) % POINTS; data->offset2 = (data->offset2 + count - 1) % POINTS; } @@ -136,10 +137,24 @@ int main(int argc, char **argv) { bench_data data; int i, p; secp256k1_gej* pubkeys_gej; + size_t scratch_size; + + if (argc > 1) { + if(have_flag(argc, argv, "pippenger_wnaf")) { + printf("Using pippenger_wnaf:\n"); + data.ecmult_multi = secp256k1_ecmult_pippenger_batch_single; + } else if(have_flag(argc, argv, "strauss_wnaf")) { + printf("Using strauss_wnaf:\n"); + data.ecmult_multi = secp256k1_ecmult_strauss_batch_single; + } + } else { + data.ecmult_multi = secp256k1_ecmult_multi_var; + } /* Allocate stuff */ data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - data.scratch = secp256k1_scratch_space_create(data.ctx, POINTS * 1024, POINTS * 5 * 1024); + scratch_size = secp256k1_strauss_scratch_size(POINTS) + STRAUSS_SCRATCH_OBJECTS*16; + data.scratch = secp256k1_scratch_space_create(data.ctx, scratch_size, scratch_size); data.scalars = malloc(sizeof(secp256k1_scalar) * POINTS); data.seckeys = malloc(sizeof(secp256k1_scalar) * POINTS); data.pubkeys = malloc(sizeof(secp256k1_ge) * POINTS); diff --git a/src/bench_internal.c b/src/bench_internal.c index 9b30c50d0be59..996aa8b0f1346 100644 --- a/src/bench_internal.c +++ b/src/bench_internal.c @@ -324,21 +324,6 @@ void bench_num_jacobi(void* arg) { } #endif -int have_flag(int argc, char** argv, char *flag) { - char** argm = argv + argc; - argv++; - if (argv == argm) { - return 1; - } - while (argv != NULL && argv != argm) { - if (strcmp(*argv, flag) == 0) { - return 1; - } - argv++; - } - return 0; -} - int main(int argc, char **argv) { bench_inv data; if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000);