const IDX: usize = 200007;
const ADDEND: f32 = 10.0;
#[allow(dead_code)]
#[test]
fn main_explained() {
use standard::ProQue;
let src = r#"
__kernel void add(__global float* buffer, float addend) {
buffer[get_global_id(0)] += addend;
}
"#;
let pro_que = ProQue::builder()
.src(src)
.dims([500000])
.build().unwrap();
let mut buffer = pro_que.create_buffer::<f32>();
let orig_val = buffer[IDX];
let kernel = pro_que.create_kernel("add").expect("[FIXME]: HANDLE ME")
.arg_buf(&buffer)
.arg_scl(ADDEND);
kernel.enq().expect("[FIXME]: HANDLE ME!");
buffer.fill_vec();
println!("The value at index [{}] was '{}' and is now '{}'!",
IDX, orig_val, buffer[IDX]);
}
#[allow(dead_code)]
#[test]
fn main_exploded() {
use flags;
use standard::{Platform, Device, Context, Queue, Program, Buffer, Kernel};
let src = r#"
__kernel void add(__global float* buffer, float addend) {
buffer[get_global_id(0)] += addend;
}
"#;
let platform = Platform::default();
let device = Device::first(&platform);
let context = Context::builder()
.platform(platform)
.devices(device.clone())
.build().unwrap();
let program = Program::builder()
.devices(&[device.clone()])
.src(src)
.build(&context).unwrap();
let queue = Queue::new(&context, device).unwrap();
let dims = [500000];
let mut buffer_vec = vec![0.0f32; dims[0]];
let buffer = Buffer::new(&queue, Some(flags::MEM_READ_WRITE | flags::MEM_COPY_HOST_PTR),
dims[0], Some(&buffer_vec));
let orig_val = buffer_vec[IDX];
let kernel = Kernel::new("add", &program, &queue).unwrap()
.gws(&dims)
.arg_buf(&buffer)
.arg_scl(ADDEND);
kernel.cmd()
.queue(&queue)
.gwo(kernel.get_gwo())
.gws(&dims)
.lws(kernel.get_lws())
.ewait_opt(None)
.enew_opt(None)
.enq().unwrap();
buffer.cmd()
.queue(&queue)
.block(true)
.offset(0)
.read(&mut buffer_vec)
.ewait_opt(None)
.enew_opt(None)
.enq().unwrap();
println!("The value at index [{}] was '{}' and is now '{}'!",
IDX, orig_val, buffer_vec[IDX]);
}
#[allow(dead_code, unused_variables, unused_mut)]
#[test]
fn main_cored() {
use std::ffi::CString;
use core::{self, ContextProperties};
use flags;
use enums::KernelArg;
let src = r#"
__kernel void add(__global float* buffer, float addend) {
buffer[get_global_id(0)] += addend;
}
"#;
let platform_ids = core::get_platform_ids().unwrap();
let platform_id = platform_ids[0];
let device_ids = core::get_device_ids(&platform_id, None, None).unwrap();
let device_id = device_ids[0];
let context_properties = ContextProperties::new().platform(platform_id);
let context = core::create_context(&Some(context_properties),
&[device_id], None, None).unwrap();
let src_cstring = CString::new(src).unwrap();
let program = core::create_program_with_source(&context, &[src_cstring]).unwrap();
core::build_program(&program, &[device_id], &CString::new("").unwrap(),
None, None).unwrap();
let queue = core::create_command_queue(&context, &device_id).unwrap();
let dims = [500000, 1, 1usize];
let mut buffer_vec = vec![0.0f32; dims[0]];
let buffer = unsafe { core::create_buffer(&context, flags::MEM_READ_WRITE |
flags::MEM_COPY_HOST_PTR, dims[0], Some(&buffer_vec)).unwrap() };
let orig_val = buffer_vec[IDX];
let kernel = core::create_kernel(&program, "add").unwrap();
core::set_kernel_arg(&kernel, 0, KernelArg::Mem::<f32>(&buffer)).unwrap();
core::set_kernel_arg(&kernel, 1, KernelArg::Scalar(ADDEND)).unwrap();
core::enqueue_kernel(&queue, &kernel, 1, None, &dims,
None, None, None).unwrap();
unsafe { core::enqueue_read_buffer(&queue, &buffer, true, 0, &mut buffer_vec,
None, None).unwrap() };
println!("The value at index [{}] was '{}' and is now '{}'!",
IDX, orig_val, buffer_vec[IDX]);
}