extern crate dynamic_ocl; use dynamic_ocl::buffer::flags::{DeviceReadOnly, DeviceWriteOnly, HostNoAccess, HostReadOnly}; use dynamic_ocl::device::DeviceType; use dynamic_ocl::load_opencl; use dynamic_ocl::platform::Platform; use dynamic_ocl::program::ProgramBuilder; use dynamic_ocl::queue::QueueBuilder; use std::ffi::CString; const KERNEL: &str = r#" __kernel void sum(__constant int *a, __constant int *b, __global int *c) { size_t id = get_global_id(0); c[id] = a[id] + b[id]; } "#; pub fn main() { let version = load_opencl().unwrap(); println!("Successfully loaded OpenCL (compat level {:?})", version); for platform in Platform::get_platforms().unwrap() { println!("Got platform {:#?}", platform); for device in platform.get_devices(DeviceType::ALL).unwrap() { println!("Got device: {:#?}", device); let ctx = device.create_context().unwrap(); println!("Created context: {:#?}", ctx); let mut queue = QueueBuilder::new(&ctx, &device).build().unwrap(); println!("Created command queue: {:#?}", queue); let program = ProgramBuilder::with_source(&ctx, &KERNEL).build().unwrap(); println!( "Compiled program: {:?} {:?}", program, program.kernel_names() ); let build_info = program.build_info(device).unwrap(); println!("Build info: {:#?}", build_info); let a = ctx .buffer_builder() .host_access::() .device_access::() .build_copying_slice(&[1, 2, 3]) .unwrap(); let b = ctx .buffer_builder() .host_access::() .device_access::() .build_copying_slice(&[1, 2, 3]) .unwrap(); let c = ctx .buffer_builder() .host_access::() .device_access::() .build_with_size::(3) .unwrap(); let args = (a, b, c); println!("Created arguments: {:#?}", args); let mut kernel = program .create_kernel(&CString::new("sum").unwrap()) .unwrap() .bind_arguments(args) .unwrap(); println!("Created and bound kernel: {:#?}", kernel); queue.kernel_cmd(&mut kernel).exec_ndrange(3).unwrap(); let mut data = [0i32; 3]; queue .buffer_cmd(&mut kernel.arguments().2) .read(&mut data) .unwrap(); println!("Kernel output: {:?}", data); assert_eq!(data, [2, 4, 6]); } platform.unload_compiler().unwrap(); println!( "Unloaded compiler for platform {}", platform.name().unwrap().to_string_lossy() ); } }