summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2020-01-12 07:08:30 +0100
committerDennis Kobert <dennis@kobert.dev>2020-01-12 07:08:30 +0100
commit3a0d646ade02a6ca006a0d8cf6c0f60a1ece8272 (patch)
tree600d86dd1b7ecef9307ddc30e13c2658aa2453cb
parentcf6c285d0960526843f849a9033ff1895fc8cab7 (diff)
Fix wrong workgroup size
-rw-r--r--src/main.rs2
-rw-r--r--src/solvers/gpu/host.rs8
-rw-r--r--src/solvers/gpu/manager.rs18
-rw-r--r--src/solvers/gpu/output.rs1
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) {