diff --git a/halo2_proofs/src/dev.rs b/halo2_proofs/src/dev.rs index 6cbe83db2e..17cd45e008 100644 --- a/halo2_proofs/src/dev.rs +++ b/halo2_proofs/src/dev.rs @@ -3,8 +3,10 @@ use std::collections::HashMap; use std::collections::HashSet; use std::iter; +use std::mem; use std::ops::{Add, Mul, Neg, Range}; use std::sync::Arc; +use std::time::{Duration, Instant}; use blake2b_simd::blake2b; #[cfg(feature = "mock-batch-inv")] @@ -427,7 +429,8 @@ impl Mul for Value { pub struct MockProver<'a, F: Field> { k: u32, n: u32, - cs: ConstraintSystem, + // use Arc type to reduce cs.clone when fork lots of time. + cs: Arc>, /// The regions in the circuit. regions: Vec, @@ -444,7 +447,8 @@ pub struct MockProver<'a, F: Field> { // This field is used only if the "phase_check" feature is turned on. advice_prev: Vec>>, // The instance cells in the circuit, arranged as [column][row]. - instance: Vec>>, + // use Arc type to reduce instance.clone when fork lots of time. + instance: Arc>>>, selectors_vec: Arc>>, selectors: Vec<&'a mut [bool]>, @@ -847,6 +851,9 @@ impl<'a, F: Field> Assignment for MockProver<'a, F> { let advice_anno = anno().into(); #[cfg(not(feature = "mock-batch-inv"))] let val_res = to().into_field().evaluate().assign(); + #[cfg(feature = "mock-batch-inv")] + panic!("confiugred mock-batch-inv !!!"); + #[cfg(feature = "mock-batch-inv")] let val_res = to().into_field().assign(); if val_res.is_err() { @@ -1085,12 +1092,22 @@ impl<'a, F: FromUniformBytes<64> + Ord> MockProver<'a, F> { ) -> Result { let n = 1 << k; + #[cfg(feature = "mock-batch-inv")] + println!("confiugred mock-batch-inv !!!"); + #[cfg(not(feature = "mock-batch-inv"))] + println!("not configured mock-batch-inv !!!"); + + let cell_value_size = mem::size_of::>(); + println!("Size of CellValue type: {} bytes", cell_value_size); + let mut cs = ConstraintSystem::default(); #[cfg(feature = "circuit-params")] let config = ConcreteCircuit::configure_with_params(&mut cs, circuit.params()); #[cfg(not(feature = "circuit-params"))] let config = ConcreteCircuit::configure(&mut cs); let cs = cs.chunk_lookups(); + let cs = cs; + let cs = Arc::new(cs); assert!( n >= cs.minimum_rows(), @@ -1122,6 +1139,7 @@ impl<'a, F: FromUniformBytes<64> + Ord> MockProver<'a, F> { }) .collect::>(); + let instance = Arc::new(instance); // Fixed columns contain no blinding factors. let fixed_vec = Arc::new(vec![vec![CellValue::Unassigned; n]; cs.num_fixed_columns]); let fixed = two_dim_vec_to_vec_of_slice!(fixed_vec); @@ -1260,11 +1278,13 @@ impl<'a, F: FromUniformBytes<64> + Ord> MockProver<'a, F> { ConcreteCircuit::FloorPlanner::synthesize(&mut prover, circuit, config, constants)?; log::info!("MockProver synthesize took {:?}", syn_time.elapsed()); } - - let (cs, selector_polys) = prover - .cs - .compress_selectors(prover.selectors_vec.as_ref().clone()); - prover.cs = cs; + let prover_cs = Arc::try_unwrap(prover.cs).unwrap(); + // let (cs, selector_polys) = prover + // .cs + // .compress_selectors(prover.selectors_vec.as_ref().clone()); + let (cs, selector_polys) = + prover_cs.compress_selectors(prover.selectors_vec.as_ref().clone()); + prover.cs = Arc::new(cs); // batch invert #[cfg(feature = "mock-batch-inv")] @@ -2326,6 +2346,7 @@ mod tests { use super::{FailureLocation, MockProver, VerifyFailure}; use crate::{ circuit::{Layouter, SimpleFloorPlanner, Value}, + dev::CellValue, plonk::{ sealed::SealedPhase, Advice, Any, Circuit, Column, ConstraintSystem, Error, Expression, FirstPhase, Fixed, Instance, Selector, TableColumn,