diff options
Diffstat (limited to 'src/solvers/gpu/mod.rs')
-rw-r--r-- | src/solvers/gpu/mod.rs | 34 |
1 files changed, 27 insertions, 7 deletions
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<u64>); type RowMessage = (u64, Vec<Vec<u32>>); @@ -40,14 +41,33 @@ impl ResultMessage { } fn valid_walls(&self) -> Vec<Vec<u32>> { 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 } |