@@ -20,6 +20,7 @@ use time;
20
20
21
21
use docopt:: Docopt ;
22
22
use rayon:: prelude:: * ;
23
+ use rayon:: iter:: AsParallel ;
23
24
24
25
#[ cfg( test) ]
25
26
mod bench;
@@ -93,6 +94,15 @@ impl Board {
93
94
self . next_board ( new_brd)
94
95
}
95
96
97
+ pub fn as_parallel_next_generation ( & self ) -> Board {
98
+ let new_brd = ( 0 ..self . len ( ) )
99
+ . as_parallel ( )
100
+ . map ( |cell| self . successor_cell ( cell) )
101
+ . collect ( ) ;
102
+
103
+ self . next_board ( new_brd)
104
+ }
105
+
96
106
fn cell_live ( & self , x : usize , y : usize ) -> bool {
97
107
!( x >= self . cols || y >= self . rows ) && self . board [ y * self . cols + x]
98
108
}
@@ -145,6 +155,11 @@ fn parallel_generations(board: Board, gens: usize) {
145
155
for _ in 0 ..gens { brd = brd. parallel_next_generation ( ) ; }
146
156
}
147
157
158
+ fn as_parallel_generations ( board : Board , gens : usize ) {
159
+ let mut brd = board;
160
+ for _ in 0 ..gens { brd = brd. as_parallel_next_generation ( ) ; }
161
+ }
162
+
148
163
fn measure ( f : fn ( Board , usize ) -> ( ) , args : & Args ) -> u64 {
149
164
let ( n, gens) = ( args. flag_size , args. flag_gens ) ;
150
165
let brd = Board :: new ( n, n) . random ( ) ;
@@ -168,5 +183,9 @@ pub fn main(args: &[String]) {
168
183
let parallel = measure ( parallel_generations, & args) ;
169
184
println ! ( "parallel: {:10} ns -> {:.2}x speedup" , parallel,
170
185
serial as f64 / parallel as f64 ) ;
186
+
187
+ let as_parallel = measure ( as_parallel_generations, & args) ;
188
+ println ! ( "as_parallel: {:10} ns -> {:.2}x speedup" , as_parallel,
189
+ serial as f64 / as_parallel as f64 ) ;
171
190
}
172
191
}
0 commit comments