From f807db388b64531e497740c646eb582f44f3d38a Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Fri, 9 Apr 2021 10:26:21 -0700 Subject: [PATCH 1/4] Add bench_field_mul_interleaved benchmark --- src/bin/bench_field_mul.rs | 20 +++++++++------- src/bin/bench_field_mul_interleaved.rs | 33 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 src/bin/bench_field_mul_interleaved.rs diff --git a/src/bin/bench_field_mul.rs b/src/bin/bench_field_mul.rs index 4a1b7e04..2953e4bd 100644 --- a/src/bin/bench_field_mul.rs +++ b/src/bin/bench_field_mul.rs @@ -1,3 +1,5 @@ +//! Performs a single exponentiation. + use std::time::Instant; use plonky2::field::crandall_field::CrandallField; @@ -5,17 +7,19 @@ use plonky2::field::field::Field; type F = CrandallField; +const EXPONENT: usize = 1000000000; + fn main() { - let m = F::from_canonical_u64(12345678901234567890); - let mut x = F::ONE; + let base = F::rand(); + let mut state = F::ONE; + let start = Instant::now(); - let num_muls = 2000000000; - for _ in 0..num_muls { - x *= m; + for _ in 0..EXPONENT { + state *= base; } let duration = start.elapsed(); - println!("result {:?}", x); - println!("took {:?}", duration); - println!("avg {:?}ns", duration.as_secs_f64() * 1e9 / (num_muls as f64)); + println!("Result: {:?}", state); + println!("Average field mul: {:?}ns", + duration.as_secs_f64() * 1e9 / EXPONENT as f64); } diff --git a/src/bin/bench_field_mul_interleaved.rs b/src/bin/bench_field_mul_interleaved.rs new file mode 100644 index 00000000..b79a93a4 --- /dev/null +++ b/src/bin/bench_field_mul_interleaved.rs @@ -0,0 +1,33 @@ +//! Performs several exponentiations in an interleaved loop, to enable parallelism on the core. + +use std::time::Instant; + +use plonky2::field::crandall_field::CrandallField; +use plonky2::field::field::Field; + +type F = CrandallField; + +/// The number of exponentiations to perform in parallel. +const WIDTH: usize = 6; + +const EXPONENT: usize = 1000000000; + +fn main() { + let mut bases = [F::ZERO; WIDTH]; + for i in 0..WIDTH { + bases[i] = F::rand(); + } + let mut state = [F::ONE; WIDTH]; + + let start = Instant::now(); + for _ in 0..EXPONENT { + for i in 0..WIDTH { + state[i] *= bases[i]; + } + } + let duration = start.elapsed(); + + println!("Result: {:?}", state); + println!("Average field mul: {:?}ns", + duration.as_secs_f64() * 1e9 / (WIDTH * EXPONENT) as f64); +} From 30b845e6b30b3fe83ebbd85286a85794c3305d12 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Mon, 12 Apr 2021 10:18:16 -0700 Subject: [PATCH 2/4] Add generator to circuit --- src/gadgets/split_join.rs | 4 +++- src/hash.rs | 6 ++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gadgets/split_join.rs b/src/gadgets/split_join.rs index 21821706..db9d2aab 100644 --- a/src/gadgets/split_join.rs +++ b/src/gadgets/split_join.rs @@ -18,12 +18,13 @@ impl CircuitBuilder { num_bits: usize, ) -> Vec { let bit_targets = self.add_virtual_advice_targets(num_bits); - split_le_generator::(integer, bit_targets.clone()); + self.add_generator(SplitGenerator { integer, bits: bit_targets.clone() }); bit_targets } } /// Generator for a little-endian split. +#[must_use] pub fn split_le_generator( integer: Target, bits: Vec, @@ -32,6 +33,7 @@ pub fn split_le_generator( } /// Generator for a little-endian split. +#[must_use] pub fn split_le_generator_local_wires( gate: usize, integer_input_index: usize, diff --git a/src/hash.rs b/src/hash.rs index e90cdb0a..4cf30126 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -1,15 +1,13 @@ //! Concrete instantiation of a hash function. -use std::convert::TryInto; - use rayon::prelude::*; +use crate::circuit_builder::CircuitBuilder; use crate::field::field::Field; use crate::gmimc::gmimc_permute_array; use crate::proof::{Hash, HashTarget}; -use crate::util::reverse_index_bits_in_place; -use crate::circuit_builder::CircuitBuilder; use crate::target::Target; +use crate::util::reverse_index_bits_in_place; pub(crate) const SPONGE_RATE: usize = 8; pub(crate) const SPONGE_CAPACITY: usize = 4; From 62dccedda4abb40204fdf6bc5239086c0c81376a Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Fri, 16 Apr 2021 09:01:54 -0700 Subject: [PATCH 3/4] Fix id() to include (generic) R param --- src/gates/gmimc.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gates/gmimc.rs b/src/gates/gmimc.rs index dad8b078..ccd1fcfd 100644 --- a/src/gates/gmimc.rs +++ b/src/gates/gmimc.rs @@ -62,8 +62,7 @@ impl GMiMCGate { impl Gate for GMiMCGate { fn id(&self) -> String { - // TODO: This won't include generic params? - format!("{:?}", self) + format!(" {:?}", R, self) } fn eval_unfiltered(&self, vars: EvaluationVars) -> Vec { From 70f4f2aab85cc3d721e32208dfd4ba39866629e3 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Fri, 16 Apr 2021 21:40:51 -0700 Subject: [PATCH 4/4] Minimal num_wires --- src/gates/gmimc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gates/gmimc.rs b/src/gates/gmimc.rs index ccd1fcfd..98b42559 100644 --- a/src/gates/gmimc.rs +++ b/src/gates/gmimc.rs @@ -261,7 +261,7 @@ mod tests { let gate = Gate::with_constants(constants.clone()); let config = CircuitConfig { - num_wires: 200, + num_wires: 134, num_routed_wires: 200, ..Default::default() };