diff options
author | Dennis Kobert <dennis@kobert.dev> | 2020-01-12 07:08:30 +0100 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2020-01-12 07:08:30 +0100 |
commit | 3a0d646ade02a6ca006a0d8cf6c0f60a1ece8272 (patch) | |
tree | 600d86dd1b7ecef9307ddc30e13c2658aa2453cb | |
parent | cf6c285d0960526843f849a9033ff1895fc8cab7 (diff) |
Fix wrong workgroup size
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/solvers/gpu/host.rs | 8 | ||||
-rw-r--r-- | src/solvers/gpu/manager.rs | 18 | ||||
-rw-r--r-- | src/solvers/gpu/output.rs | 1 |
4 files changed, 17 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs index f18f2f8..c2643c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod solvers; mod structs; use crate::solvers::{IteratorSolver, Solver}; -pub static N: u32 = 4; +pub static N: u32 = 8; fn main() { let mut solver = solvers::single::NormalSolver::new(N); solver.solve(); diff --git a/src/solvers/gpu/host.rs b/src/solvers/gpu/host.rs index 39843c4..e354263 100644 --- a/src/solvers/gpu/host.rs +++ b/src/solvers/gpu/host.rs @@ -28,7 +28,7 @@ impl Host { n: u32, h: u32, w: u32, - mut wg_size: usize, + wg_size: usize, src: &str, output_sender: Sender<Message>, ) -> ocl::Result<(Sender<Message>, std::thread::JoinHandle<()>)> { @@ -52,12 +52,6 @@ impl Host { .build()?; let (sender, receiver) = channel(); - let max_wg_size = device.max_wg_size()?; - if wg_size == 0 { - wg_size = max_wg_size; - } else if wg_size > max_wg_size { - return Err(ocl::Error::from("invalid workgroup size")); - } let solver = Self { platform, diff --git a/src/solvers/gpu/manager.rs b/src/solvers/gpu/manager.rs index e210af2..a2253aa 100644 --- a/src/solvers/gpu/manager.rs +++ b/src/solvers/gpu/manager.rs @@ -45,10 +45,20 @@ impl OclManager { permutations_mask: &[u64], n: u32, // Workgroup size, set to 0 for max - wg_size: u32, + mut wg_size: usize, ) -> (Sender<Message>, JoinHandle<()>) { let (h, w) = crate::solvers::wall_stats(n); let src = include_str!("check.cl"); + + let platform = ocl::Platform::default(); + let device = ocl::Device::first(platform).expect("failed to create opencl device"); + let max_wg_size = device.max_wg_size().expect("failed to query max_wg_size"); + if wg_size == 0 { + wg_size = max_wg_size; + } else if wg_size > max_wg_size { + println!("invalid workgroup size"); + } + let (output_sender, output_handle) = super::output::Output::launch_sevice(permutations, permutations_mask); let (host_sender, host_handle) = super::host::Host::launch_sevice( @@ -56,7 +66,7 @@ impl OclManager { n, h, w, - wg_size as usize, + wg_size, src, output_sender.clone(), ) @@ -64,6 +74,7 @@ impl OclManager { let (sender, receiver) = channel(); + println!("wg {}", wg_size); let mut buffers = Vec::with_capacity((n - h + 1) as usize); for _ in 0..=(n - h) { buffers.push(RequestBuffer::new(wg_size as usize)); @@ -94,7 +105,6 @@ impl OclManager { match self.receiver.recv().expect("Channel to GPU Manager broke") { Message::CheckRequest(request) => { let queue = request.queue; - println!("{}", queue); if let Some(buffer) = self.buffers[queue as usize].read(request) { self.host_sender .send(Message::HostMessage((self.job_id, queue, buffer.0.into()))) @@ -106,7 +116,7 @@ impl OclManager { } } Message::Terminate => { - panic!("flush buffers"); + //TODO panic!("flush buffers"); self.host_sender.send(Message::Terminate); self.host_handle.join(); self.output_sender.send(Message::Terminate); diff --git a/src/solvers/gpu/output.rs b/src/solvers/gpu/output.rs index b35d072..43e0d98 100644 --- a/src/solvers/gpu/output.rs +++ b/src/solvers/gpu/output.rs @@ -74,6 +74,7 @@ pub struct RowResult { impl RowResult { fn new(mut rows: Vec<u32>) -> Self { rows.push(0); + rows.sort(); Self { rows } } fn output(&self) { |