const ADDEND: f32 = 10.0;
const DATASET_SIZE: usize = 2 << 20;
use std::ffi::CString;
#[test]
fn buffer_copy_core() {
let src = r#"
__kernel void add(__global float* buffer, float addend) {
buffer[get_global_id(0)] += addend;
}
"#;
let platform_id = crate::default_platform().unwrap();
let device_ids = crate::get_device_ids(&platform_id, None, None).unwrap();
let device = device_ids[0];
let context_properties = crate::ContextProperties::new().platform(platform_id);
let context = crate::create_context(Some(&context_properties),
&[device], None, None).unwrap();
let src_cstring = CString::new(src).unwrap();
let program = crate::create_program_with_source(&context, &[src_cstring]).unwrap();
crate::build_program(&program, None::<&[()]>, &CString::new("").unwrap(),
None, None).unwrap();
let queue = crate::create_command_queue(&context, &device, Some(crate::QUEUE_PROFILING_ENABLE))
.unwrap();
let dims = [DATASET_SIZE, 1, 1usize];
let mut src_buffer_vec = vec![0.0f32; dims[0]];
let src_buffer = unsafe { crate::create_buffer(&context, crate::MEM_READ_WRITE |
crate::MEM_COPY_HOST_PTR, dims[0], Some(&src_buffer_vec)).unwrap() };
let mut dst_buffer_vec = vec![0.0f32; dims[0]];
let dst_buffer = unsafe { crate::create_buffer(&context, crate::MEM_READ_WRITE |
crate::MEM_COPY_HOST_PTR, dims[0], Some(&dst_buffer_vec)).unwrap() };
let kernel = crate::create_kernel(&program, "add").unwrap();
crate::set_kernel_arg(&kernel, 0, crate::ArgVal::mem(&src_buffer)).unwrap();
crate::set_kernel_arg(&kernel, 1, crate::ArgVal::scalar(&ADDEND)).unwrap();
unsafe {
crate::enqueue_kernel(&queue, &kernel, 1, None, &dims,
None, None::<crate::Event>, None::<&mut crate::Event>).unwrap();
}
let copy_range = (153, 150000);
crate::enqueue_copy_buffer::<f32, _, _, _>(&queue, &src_buffer, &dst_buffer,
copy_range.0, copy_range.0, copy_range.1 - copy_range.0, None::<crate::Event>,
None::<&mut crate::Event>).unwrap();
unsafe { crate::enqueue_read_buffer(&queue, &src_buffer, true, 0, &mut src_buffer_vec,
None::<crate::Event>, None::<&mut crate::Event>).unwrap() };
unsafe { crate::enqueue_read_buffer(&queue, &dst_buffer, true, 0, &mut dst_buffer_vec,
None::<crate::Event>, None::<&mut crate::Event>).unwrap() };
for i in 0..dims[0] {
assert_eq!(src_buffer_vec[i], ADDEND);
if i >= copy_range.0 && i < copy_range.1 {
assert_eq!(dst_buffer_vec[i], ADDEND);
} else {
assert!(dst_buffer_vec[i] == 0.0, "dst_vec: {}, idx: {}", dst_buffer_vec[i], i);
}
}
}