1use rust_gpu_tools::{cuda, opencl, program_closures, Device, GPUError, Program};
2
3fn cuda(device: &Device) -> Program {
5 let cuda_kernel = include_bytes!("./add.fatbin");
8 let cuda_device = device.cuda_device().unwrap();
9 let cuda_program = cuda::Program::from_bytes(cuda_device, cuda_kernel).unwrap();
10 Program::Cuda(cuda_program)
11}
12
13fn opencl(device: &Device) -> Program {
15 let opencl_kernel = include_str!("./add.cl");
16 let opencl_device = device.opencl_device().unwrap();
17 let opencl_program = opencl::Program::from_opencl(opencl_device, opencl_kernel).unwrap();
18 Program::Opencl(opencl_program)
19}
20
21pub fn main() {
22 let aa: Vec<u32> = vec![1, 2, 3, 4];
24 let bb: Vec<u32> = vec![5, 6, 7, 8];
25
26 let closures = program_closures!(|program, _args| -> Result<Vec<u32>, GPUError> {
29 assert_eq!(aa.len(), bb.len());
31 let length = aa.len();
32
33 let aa_buffer = program.create_buffer_from_slice(&aa)?;
35 let bb_buffer = program.create_buffer_from_slice(&bb)?;
36
37 let result_buffer = unsafe { program.create_buffer::<u32>(length)? };
39
40 let kernel = program.create_kernel("add", 1, 1)?;
42
43 kernel
45 .arg(&(length as u32))
46 .arg(&aa_buffer)
47 .arg(&bb_buffer)
48 .arg(&result_buffer)
49 .run()?;
50
51 let mut result = vec![0u32; length];
53 program.read_into_buffer(&result_buffer, &mut result)?;
54
55 Ok(result)
56 });
57
58 let device = *Device::all().first().unwrap();
60
61 let cuda_program = cuda(device);
63 let cuda_result = cuda_program.run(closures, ()).unwrap();
64 assert_eq!(cuda_result, [6, 8, 10, 12]);
65 println!("CUDA result: {:?}", cuda_result);
66
67 let opencl_program = opencl(device);
69 let opencl_result = opencl_program.run(closures, ()).unwrap();
70 assert_eq!(opencl_result, [6, 8, 10, 12]);
71 println!("OpenCL result: {:?}", opencl_result);
72}