diff options
Diffstat (limited to 'src/solvers/gpu/manager.rs')
-rw-r--r-- | src/solvers/gpu/manager.rs | 18 |
1 files changed, 14 insertions, 4 deletions
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); |