#![allow(unused_imports, unused_variables, dead_code, unused_mut)]
extern crate rand;
extern crate ocl;
#[macro_use] extern crate colorify;
use std::thread::{self, JoinHandle};
use std::sync::mpsc;
use std::time::Duration;
use rand::Rng;
use ocl::{Platform, Device, Context, Queue, Buffer, Program, Kernel, EventList};
use ocl::core::{self, PlatformInfo, DeviceInfo, ContextInfo, CommandQueueInfo, MemInfo, ProgramInfo, ProgramBuildInfo, KernelInfo, KernelArgInfo, KernelWorkGroupInfo, EventInfo, ProfilingInfo};
static SRC: &'static str = r#"
__kernel void add(__global float* buffer, float addend) {
buffer[get_global_id(0)] += addend;
}
"#;
fn main() {
let mut rng = rand::weak_rng();
let data_set_size = 2 << 10;
let dims = [data_set_size];
let mut threads = Vec::new();
let platforms = Platform::list();
println!("Looping through avaliable platforms ({}):", platforms.len());
for p_idx in 0..platforms.len() {
let platform = &platforms[p_idx];
printlnc!(green: "Platform[{}]: {} ({})", p_idx, platform.name(), platform.vendor());
let devices = Device::list_all(platform);
println!("DEVICES: {:?}", devices);
for device_idx in 0..devices.len() {
let device = devices[device_idx];
printlnc!(royal_blue: "Device[{}]: {} ({})", device_idx, device.name(), device.vendor());
let context = Context::builder().platform(*platform).build().unwrap();
let program = Program::builder().src(SRC).devices(device)
.build(&context).expect("Program Build");
let queueball = vec![Queue::new(&context, device).unwrap(),
Queue::new(&context, device).unwrap(),
Queue::new(&context, device).unwrap()];
printc!(orange: " Spawning threads... ");
for i in 0..5 {
let thread_name = format!("{}:[D{}.I{}]", threads.len(), device_idx, i);
let context_th = context.clone();
let program_th = program.clone();
let dims_th = dims.clone();
let queueball_th = queueball.clone();
print!("{}, ", thread_name);
let th = thread::Builder::new().name(thread_name.clone()).spawn(move || {
let mut buffer = Buffer::<f32>::new(&queueball_th[0], None,
&dims_th, None).unwrap();
let mut vec = vec![0.0f32; buffer.len()];
let mut kernel = Kernel::new("add", &program_th, &queueball_th[0]).unwrap()
.gws(&dims_th)
.arg_buf(&buffer)
.arg_scl(1000.0f32);
let mut event_list = EventList::new();
kernel.cmd().enew(&mut event_list).enq().unwrap();
kernel.set_default_queue(&queueball_th[1]).unwrap().enq().unwrap();
kernel.cmd().queue(&queueball_th[2]).enq().unwrap();
thread::sleep(Duration::from_millis(100));
event_list.wait().unwrap();
buffer.set_default_queue(&queueball_th[2]).read(&mut vec).enq().unwrap();
buffer.read(&mut vec).queue(&queueball_th[1]).enq().unwrap();
buffer.read(&mut vec).queue(&queueball_th[0]).enq().unwrap();
buffer.read(&mut vec).enq().unwrap();
let check_idx = data_set_size / 2;
print!("{{{}}}={}, ", &thread_name, vec[check_idx]);
}).expect("Error creating thread");
threads.push(th);
}
print!("\n");
}
}
print!("\nResults: ");
for th in threads.into_iter() {
if let Err(e) = th.join() { println!("Error joining thread: '{:?}'", e); }
}
print!("\n");
}