Skip to main content

basic/
basic.rs

1extern crate dynamic_ocl;
2
3use dynamic_ocl::buffer::flags::{DeviceReadOnly, DeviceWriteOnly, HostNoAccess, HostReadOnly};
4use dynamic_ocl::device::DeviceType;
5use dynamic_ocl::load_opencl;
6use dynamic_ocl::platform::Platform;
7use dynamic_ocl::program::ProgramBuilder;
8use dynamic_ocl::queue::QueueBuilder;
9use std::ffi::CString;
10
11const KERNEL: &str = r#"
12__kernel void sum(__constant int *a, __constant int *b, __global int *c) {
13    size_t id = get_global_id(0);
14    c[id] = a[id] + b[id];
15}
16"#;
17
18pub fn main() {
19    let version = load_opencl().unwrap();
20    println!("Successfully loaded OpenCL (compat level {:?})", version);
21
22    for platform in Platform::get_platforms().unwrap() {
23        println!("Got platform {:#?}", platform);
24
25        for device in platform.get_devices(DeviceType::ALL).unwrap() {
26            println!("Got device: {:#?}", device);
27
28            let ctx = device.create_context().unwrap();
29
30            println!("Created context: {:#?}", ctx);
31
32            let mut queue = QueueBuilder::new(&ctx, &device).build().unwrap();
33
34            println!("Created command queue: {:#?}", queue);
35
36            let program = ProgramBuilder::with_source(&ctx, &KERNEL).build().unwrap();
37
38            println!(
39                "Compiled program: {:?} {:?}",
40                program,
41                program.kernel_names()
42            );
43
44            let build_info = program.build_info(device).unwrap();
45            println!("Build info: {:#?}", build_info);
46
47            let a = ctx
48                .buffer_builder()
49                .host_access::<HostNoAccess>()
50                .device_access::<DeviceReadOnly>()
51                .build_copying_slice(&[1, 2, 3])
52                .unwrap();
53
54            let b = ctx
55                .buffer_builder()
56                .host_access::<HostNoAccess>()
57                .device_access::<DeviceReadOnly>()
58                .build_copying_slice(&[1, 2, 3])
59                .unwrap();
60
61            let c = ctx
62                .buffer_builder()
63                .host_access::<HostReadOnly>()
64                .device_access::<DeviceWriteOnly>()
65                .build_with_size::<i32>(3)
66                .unwrap();
67
68            let args = (a, b, c);
69
70            println!("Created arguments: {:#?}", args);
71
72            let mut kernel = program
73                .create_kernel(&CString::new("sum").unwrap())
74                .unwrap()
75                .bind_arguments(args)
76                .unwrap();
77
78            println!("Created and bound kernel: {:#?}", kernel);
79
80            queue.kernel_cmd(&mut kernel).exec_ndrange(3).unwrap();
81
82            let mut data = [0i32; 3];
83            queue
84                .buffer_cmd(&mut kernel.arguments().2)
85                .read(&mut data)
86                .unwrap();
87
88            println!("Kernel output: {:?}", data);
89
90            assert_eq!(data, [2, 4, 6]);
91        }
92
93        platform.unload_compiler().unwrap();
94
95        println!(
96            "Unloaded compiler for platform {}",
97            platform.name().unwrap().to_string_lossy()
98        );
99    }
100}