diff options
Diffstat (limited to 'src/solvers/gpusolver.rs')
-rw-r--r-- | src/solvers/gpusolver.rs | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/src/solvers/gpusolver.rs b/src/solvers/gpusolver.rs index 99274cb..62e6e0f 100644 --- a/src/solvers/gpusolver.rs +++ b/src/solvers/gpusolver.rs @@ -19,24 +19,27 @@ pub struct GpuSolver { impl GpuSolver { fn solve_to_vec(&mut self) -> Vec<RowResult> { let (sender, receiver) = std::sync::mpsc::channel(); - let (sender, handle) = - OclManager::launch_sevice(&self.permutations, &self.masks, self.n, 0, sender); - let chunk = permutohedron::factorial(self.n as usize - 1) as u32; - self.permute( - 0, - 0, - ((0..(self.h - 2)).map(|x| x * chunk).collect::<Vec<u32>>()).as_ref(), - sender.clone(), - ); - sender.send(Message::CpuDone).unwrap(); - let mut walls = Vec::new(); - while let Ok(Message::RowResult(wall)) = receiver.recv() { - walls.push(wall); + if let Ok((sender, handle)) = + OclManager::launch_sevice(&self.permutations, &self.masks, self.n, 0, sender) + { + let chunk = permutohedron::factorial(self.n as usize - 1) as u32; + self.permute( + 0, + 0, + ((0..(self.h - 2)).map(|x| x * chunk).collect::<Vec<u32>>()).as_ref(), + sender.clone(), + ); + sender.send(Message::CpuDone).unwrap(); + let mut walls = Vec::new(); + while let Ok(Message::RowResult(wall)) = receiver.recv() { + walls.push(wall); + } + sender.send(Message::Terminate).unwrap(); + //println!("{:?}", walls); + handle.join().unwrap(); + return walls; } - sender.send(Message::Terminate).unwrap(); - //println!("{:?}", walls); - handle.join().unwrap(); - walls + vec![] } fn permute(&self, index: usize, curr_mask: u64, numbers: &[u32], sender: Sender<Message>) { |