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 +++++++++++++++++++++++++++------- src/solvers/gpu/output.rs | 4 ++++ src/solvers/gpusolver.rs | 2 +- 3 files changed, 32 insertions(+), 8 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); 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 } 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> { 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"))); diff --git a/src/solvers/gpusolver.rs b/src/solvers/gpusolver.rs index dc54bda..380eb6a 100644 --- a/src/solvers/gpusolver.rs +++ b/src/solvers/gpusolver.rs @@ -45,7 +45,7 @@ impl GpuSolver { let mut new_num = Vec::from(numbers); if index as usize == numbers.len() { let mut info = sys_info::mem_info().unwrap(); - while info.avail < info.total / 8 { + while info.avail < info.total / 2 { std::thread::sleep(std::time::Duration::from_millis(5)); info = sys_info::mem_info().unwrap(); println!("mem wait {:?}", info); -- cgit v1.2.3-54-g00ecf