From 29bffc6f6c794fee886904ad3960c4cb770deb11 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Sun, 12 Jan 2020 05:18:56 +0100 Subject: Fix Bugs --- src/solvers/gpu/manager.rs | 48 +++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 22 deletions(-) (limited to 'src/solvers/gpu/manager.rs') 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, + row_buff: Vec>, 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])> { 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, output_sender: Sender, - reciever: Receiver, + receiver: Receiver, buffers: Vec, - output_handle: JoinHandle, - host_handle: JoinHandle, + output_handle: JoinHandle<()>, + host_handle: JoinHandle<()>, } impl OclManager { pub fn launch_sevice( - permutations: &[&[u32]], + permutations: &[Vec], permutations_mask: &[u64], n: u32, // Workgroup size, set to 0 for max wg_size: u32, - ) -> (Sender, JoinHandle) { + ) -> (Sender, 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 -- cgit v1.2.3-70-g09d2