@@ -6,6 +6,8 @@ use std::ops::Range;
6
6
use std:: sync:: { Arc , Mutex } ;
7
7
use std:: time:: Instant ;
8
8
9
+ use rayon:: prelude:: { IndexedParallelIterator , IntoParallelIterator , ParallelIterator } ;
10
+
9
11
use ff:: Field ;
10
12
11
13
use ark_std:: { end_timer, start_timer} ;
@@ -258,39 +260,28 @@ impl<'a, F: Field, CS: Assignment<F> + 'a> Layouter<F> for SingleChipLayouter<'a
258
260
let ref_sub_cs = sub_cs. iter_mut ( ) . collect ( ) ;
259
261
let sub_layouters = self . fork ( ref_sub_cs) ?;
260
262
let regions_2nd_pass = Instant :: now ( ) ;
261
- let ret = crossbeam:: scope ( |scope| {
262
- let mut handles = vec ! [ ] ;
263
- for ( i, ( mut assignment, mut sub_layouter) ) in assignments
264
- . into_iter ( )
265
- . zip ( sub_layouters. into_iter ( ) )
266
- . enumerate ( )
267
- {
263
+ let ret = assignments
264
+ . into_par_iter ( )
265
+ . zip ( sub_layouters. into_par_iter ( ) )
266
+ . enumerate ( )
267
+ . map ( |( i, ( mut assignment, mut sub_layouter) ) | {
268
268
let region_name = format ! ( "{}_{}" , region_name, i) ;
269
- handles. push ( scope. spawn ( move |_| {
270
- let sub_region_2nd_pass = Instant :: now ( ) ;
271
- sub_layouter. cs . enter_region ( || region_name. clone ( ) ) ;
272
- let mut region =
273
- SingleChipLayouterRegion :: new ( & mut sub_layouter, ( region_index + i) . into ( ) ) ;
274
- let region_ref: & mut dyn RegionLayouter < F > = & mut region;
275
- let result = assignment ( region_ref. into ( ) ) ;
276
- let constant = region. constants . clone ( ) ;
277
- sub_layouter. cs . exit_region ( ) ;
278
- log:: debug!(
279
- "region {} 2nd pass synthesis took {:?}" ,
280
- region_name,
281
- sub_region_2nd_pass. elapsed( )
282
- ) ;
283
-
284
- ( result, constant)
285
- } ) ) ;
286
- }
287
-
288
- handles
289
- . into_iter ( )
290
- . map ( |handle| handle. join ( ) . expect ( "handle.join should never fail" ) )
291
- . collect :: < Vec < _ > > ( )
292
- } )
293
- . expect ( "scope should not fail" ) ;
269
+ let sub_region_2nd_pass = Instant :: now ( ) ;
270
+ sub_layouter. cs . enter_region ( || region_name. clone ( ) ) ;
271
+ let mut region =
272
+ SingleChipLayouterRegion :: new ( & mut sub_layouter, ( region_index + i) . into ( ) ) ;
273
+ let region_ref: & mut dyn RegionLayouter < F > = & mut region;
274
+ let result = assignment ( region_ref. into ( ) ) ;
275
+ let constant = region. constants . clone ( ) ;
276
+ sub_layouter. cs . exit_region ( ) ;
277
+ log:: debug!(
278
+ "region {} 2nd pass synthesis took {:?}" ,
279
+ region_name,
280
+ sub_region_2nd_pass. elapsed( )
281
+ ) ;
282
+ ( result, constant)
283
+ } )
284
+ . collect :: < Vec < _ > > ( ) ;
294
285
let cs_merge_time = Instant :: now ( ) ;
295
286
let num_sub_cs = sub_cs. len ( ) ;
296
287
self . cs . merge ( sub_cs) ?;
@@ -490,17 +481,15 @@ impl<'r, 'a, F: Field, CS: Assignment<F> + 'a> RegionLayouter<F>
490
481
}
491
482
492
483
fn query_advice ( & self , column : Column < Advice > , offset : usize ) -> Result < F , Error > {
493
- self . layouter . cs . query_advice (
494
- column,
495
- * self . layouter . regions [ * self . region_index ] + offset,
496
- )
484
+ self . layouter
485
+ . cs
486
+ . query_advice ( column, * self . layouter . regions [ * self . region_index ] + offset)
497
487
}
498
488
499
489
fn query_fixed ( & self , column : Column < Fixed > , offset : usize ) -> Result < F , Error > {
500
- self . layouter . cs . query_fixed (
501
- column,
502
- * self . layouter . regions [ * self . region_index ] + offset,
503
- )
490
+ self . layouter
491
+ . cs
492
+ . query_fixed ( column, * self . layouter . regions [ * self . region_index ] + offset)
504
493
}
505
494
506
495
fn assign_advice < ' v > (
0 commit comments