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
13
14#include <benchmark/benchmark.h>
15
17
18using namespace benchmark;
19
23
24namespace {
25
26class PippengerBench : public benchmark::Fixture {
27 public:
28 static constexpr size_t MAX_POINTS = 1 << 22;
30 std::vector<Fr> scalars;
32
33 void SetUp([[maybe_unused]] const ::benchmark::State& state) override
34 {
36 srs = bb::srs::get_crs_factory<Curve>()->get_crs(MAX_POINTS);
37
38 scalars.resize(MAX_POINTS);
39 for (auto& x : scalars) {
40 x = Fr::random_element(&engine);
41 }
42 }
43};
44
45// ===================== Single MSM =====================
46
47BENCHMARK_DEFINE_F(PippengerBench, PippengerUnsafe)(benchmark::State& state)
48{
49 const size_t num_points = static_cast<size_t>(state.range(0));
50 std::span<const G1> points = srs->get_monomial_points().subspan(0, num_points);
51 std::span<Fr> span(&scalars[0], num_points);
52 bb::PolynomialSpan<Fr> poly_scalars(0, span);
53
54 for (auto _ : state) {
56 bb::scalar_multiplication::pippenger_unsafe<Curve>(poly_scalars, points);
57 }
58}
59
60// ===================== Batch MSM =====================
61
62BENCHMARK_DEFINE_F(PippengerBench, BatchMSM)(benchmark::State& state)
63{
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));
66
67 std::vector<std::vector<Fr>> all_scalars(num_polys);
68 std::vector<std::span<Fr>> scalar_spans;
70
71 for (size_t i = 0; i < num_polys; ++i) {
72 all_scalars[i].resize(poly_size);
73 for (auto& s : all_scalars[i]) {
75 }
76 scalar_spans.emplace_back(all_scalars[i]);
77 point_spans.emplace_back(srs->get_monomial_points().subspan(0, poly_size));
78 }
79
80 for (auto _ : state) {
83 }
84}
85
96BENCHMARK_DEFINE_F(PippengerBench, BatchMSM_1656)(benchmark::State& state)
97{
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));
100
101 std::vector<Fr> msm_scalars(msm_size);
102 for (auto& s : msm_scalars) {
104 }
105
106 std::vector<std::span<Fr>> scalar_spans;
108 scalar_spans.emplace_back(msm_scalars);
109 point_spans.emplace_back(srs->get_monomial_points().subspan(0, msm_size));
110
111 // This is thread-local: restore after the benchmark so other cases in this binary are unaffected.
112 const size_t original_concurrency = bb::get_num_cpus();
114
115 for (auto _ : state) {
118 }
119
120 bb::set_parallel_for_concurrency(original_concurrency);
121}
122
123// ===================== Registration =====================
124
125// Single MSM: 2^14 to 2^20
126BENCHMARK_REGISTER_F(PippengerBench, PippengerUnsafe)
127 ->Unit(benchmark::kMillisecond)
128 ->RangeMultiplier(4)
129 ->Range(1 << 14, 1 << 20);
130
131// Batch MSM: {num_polynomials, polynomial_size}
132// AVM-like: 32 polys of size 2^21 (one batch from ~2618 wire polys committed in batches of 32)
133BENCHMARK_REGISTER_F(PippengerBench, BatchMSM)
134 ->Unit(benchmark::kMillisecond)
135 ->Args({ 32, 1 << 19 })
136 ->Args({ 32, 1 << 21 });
137
138// Issue #1656 target: {threads=256, msm_size}
139BENCHMARK_REGISTER_F(PippengerBench, BatchMSM_1656)
140 ->Unit(benchmark::kMillisecond)
141 ->Args({ 256, 1 << 16 })
142 ->Args({ 256, 1 << 20 });
143
144} // namespace
145
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:245
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
size_t get_num_cpus()
Definition thread.cpp:33
void set_parallel_for_concurrency(size_t num_cores)
Definition thread.cpp:23
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