summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2020-01-11 21:29:11 +0100
committerDennis Kobert <dennis@kobert.dev>2020-01-11 21:29:11 +0100
commitc963136144598e242f325b64fcf194c978321904 (patch)
tree2eaccd4a8e22f49d522d98af072217042d50c9b8 /src
parentc36035c0667fdd224da914b50c30a9366e1a5c38 (diff)
Do some early cpu pruning
Diffstat (limited to 'src')
-rwxr-xr-xsrc/solvers/intuitive.rs9
-rw-r--r--src/solvers/opencl.rs3
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 {