From d17f43878807b2478aabc3d575d10fd4dba66564 Mon Sep 17 00:00:00 2001 From: han0110 Date: Thu, 7 Sep 2023 07:13:14 +0000 Subject: [PATCH] feat: add `pcs` benchmark --- plonkish_backend/Cargo.toml | 5 + plonkish_backend/benches/pcs.rs | 127 +++++++++++++++++++++++ plonkish_backend/src/poly.rs | 8 ++ plonkish_backend/src/poly/multilinear.rs | 5 + plonkish_backend/src/poly/univariate.rs | 5 + 5 files changed, 150 insertions(+) create mode 100644 plonkish_backend/benches/pcs.rs diff --git a/plonkish_backend/Cargo.toml b/plonkish_backend/Cargo.toml index 85761157..e22ceb94 100644 --- a/plonkish_backend/Cargo.toml +++ b/plonkish_backend/Cargo.toml @@ -45,3 +45,8 @@ sanity-check = [] name = "zero_check" harness = false required-features = ["benchmark"] + +[[bench]] +name = "pcs" +harness = false +required-features = ["benchmark"] diff --git a/plonkish_backend/benches/pcs.rs b/plonkish_backend/benches/pcs.rs new file mode 100644 index 00000000..81124ada --- /dev/null +++ b/plonkish_backend/benches/pcs.rs @@ -0,0 +1,127 @@ +use criterion::{ + black_box, criterion_group, criterion_main, measurement::Measurement, BenchmarkGroup, + BenchmarkId, Criterion, +}; +use halo2_curves::bn256::{Bn256, Fr, G1Affine}; +use plonkish_backend::{ + pcs::{ + multilinear::{ + Gemini, MultilinearBrakedown, MultilinearHyrax, MultilinearIpa, MultilinearKzg, + Zeromorph, + }, + univariate::UnivariateKzg, + Point, PolynomialCommitmentScheme, + }, + poly::Polynomial, + util::{ + arithmetic::PrimeField, + code::BrakedownSpec6, + hash::Keccak256, + test::std_rng, + transcript::{InMemoryTranscript, Keccak256Transcript, TranscriptWrite}, + }, +}; +use std::{any::type_name, io::Cursor, ops::Range}; + +const NUM_VARS_RANGE: Range = 16..21; + +fn pcs_name() -> &'static str { + type_name::() + .split("::") + .find(|s| s.chars().next().unwrap().is_uppercase()) + .unwrap() + .split('<') + .next() + .unwrap() +} + +#[allow(clippy::type_complexity)] +fn prepare( + k: usize, +) -> ( + Pcs::ProverParam, + Pcs::Polynomial, + Pcs::Commitment, + Point, + F, +) +where + F: PrimeField, + Pcs: PolynomialCommitmentScheme, +{ + let n = 1 << k; + let mut rng = std_rng(); + let param = Pcs::setup(n, 1, &mut rng).unwrap(); + let (pp, _) = Pcs::trim(¶m, n, 1).unwrap(); + let poly = Pcs::Polynomial::rand(n, &mut rng); + let comm = Pcs::commit(&pp, &poly).unwrap(); + let point = Pcs::Polynomial::rand_point(k, &mut rng); + let eval = poly.evaluate(&point); + (pp, poly, comm, point, eval) +} + +fn commit(group: &mut BenchmarkGroup) +where + F: PrimeField, + Pcs: PolynomialCommitmentScheme, +{ + let name = pcs_name::(); + for k in NUM_VARS_RANGE { + let (pp, poly, _, _, _) = prepare::(k); + group.bench_with_input(BenchmarkId::new(name, k), &k, |b, _| { + b.iter(|| Pcs::commit(black_box(&pp), black_box(&poly)).unwrap()) + }); + } +} + +fn open(group: &mut BenchmarkGroup) +where + F: PrimeField, + Pcs: PolynomialCommitmentScheme, + Keccak256Transcript>>: TranscriptWrite, +{ + let name = pcs_name::(); + for k in NUM_VARS_RANGE { + let (pp, poly, comm, point, eval) = prepare::(k); + group.bench_with_input(BenchmarkId::new(name, k), &k, |b, _| { + b.iter(|| { + Pcs::open( + black_box(&pp), + black_box(&poly), + black_box(&comm), + black_box(&point), + black_box(&eval), + black_box(&mut Keccak256Transcript::new(())), + ) + .unwrap() + }) + }); + } +} + +fn bench_commit(c: &mut Criterion) { + let mut group = c.benchmark_group("commit"); + group.sample_size(10); + + commit::<_, MultilinearBrakedown>(&mut group); + commit::<_, MultilinearKzg>(&mut group); + commit::<_, MultilinearIpa>(&mut group); + commit::<_, MultilinearHyrax>(&mut group); + commit::<_, Gemini>>(&mut group); + commit::<_, Zeromorph>>(&mut group); +} + +fn bench_open(c: &mut Criterion) { + let mut group = c.benchmark_group("open"); + group.sample_size(10); + + open::<_, MultilinearBrakedown>(&mut group); + open::<_, MultilinearKzg>(&mut group); + open::<_, MultilinearIpa>(&mut group); + open::<_, MultilinearHyrax>(&mut group); + open::<_, Gemini>>(&mut group); + open::<_, Zeromorph>>(&mut group); +} + +criterion_group!(benches, bench_commit, bench_open); +criterion_main!(benches); diff --git a/plonkish_backend/src/poly.rs b/plonkish_backend/src/poly.rs index 33a21d3d..ac491706 100644 --- a/plonkish_backend/src/poly.rs +++ b/plonkish_backend/src/poly.rs @@ -14,4 +14,12 @@ pub trait Polynomial: Clone + Debug + for<'a> AddAssign<(&'a F, &'a Se fn evals(&self) -> &[F]; fn evaluate(&self, point: &Self::Point) -> F; + + #[cfg(any(test, feature = "benchmark"))] + fn rand(n: usize, rng: &mut impl rand::RngCore) -> Self { + Self::from_evals(crate::util::test::rand_vec(n, rng)) + } + + #[cfg(any(test, feature = "benchmark"))] + fn rand_point(k: usize, rng: &mut impl rand::RngCore) -> Self::Point; } diff --git a/plonkish_backend/src/poly/multilinear.rs b/plonkish_backend/src/poly/multilinear.rs index 20ccf63b..df3dc2af 100644 --- a/plonkish_backend/src/poly/multilinear.rs +++ b/plonkish_backend/src/poly/multilinear.rs @@ -80,6 +80,11 @@ impl Polynomial for MultilinearPolynomial { fn evaluate(&self, point: &Self::Point) -> F { MultilinearPolynomial::evaluate(self, point.as_slice()) } + + #[cfg(any(test, feature = "benchmark"))] + fn rand_point(k: usize, rng: &mut impl rand::RngCore) -> Self::Point { + crate::util::test::rand_vec(k, rng) + } } impl MultilinearPolynomial { diff --git a/plonkish_backend/src/poly/univariate.rs b/plonkish_backend/src/poly/univariate.rs index da2531fd..2fcef7d7 100644 --- a/plonkish_backend/src/poly/univariate.rs +++ b/plonkish_backend/src/poly/univariate.rs @@ -81,6 +81,11 @@ impl Polynomial for UnivariatePolynomial { fn evaluate(&self, point: &Self::Point) -> F { UnivariatePolynomial::evaluate(self, point) } + + #[cfg(any(test, feature = "benchmark"))] + fn rand_point(_: usize, rng: &mut impl rand::RngCore) -> F { + F::random(rng) + } } impl UnivariatePolynomial {