summaryrefslogtreecommitdiff
path: root/src/solvers/gpu/manager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/gpu/manager.rs')
-rw-r--r--src/solvers/gpu/manager.rs18
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);