30#include <benchmark/benchmark.h>
32using namespace benchmark;
37#define MAX_REPETITION_LOG 12
46void parallel_for_field_element_addition(State& state)
51 for (
size_t i = 0; i < num_cpus; i++) {
52 for (
size_t j = 0; j < 2; j++) {
57 for (
auto _ : state) {
59 size_t num_external_cycles = 1 <<
static_cast<size_t>(state.range(0));
60 size_t num_internal_cycles = 1 << (
MAX_REPETITION_LOG -
static_cast<size_t>(state.range(0)));
62 for (
size_t i = 0; i < num_external_cycles; i++) {
63 parallel_for(num_cpus, [num_internal_cycles, ©_vector](
size_t index) {
64 for (
size_t i = 0; i < num_internal_cycles; i++) {
65 copy_vector[index][i & 1] += copy_vector[index][1 - (i & 1)];
78void ff_addition(State& state)
81 std::vector<Fr> copy_vector(2);
82 for (
size_t j = 0; j < 2; j++) {
87 for (
auto _ : state) {
89 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
91 for (
size_t i = 0; i < num_cycles; i++) {
92 copy_vector[i & 1] += copy_vector[1 - (i & 1)];
103void ff_multiplication(State& state)
106 std::vector<Fr> copy_vector(2);
107 for (
size_t j = 0; j < 2; j++) {
112 for (
auto _ : state) {
114 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
115 state.ResumeTiming();
116 for (
size_t i = 0; i < num_cycles; i++) {
117 copy_vector[i & 1] *= copy_vector[1 - (i & 1)];
128void ff_sqr(State& state)
131 std::vector<Fr> copy_vector(2);
132 for (
size_t j = 0; j < 2; j++) {
137 for (
auto _ : state) {
139 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
140 state.ResumeTiming();
141 for (
size_t i = 0; i < num_cycles; i++) {
142 copy_vector[0] = copy_vector[0].sqr();
153void ff_invert(State& state)
158 for (
auto _ : state) {
160 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
161 state.ResumeTiming();
162 for (
size_t i = 0; i < num_cycles; i++) {
174void ff_to_montgomery(State& state)
179 for (
auto _ : state) {
181 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
182 state.ResumeTiming();
183 for (
size_t i = 0; i < num_cycles; i++) {
194void ff_from_montgomery(State& state)
199 for (
auto _ : state) {
201 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
202 state.ResumeTiming();
203 for (
size_t i = 0; i < num_cycles; i++) {
215void ff_reduce(State& state)
220 for (
auto _ : state) {
222 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
223 state.ResumeTiming();
224 for (
size_t i = 0; i < num_cycles; i++) {
236void projective_point_addition(State& state)
240 for (
size_t j = 0; j < 2; j++) {
241 copy_vector.emplace_back(Curve::Element::random_element(&
engine));
242 copy_vector.emplace_back(Curve::Element::random_element(&
engine));
245 for (
auto _ : state) {
247 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
248 state.ResumeTiming();
249 for (
size_t i = 0; i < num_cycles; i++) {
250 copy_vector[i & 1] += copy_vector[1 - (i & 1)];
261void projective_point_accidental_doubling(State& state)
265 for (
size_t j = 0; j < 2; j++) {
266 copy_vector.emplace_back(Curve::Element::random_element(&
engine));
267 copy_vector.emplace_back(Curve::Element::random_element(&
engine));
270 for (
auto _ : state) {
272 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
273 state.ResumeTiming();
274 for (
size_t i = 0; i < num_cycles; i++) {
275 copy_vector[0] += copy_vector[0];
286void projective_point_doubling(State& state)
290 for (
size_t j = 0; j < 2; j++) {
291 copy_vector.emplace_back(Curve::Element::random_element(&
engine));
292 copy_vector.emplace_back(Curve::Element::random_element(&
engine));
295 for (
auto _ : state) {
297 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
298 state.ResumeTiming();
299 for (
size_t i = 0; i < num_cycles; i++) {
300 copy_vector[0] = copy_vector[0].dbl();
311void scalar_multiplication_bench(State& state)
317 for (
auto _ : state) {
319 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
320 state.ResumeTiming();
321 for (
size_t i = 0; i < num_cycles; i++) {
333void cycle_waste(State& state)
336 for (
auto _ : state) {
338 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
339 state.ResumeTiming();
340 for (
volatile size_t i = 0; i < num_cycles;) {
352void sequential_copy(State& state)
356 for (
auto _ : state) {
358 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
359 std::vector<Fr> input(num_cycles);
360 for (
size_t i = 0; i < num_cycles; i++) {
363 std::vector<Fr> output(num_cycles);
365 state.ResumeTiming();
366 for (
size_t i = 0; i < num_cycles; i++) {
367 output[i] = input[i];
377void uint_multiplication(State& state)
381 for (
size_t j = 0; j < 2; j++) {
384 copy_vector[0] += (1 - copy_vector[0].get_bit(0));
385 copy_vector[1] += (1 - copy_vector[1].get_bit(0));
388 for (
auto _ : state) {
390 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
391 state.ResumeTiming();
392 for (
size_t i = 0; i < num_cycles; i++) {
393 copy_vector[i & 1] *= copy_vector[1 - (i & 1)];
403void uint_extended_multiplication(State& state)
407 for (
size_t j = 0; j < 2; j++) {
410 copy_vector[0] += (1 - copy_vector[0].get_bit(0));
411 copy_vector[1] += (1 - copy_vector[1].get_bit(0));
414 for (
auto _ : state) {
416 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
417 state.ResumeTiming();
418 for (
size_t i = 0; i < num_cycles; i++) {
419 auto [r0, r1] = copy_vector[i & 1].mul_extended(copy_vector[1 - (i & 1)]);
421 copy_vector[i & 1] += r0;
422 copy_vector[1 - (i & 1)] += r1;
423 copy_vector[0] += (1 - copy_vector[0].get_bit(0));
424 copy_vector[1] += (1 - copy_vector[1].get_bit(0));
425 state.ResumeTiming();
434static void DoPippengerSetup(
const benchmark::State&)
454 for (
auto _ : state) {
456 size_t num_cycles = 1 <<
static_cast<size_t>(state.range(0));
458 for (
size_t i = 0; i < num_cycles; i++) {
460 pol.at(i).self_reduce_once();
461 pol.at(i).self_reduce_once();
462 pol.at(i).self_reduce_once();
466 state.ResumeTiming();
467 benchmark::DoNotOptimize(
ck.commit(pol));
471void bn254fr_random(State& state)
474 for (
auto _ : state) {
476 size_t num_cycles = 1UL <<
static_cast<size_t>(state.range(0));
477 state.ResumeTiming();
478 for (
size_t i = 0; i < num_cycles; i++) {
486BENCHMARK(ff_addition)->Unit(kMicrosecond)->DenseRange(12, 30);
487BENCHMARK(ff_multiplication)->Unit(kMicrosecond)->DenseRange(12, 27);
488BENCHMARK(ff_sqr)->Unit(kMicrosecond)->DenseRange(12, 27);
489BENCHMARK(ff_invert)->Unit(kMicrosecond)->DenseRange(12, 19);
490BENCHMARK(ff_to_montgomery)->Unit(kMicrosecond)->DenseRange(12, 27);
491BENCHMARK(ff_from_montgomery)->Unit(kMicrosecond)->DenseRange(12, 27);
492BENCHMARK(ff_reduce)->Unit(kMicrosecond)->DenseRange(12, 29);
493BENCHMARK(projective_point_addition)->Unit(kMicrosecond)->DenseRange(12, 22);
494BENCHMARK(projective_point_accidental_doubling)->Unit(kMicrosecond)->DenseRange(12, 22);
495BENCHMARK(projective_point_doubling)->Unit(kMicrosecond)->DenseRange(12, 22);
496BENCHMARK(scalar_multiplication_bench)->Unit(kMicrosecond)->DenseRange(12, 18);
497BENCHMARK(cycle_waste)->Unit(kMicrosecond)->DenseRange(20, 30);
498BENCHMARK(sequential_copy)->Unit(kMicrosecond)->DenseRange(20, 25);
499BENCHMARK(uint_multiplication)->Unit(kMicrosecond)->DenseRange(12, 27);
500BENCHMARK(uint_extended_multiplication)->Unit(kMicrosecond)->DenseRange(12, 27);
501BENCHMARK(pippenger)->Unit(kMicrosecond)->DenseRange(16, 20)->Setup(DoPippengerSetup)->Iterations(5);
502BENCHMARK(bn254fr_random)->Unit(kMicrosecond)->DenseRange(10, 20);
#define MAX_REPETITION_LOG
BENCHMARK(parallel_for_field_element_addition) -> Unit(kMicrosecond) ->DenseRange(0, MAX_REPETITION_LOG)
CommitmentKey object over a pairing group 𝔾₁.
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
typename Group::element Element
virtual uint256_t get_random_uint256()=0
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Curve::Element pippenger(PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, bool handle_edge_cases) noexcept
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
std::conditional_t< IsGoblinBigGroup< C, Fq, Fr, G >, element_goblin::goblin_element< C, goblin_field< C >, Fr, G >, element_default::element< C, Fq, Fr, G > > element
element wraps either element_default::element or element_goblin::goblin_element depending on parametr...
Entry point for Barretenberg command-line interface.
CommitmentKey< Curve > ck
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept