From 3a0d646ade02a6ca006a0d8cf6c0f60a1ece8272 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Sun, 12 Jan 2020 07:08:30 +0100 Subject: Fix wrong workgroup size --- src/main.rs | 2 +- src/solvers/gpu/host.rs | 8 +------- src/solvers/gpu/manager.rs | 18 ++++++++++++++---- 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, ) -> ocl::Result<(Sender, 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, 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) -> Self { rows.push(0); + rows.sort(); Self { rows } } fn output(&self) { -- cgit v1.2.3-54-g00ecf