summaryrefslogtreecommitdiff
path: root/src/solvers/gpu/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/gpu/mod.rs')
-rw-r--r--src/solvers/gpu/mod.rs34
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
}