summaryrefslogtreecommitdiff
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
parentc36035c0667fdd224da914b50c30a9366e1a5c38 (diff)
Do some early cpu pruning
-rwxr-xr-xCargo.toml1
-rwxr-xr-xsrc/solvers/intuitive.rs9
-rw-r--r--src/solvers/opencl.rs3
3 files changed, 13 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
index c0527fc..0813fa4 100755
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,6 +17,7 @@ num = "0.2"
rayon = "1.3"
permutohedron = "0.2"
permutation_way = { git = "https://github.com/corentinway/permutation_way_rs" }
+sys-info = "0.5.8"
ocl = { version = "0.19", optional = false}
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 {