From 0f9b907deef5129141c0be52db12f6c0e8c054a4 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Sun, 12 Jan 2020 12:40:13 +0100 Subject: ParallelIterator for results --- src/solvers/gpu/mod.rs | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'src/solvers/gpu/mod.rs') diff --git a/src/solvers/gpu/mod.rs b/src/solvers/gpu/mod.rs index 379416a..17bc964 100644 --- a/src/solvers/gpu/mod.rs +++ b/src/solvers/gpu/mod.rs @@ -3,6 +3,7 @@ pub mod manager; pub mod output; pub use manager::*; +use rayon::prelude::*; type MaskMessage = (u64, u32, Vec); type RowMessage = (u64, Vec>); @@ -40,14 +41,33 @@ impl ResultMessage { } fn valid_walls(&self) -> Vec> { let mut result = vec![Vec::new(); self.wg_size]; - for (j, r) in self.data.iter().enumerate() { - for b in 0..64 { - if r & (1 << b) != 0 { - let permutation = j / self.size + self.offset; - let instruction = (j % self.size) * 64 + b; - result[instruction].push(permutation as u32); + let tup: Vec<(usize, u32)> = self + .data + .par_iter() + .enumerate() + .filter_map(|(j, r)| { + if *r != 0 { + Some( + (0..64) + .filter_map(|b| { + if r & (1 << b) != 0 { + let permutation = j / self.size + self.offset; + let instruction = (j % self.size) * 64 + b; + Some((instruction, permutation as u32)) + } else { + None + } + }) + .collect(), + ) + } else { + None } - } + }) + .flat_map(|a: Vec<_>| a.to_vec()) + .collect(); + for t in tup { + result[t.0 as usize].push(t.1); } result } -- cgit v1.2.3-54-g00ecf