14#include <benchmark/benchmark.h>
18using namespace benchmark;
26class PippengerBench :
public benchmark::Fixture {
28 static constexpr size_t MAX_POINTS = 1 << 22;
30 std::vector<Fr> scalars;
33 void SetUp([[maybe_unused]] const ::benchmark::State& state)
override
36 srs = bb::srs::get_crs_factory<Curve>()->get_crs(MAX_POINTS);
38 scalars.resize(MAX_POINTS);
39 for (
auto& x : scalars) {
47BENCHMARK_DEFINE_F(PippengerBench, PippengerUnsafe)(benchmark::State& state)
49 const size_t num_points =
static_cast<size_t>(state.range(0));
54 for (
auto _ : state) {
56 bb::scalar_multiplication::pippenger_unsafe<Curve>(poly_scalars, points);
62BENCHMARK_DEFINE_F(PippengerBench, BatchMSM)(benchmark::State& state)
64 const size_t num_polys =
static_cast<size_t>(state.range(0));
65 const size_t poly_size =
static_cast<size_t>(state.range(1));
71 for (
size_t i = 0; i < num_polys; ++i) {
72 all_scalars[i].resize(poly_size);
73 for (
auto& s : all_scalars[i]) {
76 scalar_spans.emplace_back(all_scalars[i]);
77 point_spans.emplace_back(srs->get_monomial_points().subspan(0, poly_size));
80 for (
auto _ : state) {
96BENCHMARK_DEFINE_F(PippengerBench, BatchMSM_1656)(benchmark::State& state)
98 const size_t num_threads =
static_cast<size_t>(state.range(0));
99 const size_t msm_size =
static_cast<size_t>(state.range(1));
101 std::vector<Fr> msm_scalars(msm_size);
102 for (
auto& s : msm_scalars) {
108 scalar_spans.emplace_back(msm_scalars);
109 point_spans.emplace_back(srs->get_monomial_points().subspan(0, msm_size));
115 for (
auto _ : state) {
126BENCHMARK_REGISTER_F(PippengerBench, PippengerUnsafe)
127 ->Unit(benchmark::kMillisecond)
129 ->Range(1 << 14, 1 << 20);
133BENCHMARK_REGISTER_F(PippengerBench, BatchMSM)
134 ->Unit(benchmark::kMillisecond)
135 ->Args({ 32, 1 << 19 })
136 ->Args({ 32, 1 << 21 });
139BENCHMARK_REGISTER_F(PippengerBench, BatchMSM_1656)
140 ->Unit(benchmark::kMillisecond)
141 ->Args({ 256, 1 << 16 })
142 ->Args({ 256, 1 << 20 });
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)
void set_parallel_for_concurrency(size_t num_cores)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept