use ffi::{cl_event, cl_int, c_void};
use standard::{ProgramBuilder, Buffer, SpatialDims, ProQue, EventList};
const PRINT_DEBUG: bool = false;
struct TestEventsStuff {
seed_env: *const Buffer<u32>,
res_env: *const Buffer<u32>,
data_set_size: usize,
addend: u32,
itr: usize,
}
extern fn _test_events_verify_result(event: cl_event, status: cl_int, user_data: *mut c_void) {
let buncha_stuff = user_data as *const TestEventsStuff;
unsafe {
let seed_buffer: *const Buffer<u32> = (*buncha_stuff).seed_env as *const Buffer<u32>;
let result_buffer: *const Buffer<u32> = (*buncha_stuff).res_env as *const Buffer<u32>;
let data_set_size: usize = (*buncha_stuff).data_set_size;
let addend: u32 = (*buncha_stuff).addend;
let itr: usize = (*buncha_stuff).itr;
let mut errors_found: u32 = 0;
for idx in 0..data_set_size {
let correct_result = (*seed_buffer)[idx] + ((itr + 1) as u32) * addend;
let actual_result = (*result_buffer)[idx];
assert_eq!(correct_result, actual_result);
if PRINT_DEBUG {
if (*result_buffer)[idx] != correct_result {
print!("correct_result:{}, result_buffer[{idx}]:{}\n",
correct_result, (*result_buffer)[idx], idx = idx);
errors_found += 1;
}
errors_found += ((*result_buffer)[idx] != correct_result) as u32;
}
}
if PRINT_DEBUG && errors_found > 0 {
println!("Event: `{:?}` has completed with status: `{}`, data_set_size: '{}`, \
addend: {}, itr: `{}`.", event, status, data_set_size, addend, itr);
println!(" TOTAL ERRORS FOUND: {}", errors_found); }
}
}
#[test]
fn events() {
let ocl_pq = ProQue::builder()
.prog_bldr(ProgramBuilder::new().src_file("cl/kernel_file.cl"))
.build().unwrap();
let data_set_size = 90000;
let dims = SpatialDims::One(data_set_size);
let seed_buffer = Buffer::with_vec_scrambled((0u32, 500u32), &dims, &ocl_pq.queue());
let mut result_buffer = Buffer::with_vec(&dims, &ocl_pq.queue());
let addend = 10u32;
let mut kernel = ocl_pq.create_kernel("add_scalar").expect("[FIXME]: HANDLE ME")
.gws(dims.clone())
.arg_buf_named("src", Some(&seed_buffer))
.arg_scl(addend)
.arg_buf(&mut result_buffer)
;
let mut kernel_event = EventList::new();
let iters = 20;
let mut buncha_stuffs = Vec::<TestEventsStuff>::with_capacity(iters);
for itr in 0..iters {
buncha_stuffs.push(TestEventsStuff {
seed_env: &seed_buffer as *const Buffer<u32>,
res_env: &result_buffer as *const Buffer<u32>,
data_set_size: data_set_size,
addend: addend,
itr: itr,
});
if itr != 0 {
kernel.set_arg_buf_named("src", Some(&result_buffer)).unwrap();
}
if PRINT_DEBUG { println!("Enqueuing kernel [itr:{}]...", itr); }
kernel.cmd().enew(&mut kernel_event).enq().unwrap();
let mut read_event = EventList::new();
if PRINT_DEBUG { println!("Enqueuing read buffer [itr:{}]...", itr); }
unsafe { result_buffer.enqueue_fill_vec(false, None, Some(&mut read_event)).unwrap(); }
let last_idx = buncha_stuffs.len() - 1;
unsafe {
if PRINT_DEBUG { println!("Setting callback (verify_result, buncha_stuff[{}]) [i:{}]...",
last_idx, itr); }
read_event.set_callback(Some(_test_events_verify_result),
&mut buncha_stuffs[last_idx]).unwrap();
}
}
ocl_pq.queue().finish();
}