diff options
author | Dennis Kobert <dennis@kobert.dev> | 2020-01-12 12:40:13 +0100 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2020-01-12 12:40:13 +0100 |
commit | 0f9b907deef5129141c0be52db12f6c0e8c054a4 (patch) | |
tree | ce5aff724d1a1a471cf8d7102d1da75517c6cf6c /src/solvers/gpu | |
parent | 809c4a251a3935b674571b605f2be475babe5cbb (diff) |
ParallelIterator for results
Diffstat (limited to 'src/solvers/gpu')
-rw-r--r-- | src/solvers/gpu/mod.rs | 34 | ||||
-rw-r--r-- | src/solvers/gpu/output.rs | 4 |
2 files changed, 31 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 } diff --git a/src/solvers/gpu/output.rs b/src/solvers/gpu/output.rs index 6bf7bcb..9030586 100644 --- a/src/solvers/gpu/output.rs +++ b/src/solvers/gpu/output.rs @@ -19,6 +19,9 @@ impl InBuffer { } fn read(&mut self) -> Option<Vec<RowResult>> { loop { + //println!("{:?}", self.receiver.recv().unwrap()); + //continue; + match self .receiver .recv() @@ -109,6 +112,7 @@ impl Output { if let Some(walls) = self.input.read() { for wall in walls { if !self.results.contains(&wall) { + wall.output(); self.result_sender .send(Message::RowResult(wall.clone())) .or_else(|_| Err(println!("Failed to transmit result back"))); |