Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
pippenger.bench.cpp
Go to the documentation of this file.
1
12
13#include <benchmark/benchmark.h>
14
16
17using namespace benchmark;
18
22
23namespace {
24
25class PippengerBench : public benchmark::Fixture {
26 public:
27 static constexpr size_t MAX_POINTS = 1 << 22;
29 std::vector<Fr> scalars;
31
32 void SetUp([[maybe_unused]] const ::benchmark::State& state) override
33 {
35 srs = bb::srs::get_crs_factory<Curve>()->get_crs(MAX_POINTS);
36
37 scalars.resize(MAX_POINTS);
38 for (auto& x : scalars) {
39 x = Fr::random_element(&engine);
40 }
41 }
42};
43
44// ===================== Single MSM =====================
45
46BENCHMARK_DEFINE_F(PippengerBench, PippengerUnsafe)(benchmark::State& state)
47{
48 const size_t num_points = static_cast<size_t>(state.range(0));
49 std::span<const G1> points = srs->get_monomial_points().subspan(0, num_points);
50 std::span<Fr> span(&scalars[0], num_points);
51 bb::PolynomialSpan<Fr> poly_scalars(0, span);
52
53 for (auto _ : state) {
55 bb::scalar_multiplication::pippenger_unsafe<Curve>(poly_scalars, points);
56 }
57}
58
59// ===================== Batch MSM =====================
60
61BENCHMARK_DEFINE_F(PippengerBench, BatchMSM)(benchmark::State& state)
62{
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));
65
66 std::vector<std::vector<Fr>> all_scalars(num_polys);
67 std::vector<std::span<Fr>> scalar_spans;
69
70 for (size_t i = 0; i < num_polys; ++i) {
71 all_scalars[i].resize(poly_size);
72 for (auto& s : all_scalars[i]) {
74 }
75 scalar_spans.emplace_back(all_scalars[i]);
76 point_spans.emplace_back(srs->get_monomial_points().subspan(0, poly_size));
77 }
78
79 for (auto _ : state) {
82 }
83}
84
85// ===================== Registration =====================
86
87// Single MSM: 2^14 to 2^20
88BENCHMARK_REGISTER_F(PippengerBench, PippengerUnsafe)
89 ->Unit(benchmark::kMillisecond)
90 ->RangeMultiplier(4)
91 ->Range(1 << 14, 1 << 20);
92
93// Batch MSM: {num_polynomials, polynomial_size}
94// AVM-like: 32 polys of size 2^21 (one batch from ~2618 wire polys committed in batches of 32)
95BENCHMARK_REGISTER_F(PippengerBench, BatchMSM)
96 ->Unit(benchmark::kMillisecond)
97 ->Args({ 32, 1 << 19 })
98 ->Args({ 32, 1 << 21 });
99
100} // namespace
101
typename Group::affine_element AffineElement
Definition bn254.hpp:22
bb::fr ScalarField
Definition bn254.hpp:18
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.
numeric::RNG & engine
#define GOOGLE_BB_BENCH_REPORTER(state)
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:217
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
Definition tuple.hpp:13
BENCHMARK_MAIN()
Curve::AffineElement G1
static field random_element(numeric::RNG *engine=nullptr) noexcept