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