Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_honk.bench.cpp
Go to the documentation of this file.
1#include <benchmark/benchmark.h>
2
6
7using namespace benchmark;
8using namespace bb;
9
13static void construct_proof_ultrahonk(State& state,
14 void (*test_circuit_function)(UltraCircuitBuilder&, size_t)) noexcept
15{
16 size_t num_iterations = 10; // 10x the circuit
17 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraProver>(
18 state, test_circuit_function, num_iterations);
19}
20
24static void construct_proof_ultrahonk_power_of_2(State& state) noexcept
25{
26 auto log2_of_gates = static_cast<size_t>(state.range(0));
27 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraProver>(
28 state, &bb::mock_circuits::generate_basic_arithmetic_circuit<UltraCircuitBuilder>, log2_of_gates);
29}
30
34static void construct_proof_ultrahonk_zk_power_of_2(State& state) noexcept
35{
36 auto log2_of_gates = static_cast<size_t>(state.range(0));
37 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraZKProver>(
38 state, &bb::mock_circuits::generate_basic_arithmetic_circuit<UltraCircuitBuilder>, log2_of_gates);
39}
40
45static void construct_proof_ultrahonk_1M_gates_dyadic_2_20(State& state) noexcept
46{
47 // Target just below 2^20 so that after finalization it rounds to exactly 2^20
48 size_t num_gates = (1 << 20) - 1000; // ~1,047,576 gates
49
50 // Verify actual dyadic size
52 bb::mock_circuits::generate_basic_arithmetic_circuit_with_target_gates<UltraCircuitBuilder>(builder, num_gates);
54 size_t dyadic_size = instance->dyadic_size();
55 info("construct_proof_ultrahonk_1M_gates_dyadic_2_20: requested=",
56 num_gates,
57 ", actual_gates=",
58 builder.num_gates(),
59 ", dyadic_size=",
60 dyadic_size);
61
62 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraProver>(
63 state, &bb::mock_circuits::generate_basic_arithmetic_circuit_with_target_gates<UltraCircuitBuilder>, num_gates);
64}
65
70static void construct_proof_ultrahonk_1M_gates_dyadic_2_21(State& state) noexcept
71{
72 // Target above 2^20 so that after finalization it rounds to 2^21
73 size_t num_gates = (1 << 20) + 1000; // ~1,049,576 gates
74
75 // Verify actual dyadic size
77 bb::mock_circuits::generate_basic_arithmetic_circuit_with_target_gates<UltraCircuitBuilder>(builder, num_gates);
79 size_t dyadic_size = instance->dyadic_size();
80 info("construct_proof_ultrahonk_1M_gates_dyadic_2_21: requested=",
81 num_gates,
82 ", actual_gates=",
83 builder.num_gates(),
84 ", dyadic_size=",
85 dyadic_size);
86
87 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraProver>(
88 state, &bb::mock_circuits::generate_basic_arithmetic_circuit_with_target_gates<UltraCircuitBuilder>, num_gates);
89}
90
94static void construct_proof_ultrahonk_poseidon2_hash(State& state) noexcept
95{
96 const auto num_inputs = static_cast<size_t>(state.range(0));
97
99 bb::generate_poseidon2_hash_test_circuit<UltraCircuitBuilder>(builder, num_inputs);
101 info("construct_proof_ultrahonk_poseidon2_hash: num_inputs=",
102 num_inputs,
103 ", actual_gates=",
104 builder.num_gates(),
105 ", dyadic_size=",
106 instance->dyadic_size());
107
108 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraProver>(
109 state, &bb::generate_poseidon2_hash_test_circuit<UltraCircuitBuilder>, num_inputs);
110}
111
112// Define benchmarks
113// Sweep input sizes so dyadic domain ranges 2^15..2^19 (Ultra: ~25 gates/input).
114BENCHMARK(construct_proof_ultrahonk_poseidon2_hash)
115 ->Arg(750)
116 ->Arg(1500)
117 ->Arg(3000)
118 ->Arg(6000)
119 ->Arg(12000)
120 ->Arg(50000)
121 ->Unit(kMillisecond);
122
123BENCHMARK_CAPTURE(construct_proof_ultrahonk, sha256, &generate_sha256_test_circuit<UltraCircuitBuilder>)
124 ->Unit(kMillisecond);
125BENCHMARK_CAPTURE(construct_proof_ultrahonk,
126 ecdsa_verification,
127 &stdlib::generate_ecdsa_verification_test_circuit<UltraCircuitBuilder>)
128 ->Unit(kMillisecond);
129
130BENCHMARK(construct_proof_ultrahonk_power_of_2)
131 // 2**15 gates to 2**20 gates
132 ->DenseRange(15, 20)
133 ->Unit(kMillisecond);
134
135BENCHMARK(construct_proof_ultrahonk_zk_power_of_2)
136 // 2**15 gates to 2**20 gates
137 ->DenseRange(15, 20)
138 ->Unit(kMillisecond);
139
144static void construct_proof_ultrahonk_sparse(State& state) noexcept
145{
146 auto log2_of_gates = static_cast<size_t>(state.range(0));
147 size_t target_gates = (1UL << log2_of_gates) + (1UL << log2_of_gates) / 10;
148 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraProver>(
149 state,
150 &bb::mock_circuits::generate_basic_arithmetic_circuit_with_target_gates<UltraCircuitBuilder>,
151 target_gates);
152}
153
157static void construct_proof_ultrahonk_zk_sparse(State& state) noexcept
158{
159 auto log2_of_gates = static_cast<size_t>(state.range(0));
160 size_t target_gates = (1UL << log2_of_gates) + (1UL << log2_of_gates) / 10;
161 bb::mock_circuits::construct_proof_with_specified_num_iterations<UltraZKProver>(
162 state,
163 &bb::mock_circuits::generate_basic_arithmetic_circuit_with_target_gates<UltraCircuitBuilder>,
164 target_gates);
165}
166
167BENCHMARK(construct_proof_ultrahonk_sparse)->DenseRange(15, 20)->Unit(kMillisecond);
168
169BENCHMARK(construct_proof_ultrahonk_zk_sparse)->DenseRange(15, 20)->Unit(kMillisecond);
170
171BENCHMARK(construct_proof_ultrahonk_1M_gates_dyadic_2_20)->Unit(kMillisecond);
172BENCHMARK(construct_proof_ultrahonk_1M_gates_dyadic_2_21)->Unit(kMillisecond);
173
174int main(int argc, char** argv)
175{
176 // Enable BB_BENCH profiling
178
179 // Run benchmarks
180 ::benchmark::Initialize(&argc, argv);
181 if (::benchmark::ReportUnrecognizedArguments(argc, argv))
182 return 1;
183 ::benchmark::RunSpecifiedBenchmarks();
184 ::benchmark::Shutdown();
185
186 // Print detailed profiling stats
187 std::cout << "\n=== Detailed BB_BENCH Profiling Stats ===\n";
189
190 return 0;
191}
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define info(...)
Definition log.hpp:93
AluTraceBuilder builder
Definition alu.test.cpp:124
GlobalBenchStatsContainer GLOBAL_BENCH_STATS
Definition bb_bench.cpp:822
bool use_bb_bench
Definition bb_bench.cpp:175
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
PureSha256 sha256
void print_aggregate_counts_hierarchical(std::ostream &) const
Definition bb_bench.cpp:548
BENCHMARK_CAPTURE(construct_proof_ultrahonk, ecdsa_verification, &stdlib::generate_ecdsa_verification_test_circuit< UltraCircuitBuilder >) -> Unit(kMillisecond)
int main(int argc, char **argv)
BENCHMARK(construct_proof_ultrahonk_sparse) -> DenseRange(15, 20) ->Unit(kMillisecond)