13#include <benchmark/benchmark.h>
17using namespace benchmark;
25class PippengerBench :
public benchmark::Fixture {
27 static constexpr size_t MAX_POINTS = 1 << 22;
29 std::vector<Fr> scalars;
32 void SetUp([[maybe_unused]] const ::benchmark::State& state)
override
35 srs = bb::srs::get_crs_factory<Curve>()->get_crs(MAX_POINTS);
37 scalars.resize(MAX_POINTS);
38 for (
auto& x : scalars) {
46BENCHMARK_DEFINE_F(PippengerBench, PippengerUnsafe)(benchmark::State& state)
48 const size_t num_points =
static_cast<size_t>(state.range(0));
53 for (
auto _ : state) {
55 bb::scalar_multiplication::pippenger_unsafe<Curve>(poly_scalars, points);
61BENCHMARK_DEFINE_F(PippengerBench, BatchMSM)(benchmark::State& state)
63 const size_t num_polys =
static_cast<size_t>(state.range(0));
64 const size_t poly_size =
static_cast<size_t>(state.range(1));
70 for (
size_t i = 0; i < num_polys; ++i) {
71 all_scalars[i].resize(poly_size);
72 for (
auto& s : all_scalars[i]) {
75 scalar_spans.emplace_back(all_scalars[i]);
76 point_spans.emplace_back(srs->get_monomial_points().subspan(0, poly_size));
79 for (
auto _ : state) {
88BENCHMARK_REGISTER_F(PippengerBench, PippengerUnsafe)
89 ->Unit(benchmark::kMillisecond)
91 ->Range(1 << 14, 1 << 20);
95BENCHMARK_REGISTER_F(PippengerBench, BatchMSM)
96 ->Unit(benchmark::kMillisecond)
97 ->Args({ 32, 1 << 19 })
98 ->Args({ 32, 1 << 21 });
typename Group::affine_element AffineElement
static std::vector< AffineElement > batch_multi_scalar_mul(std::span< std::span< const AffineElement > > points, std::span< std::span< ScalarField > > scalars, bool handle_edge_cases=true) noexcept
Compute multiple MSMs in parallel with work balancing.
#define GOOGLE_BB_BENCH_REPORTER(state)
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept