diff options
Diffstat (limited to 'src/solvers')
-rwxr-xr-x | src/solvers/intuitive.rs | 9 | ||||
-rw-r--r-- | src/solvers/opencl.rs | 3 |
2 files changed, 12 insertions, 0 deletions
diff --git a/src/solvers/intuitive.rs b/src/solvers/intuitive.rs index bb23a39..bf80433 100755 --- a/src/solvers/intuitive.rs +++ b/src/solvers/intuitive.rs @@ -80,11 +80,20 @@ impl NormalSolver { } fn permute(&self, up: usize, index: usize, curr_mask: u64, numbers: &[u32]) { + if curr_mask.count_ones() < index as u32 * (self.n - 1) { + return; + } let mut new_num = Vec::from(numbers); let start = numbers[index as usize] / self.chunk; if index as usize == numbers.len() - 1 { //#[cfg(feature = "gpu")] //{ + let mut info = sys_info::mem_info().unwrap(); + while info.avail < info.total / 8 { + std::thread::sleep_ms(50); + info = sys_info::mem_info().unwrap(); + println!("mem wait {:?}", info); + } let i = self.n - 2 - numbers[index] / self.chunk; self.senders[i as usize] .send(super::opencl::Job::new(new_num, curr_mask)) diff --git a/src/solvers/opencl.rs b/src/solvers/opencl.rs index 550ace9..431f467 100644 --- a/src/solvers/opencl.rs +++ b/src/solvers/opencl.rs @@ -141,6 +141,9 @@ impl GpuSolver { fn get_off(&self, queue: usize) -> u64 { let chunk = self.permutations.len() / self.n as usize; let off = self.permutations.len() - chunk - self.get_dim(queue); + if off > isize::max_value() as usize { + panic!("workgroup size to big, offset underflow") + } off as u64 } fn get_res(&self, queue: usize) -> usize { |