summaryrefslogtreecommitdiff
path: root/src/solvers/gpu/manager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/gpu/manager.rs')
-rw-r--r--src/solvers/gpu/manager.rs48
1 files changed, 26 insertions, 22 deletions
diff --git a/src/solvers/gpu/manager.rs b/src/solvers/gpu/manager.rs
index 1dd6a4d..b3d88b8 100644
--- a/src/solvers/gpu/manager.rs
+++ b/src/solvers/gpu/manager.rs
@@ -1,10 +1,11 @@
-use std::sync::mpsc::{Receiver, Sender, channel};
+use super::{CheckRequest, Message};
+use std::sync::mpsc::{channel, Receiver, Sender};
use std::thread::JoinHandle;
-use super::*;
#[derive(Debug)]
struct RequestBuffer {
mask_buff: Vec<u64>,
+ row_buff: Vec<Vec<u32>>,
pointer: usize,
}
@@ -12,15 +13,17 @@ impl RequestBuffer {
pub fn new(size: usize) -> Self {
RequestBuffer {
mask_buff: vec![0; size],
+ row_buff: vec![Vec::new(); size],
pointer: 0,
}
}
- pub fn read(&mut self, request: CheckRequest) -> Option<&[u64]> {
+ pub fn read(&mut self, request: CheckRequest) -> Option<(&[u64], &[Vec<u32>])> {
self.mask_buff[self.pointer] = request.bitmask;
+ self.row_buff[self.pointer] = request.rows;
self.pointer += 1;
if self.pointer == self.mask_buff.len() {
self.pointer = 0;
- return Some(self.mask_buff.as_ref());
+ return Some((self.mask_buff.as_ref(), self.row_buff.as_ref()));
}
None
}
@@ -30,28 +33,28 @@ pub struct OclManager {
job_id: u64,
host_sender: Sender<Message>,
output_sender: Sender<Message>,
- reciever: Receiver<Message>,
+ receiver: Receiver<Message>,
buffers: Vec<RequestBuffer>,
- output_handle: JoinHandle<String>,
- host_handle: JoinHandle<String>,
+ output_handle: JoinHandle<()>,
+ host_handle: JoinHandle<()>,
}
impl OclManager {
pub fn launch_sevice(
- permutations: &[&[u32]],
+ permutations: &[Vec<u32>],
permutations_mask: &[u64],
n: u32,
// Workgroup size, set to 0 for max
wg_size: u32,
- ) -> (Sender<Message>, JoinHandle<String>) {
+ ) -> (Sender<Message>, JoinHandle<()>) {
let (h, w) = crate::solvers::wall_stats(n);
let src = include_str!("check.cl");
let (output_sender, output_handle) =
- super::output::Output::launch_sevice(permutations, permutations_mask, n, h, w);
+ super::output::Output::launch_sevice(permutations, permutations_mask);
let (host_sender, host_handle) =
super::host::Host::launch_sevice(permutations_mask, n, h, w, wg_size as usize, src);
- let (receiver, sender) = channel();
+ let (sender, receiver) = channel();
let mut buffers = Vec::with_capacity((n - h + 1) as usize);
for _ in 0..=(n - h) {
@@ -59,27 +62,28 @@ impl OclManager {
}
let manager = Self {
- 0,
+ job_id: 0,
host_sender,
output_sender,
receiver,
buffers,
output_handle,
host_handle,
- }
- (sender,
- std::thread::Builder::new()
- .name("GPU Manager Deamon".into())
- .spawn(move || {
- manager.run();
- })
- .unwrap())
-
+ };
+ (
+ sender,
+ std::thread::Builder::new()
+ .name("GPU Manager Deamon".into())
+ .spawn(move || {
+ manager.run();
+ })
+ .unwrap(),
+ )
}
fn run(mut self) {
loop {
- match self.reciever.recv().expect("Channel to GPU Manager broke") {
+ match self.receiver.recv().expect("Channel to GPU Manager broke") {
Message::CheckRequest(request) => {
if let Some(buffer) = self.buffers[request.queue as usize].read(request) {
self.host_sender