summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2020-01-12 12:40:13 +0100
committerDennis Kobert <dennis@kobert.dev>2020-01-12 12:40:13 +0100
commit0f9b907deef5129141c0be52db12f6c0e8c054a4 (patch)
treece5aff724d1a1a471cf8d7102d1da75517c6cf6c
parent809c4a251a3935b674571b605f2be475babe5cbb (diff)
ParallelIterator for results
-rw-r--r--src/solvers/gpu/mod.rs34
-rw-r--r--src/solvers/gpu/output.rs4
-rw-r--r--src/solvers/gpusolver.rs2
3 files changed, 32 insertions, 8 deletions
diff --git a/src/solvers/gpu/mod.rs b/src/solvers/gpu/mod.rs
index 379416a..17bc964 100644
--- a/src/solvers/gpu/mod.rs
+++ b/src/solvers/gpu/mod.rs
@@ -3,6 +3,7 @@ pub mod manager;
pub mod output;
pub use manager::*;
+use rayon::prelude::*;
type MaskMessage = (u64, u32, Vec<u64>);
type RowMessage = (u64, Vec<Vec<u32>>);
@@ -40,14 +41,33 @@ impl ResultMessage {
}
fn valid_walls(&self) -> Vec<Vec<u32>> {
let mut result = vec![Vec::new(); self.wg_size];
- for (j, r) in self.data.iter().enumerate() {
- for b in 0..64 {
- if r & (1 << b) != 0 {
- let permutation = j / self.size + self.offset;
- let instruction = (j % self.size) * 64 + b;
- result[instruction].push(permutation as u32);
+ let tup: Vec<(usize, u32)> = self
+ .data
+ .par_iter()
+ .enumerate()
+ .filter_map(|(j, r)| {
+ if *r != 0 {
+ Some(
+ (0..64)
+ .filter_map(|b| {
+ if r & (1 << b) != 0 {
+ let permutation = j / self.size + self.offset;
+ let instruction = (j % self.size) * 64 + b;
+ Some((instruction, permutation as u32))
+ } else {
+ None
+ }
+ })
+ .collect(),
+ )
+ } else {
+ None
}
- }
+ })
+ .flat_map(|a: Vec<_>| a.to_vec())
+ .collect();
+ for t in tup {
+ result[t.0 as usize].push(t.1);
}
result
}
diff --git a/src/solvers/gpu/output.rs b/src/solvers/gpu/output.rs
index 6bf7bcb..9030586 100644
--- a/src/solvers/gpu/output.rs
+++ b/src/solvers/gpu/output.rs
@@ -19,6 +19,9 @@ impl InBuffer {
}
fn read(&mut self) -> Option<Vec<RowResult>> {
loop {
+ //println!("{:?}", self.receiver.recv().unwrap());
+ //continue;
+
match self
.receiver
.recv()
@@ -109,6 +112,7 @@ impl Output {
if let Some(walls) = self.input.read() {
for wall in walls {
if !self.results.contains(&wall) {
+ wall.output();
self.result_sender
.send(Message::RowResult(wall.clone()))
.or_else(|_| Err(println!("Failed to transmit result back")));
diff --git a/src/solvers/gpusolver.rs b/src/solvers/gpusolver.rs
index dc54bda..380eb6a 100644
--- a/src/solvers/gpusolver.rs
+++ b/src/solvers/gpusolver.rs
@@ -45,7 +45,7 @@ impl GpuSolver {
let mut new_num = Vec::from(numbers);
if index as usize == numbers.len() {
let mut info = sys_info::mem_info().unwrap();
- while info.avail < info.total / 8 {
+ while info.avail < info.total / 2 {
std::thread::sleep(std::time::Duration::from_millis(5));
info = sys_info::mem_info().unwrap();
println!("mem wait {:?}", info);