diff options
author | Dennis Kobert <dennis@kobert.dev> | 2020-01-12 05:18:56 +0100 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2020-01-12 05:18:56 +0100 |
commit | 29bffc6f6c794fee886904ad3960c4cb770deb11 (patch) | |
tree | 5c896350538842863d3834b11ed25c44773d8699 /src/solvers/gpu/manager.rs | |
parent | 1650906f010574e8810c8b0b98334e22fac5894d (diff) |
Fix Bugs
Diffstat (limited to 'src/solvers/gpu/manager.rs')
-rw-r--r-- | src/solvers/gpu/manager.rs | 48 |
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 |