From c583ee4faa552962594f7d5bf9b57bf62b6db5c0 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Sun, 5 Jan 2020 22:31:38 +0100 Subject: Expand GPU impemetation --- src/solvers/intuitive.rs | 4 +- src/solvers/mod.rs | 25 +----------- src/solvers/opencl.rs | 98 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 68 insertions(+), 59 deletions(-) (limited to 'src/solvers') diff --git a/src/solvers/intuitive.rs b/src/solvers/intuitive.rs index 3caac73..a5ff935 100755 --- a/src/solvers/intuitive.rs +++ b/src/solvers/intuitive.rs @@ -52,8 +52,8 @@ impl NormalSolver { pub fn solve(&mut self) { for (n, i) in self.permutations.iter().enumerate() { let tmp: Vec = i.iter().map(|x| *x).collect(); - //println!("perm {}: {:?}", n, tmp); - println!("perm {}: {:?}", n, self.masks[n]); + println!("perm {}: {:?}", n, tmp); + println!("perm {}: {:b}", n, self.masks[n]); } println!("calculate results"); self.permute( diff --git a/src/solvers/mod.rs b/src/solvers/mod.rs index 0615eab..6eb2ec4 100755 --- a/src/solvers/mod.rs +++ b/src/solvers/mod.rs @@ -1,27 +1,4 @@ //pub mod incremental_block; pub mod intuitive; -#[cfg(feature = "gpu")] +//#[cfg(feature = "gpu")] pub mod opencl; - -lazy_static! { - pub static ref PERMUTATIONS: (Vec>, Vec) = { - let n = crate::N; - let mut heap = (1..=n).collect::>(); - let heap = permutohedron::Heap::new(&mut heap); - let n_f = permutohedron::factorial(n as usize); - let mut permutations = Vec::with_capacity(n_f); - - let mut masks: Vec = vec![0; n_f]; - println!("Generating permutations"); - for (j, data) in heap.enumerate() { - let mut sum = 0; - permutations.push(data.clone()); - for stone in data.iter().take(n as usize - 1) { - sum += stone; - masks[j] |= 1 << sum; - } - } - (permutations, masks) - }; -} - diff --git a/src/solvers/opencl.rs b/src/solvers/opencl.rs index 25b8119..ae5bfa3 100644 --- a/src/solvers/opencl.rs +++ b/src/solvers/opencl.rs @@ -1,49 +1,81 @@ -use lazy_static::*; -use ocl::ProQue; #[macro_use] +use ocl::{Buffer, Context, Device, Platform, Program, Queue}; +use std::sync::mpsc::{Receiver, Sender}; -lazy_static! { - static ref BUFFER: ocl::Buffer = { +pub struct Job { + rows: Vec, + bitmask: u64, +} + +pub struct GpuSolver { + platform: Platform, + device: Device, + context: Context, + queue: Queue, + n: u32, + h: u32, + w: u32, + permutations: Buffer, + rec_queues: Vec>, +} + +impl GpuSolver { + pub fn new(permutation_masks: &[u64], n: u32, h: u32, w: u32) -> ocl::Result>> { let platform = ocl::Platform::default(); - let device = ocl::Device::first(platform).unwrap(); + let device = ocl::Device::first(platform)?; let context = ocl::Context::builder() .platform(platform) .devices(device.clone()) - .build() - .unwrap(); - let queue = ocl::Queue::new(&context, device, None).unwrap(); + .build()?; + let queue = ocl::Queue::new(&context, device, None)?; - println!("created buffer!"); - ocl::Buffer::builder() - .queue(queue) - .copy_host_slice(crate::solvers::PERMUTATIONS.1.as_ref()) - .len(crate::solvers::PERMUTATIONS.1.len()) - .build() - .unwrap() - }; - static ref QUEUE: ocl::ProQue = { - let src = - std::fs::read_to_string("src/solvers/check.cl").expect("failed to open kernel file"); - ProQue::builder() - .src(src) - .dims(crate::solvers::PERMUTATIONS.0.len()) - .build() - .unwrap() - }; -} + let buffer = ocl::Buffer::builder() + .queue(queue.clone()) + .copy_host_slice(permutation_masks) + .len(permutation_masks.len()) + .build()?; -pub fn get_buffer() -> &'static ocl::Buffer { - &BUFFER -} + let mut senders = Vec::with_capacity(h as usize); + let mut receivers = Vec::with_capacity(h as usize); + for _ in 0..h { + let (sx, rx) = std::sync::mpsc::channel(); + senders.push(sx); + receivers.push(rx); + } + let solver = Self { + platform, + device, + context, + queue, + n, + h, + w, + permutations: buffer, + rec_queues: receivers, + }; + std::thread::spawn(move || { + solver.run(); + }); + Ok(senders) + } + + fn run(self) -> ! { + for rec in self.rec_queues.iter().cycle() { + //if rec. + } + loop {} + } +} +/* pub fn check(permutations: &[u64], w: u32, n: u32, mask: u64, offset: usize) -> ocl::Result<()> { //println!("read src!"); let src = std::fs::read_to_string("src/solvers/check.cl").expect("failed to open kernel file"); //println!("created queue!"); - //println!("offset: {}", offset); - //println!("length: {}", permutations.len() - offset); - let pro_que = ProQue::builder() + println!("offset: {}", offset); + println!("length: {}", permutations.len() - offset); + let pro_que = ocl::ProQue::builder() .src(src) .dims(permutations.len() - offset) .build()?; @@ -72,4 +104,4 @@ pub fn check(permutations: &[u64], w: u32, n: u32, mask: u64, offset: usize) -> println!("The resuts are now '{:?}'!", vec); } Ok(()) -} +}*/ -- cgit v1.2.3-54-g00ecf