pub struct ObjectWrapper<T: ClObject + RetainRelease + CheckValidClObject> { /* private fields */ }
Implementations§
Source§impl<T: ClObject + RetainRelease + CheckValidClObject> ObjectWrapper<T>
impl<T: ClObject + RetainRelease + CheckValidClObject> ObjectWrapper<T>
pub unsafe fn unchecked_new(object: T) -> Self
pub unsafe fn cl_object(&self) -> T
pub unsafe fn cl_object_ref(&self) -> &T
pub unsafe fn cl_object_mut_ref(&mut self) -> &mut T
pub unsafe fn new(object: T) -> Output<Self>
pub unsafe fn retain_new(object: T) -> Output<Self>
pub fn address(&self) -> String
pub fn type_name(&self) -> &'static str
Source§impl ObjectWrapper<cl_command_queue>
impl ObjectWrapper<cl_command_queue>
Sourcepub unsafe fn create(
context: &ClContext,
device: &ClDeviceID,
opt_props: Option<CommandQueueProperties>,
) -> Output<ClCommandQueue>
pub unsafe fn create( context: &ClContext, device: &ClDeviceID, opt_props: Option<CommandQueueProperties>, ) -> Output<ClCommandQueue>
Create a new ClCommandQueue in the given ClContext on the given ClDeviceID with the given CommandQueueProperties (optional).
§Safety
Calling this function with an invalid ClContext or ClDeviceID is undefined behavior.
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Sourcepub unsafe fn create_from_raw_pointers(
context: cl_context,
device: cl_device_id,
props: cl_command_queue_properties,
) -> Output<ClCommandQueue>
pub unsafe fn create_from_raw_pointers( context: cl_context, device: cl_device_id, props: cl_command_queue_properties, ) -> Output<ClCommandQueue>
Creates a ClCommandQueue from raw ClObject pointers.
§Safety
Passing an invalid ClObject is undefined behavior.
Sourcepub unsafe fn create_copy(&self) -> Output<ClCommandQueue>
pub unsafe fn create_copy(&self) -> Output<ClCommandQueue>
Creates a copy of a ClCommandQueue. The copy is, in fact, a completely differnt ClCommandQueue that has the same cl_context and cl_device_id as the original.
§Safety
Calling this function on an invalid ClCommandQueue is undefined behavior.
Sourcepub unsafe fn write_buffer<'a, T: ClNumber, H: Into<VecOrSlice<'a, T>>>(
&mut self,
mem: &mut ClMem,
host_buffer: H,
opts: Option<CommandQueueOptions>,
) -> Output<ClEvent>
pub unsafe fn write_buffer<'a, T: ClNumber, H: Into<VecOrSlice<'a, T>>>( &mut self, mem: &mut ClMem, host_buffer: H, opts: Option<CommandQueueOptions>, ) -> Output<ClEvent>
write_buffer is used to move data from the host buffer (buffer: &[T]) to the mutable OpenCL cl_mem pointer.
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Sourcepub unsafe fn read_buffer<'a, T: ClNumber, H: Into<MutVecOrSlice<'a, T>>>(
&mut self,
mem: &ClMem,
host_buffer: H,
opts: Option<CommandQueueOptions>,
) -> Output<BufferReadEvent<T>>
pub unsafe fn read_buffer<'a, T: ClNumber, H: Into<MutVecOrSlice<'a, T>>>( &mut self, mem: &ClMem, host_buffer: H, opts: Option<CommandQueueOptions>, ) -> Output<BufferReadEvent<T>>
Copies data from a ClMem
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Sourcepub unsafe fn enqueue_kernel(
&mut self,
kernel: &mut ClKernel,
work: &Work,
opts: Option<CommandQueueOptions>,
) -> Output<ClEvent>
pub unsafe fn enqueue_kernel( &mut self, kernel: &mut ClKernel, work: &Work, opts: Option<CommandQueueOptions>, ) -> Output<ClEvent>
Enqueues a ClKernel onto a the ClCommandQueue.
§Safety
Usage of invalid ClObjects is undefined behavior.
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
pub unsafe fn finish(&mut self) -> Output<()>
Source§impl ObjectWrapper<*mut _cl_context>
impl ObjectWrapper<*mut _cl_context>
Sourcepub unsafe fn create<D>(devices: &[D]) -> Output<ClContext>where
D: DevicePtr,
pub unsafe fn create<D>(devices: &[D]) -> Output<ClContext>where
D: DevicePtr,
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Source§impl ObjectWrapper<*mut _cl_event>
impl ObjectWrapper<*mut _cl_event>
pub fn time(&self, info: ProfilingInfo) -> Output<u64>
pub fn queue_time(&self) -> Output<u64>
pub fn submit_time(&self) -> Output<u64>
pub fn start_time(&self) -> Output<u64>
pub fn end_time(&self) -> Output<u64>
pub fn profiling(&self) -> Profiling
pub unsafe fn info<T: Copy>(&self, flag: EventInfo) -> Output<ClPointer<T>>
pub fn reference_count(&self) -> Output<u32>
pub unsafe fn cl_command_queue(&self) -> Output<cl_command_queue>
pub unsafe fn command_queue(&self) -> Output<ClCommandQueue>
pub unsafe fn cl_context(&self) -> Output<cl_context>
pub unsafe fn context(&self) -> Output<ClContext>
pub fn command_execution_status(&self) -> Output<CommandExecutionStatus>
Source§impl ObjectWrapper<*mut _cl_kernel>
impl ObjectWrapper<*mut _cl_kernel>
Sourcepub unsafe fn create(program: &ClProgram, name: &str) -> Output<ClKernel>
pub unsafe fn create(program: &ClProgram, name: &str) -> Output<ClKernel>
Creates a wrapped cl_kernel object.
§Safety
Calling this function with an invalid ClProgram is undefined behavior.
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Sourcepub unsafe fn set_arg<T: KernelArg>(
&mut self,
arg_index: usize,
arg: &mut T,
) -> Output<()>
pub unsafe fn set_arg<T: KernelArg>( &mut self, arg_index: usize, arg: &mut T, ) -> Output<()>
Set adds and arg to a kernel at a given index.
§Safety
Calling this function on invalid kernel or with invalid arg
is undefined behavior.
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
126
127fn run_with_session() {
128 let src = include_str!("simple_add.ocl");
129 unsafe {
130 let mut session = SessionBuilder::new().with_program_src(src).build().unwrap();
131
132 let vec_a = vec![1i64, 2, 3];
133 let vec_b = vec![0i64, -1, -2];
134
135 let mut mem_a = session.create_mem(&vec_a[..]).unwrap();
136 let mut mem_b = session.create_mem(&vec_b[..]).unwrap();
137 let mut mem_c: ClMem = session.create_mem::<i64, usize>(vec_a.len()).unwrap();
138
139 let mut simple_add = session.create_kernel("simple_add").unwrap();
140
141 simple_add.set_arg(0, &mut mem_a).unwrap();
142 simple_add.set_arg(1, &mut mem_b).unwrap();
143 simple_add.set_arg(2, &mut mem_c).unwrap();
144 let work: Work = Work::new(vec_a.len());
145
146 let mut vec_c = vec_a.clone();
147
148 let enqueue_event = session
149 .enqueue_kernel(0, &mut simple_add, &work, None)
150 .unwrap();
151 let () = enqueue_event.wait().unwrap();
152 let mut read_event = session
153 .read_buffer(0, &mut mem_c, &mut vec_c[..], None)
154 .unwrap();
155 let read_output = read_event.wait().unwrap();
156 assert_eq!(read_output, None);
157
158 // at this point vec_c *should* be the result of calling simple_add and reading from mem_c;
159 println!(" {}", string_from_slice(&vec_a[..]));
160 println!("+ {}", string_from_slice(&vec_b[..]));
161 println!("= {}", string_from_slice(&vec_c[..]));
162 }
163}
pub unsafe fn set_arg_raw( &mut self, arg_index: u32, arg_size: usize, arg_ptr: *const c_void, ) -> Output<()>
Source§impl ObjectWrapper<*mut _cl_program>
impl ObjectWrapper<*mut _cl_program>
Sourcepub unsafe fn create_with_source(
context: &ClContext,
src: &str,
) -> Output<ClProgram>
pub unsafe fn create_with_source( context: &ClContext, src: &str, ) -> Output<ClProgram>
Creates a new ClProgram on the context and device with the given OpenCL source code.
§Safety
The provided ClContext and ClDeviceID must be in valid state or else undefined behavior is expected.
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Sourcepub unsafe fn create_with_binary(
context: &ClContext,
device: &ClDeviceID,
bin: &[u8],
) -> Output<ClProgram>
pub unsafe fn create_with_binary( context: &ClContext, device: &ClDeviceID, bin: &[u8], ) -> Output<ClProgram>
Creates a new ClProgram on the context and device with the given executable binary.
§Safety
The provided ClContext and ClDeviceID must be in valid state or else undefined behavior is expected.
Sourcepub fn build<D>(&mut self, devices: &[D]) -> Output<()>where
D: DevicePtr,
pub fn build<D>(&mut self, devices: &[D]) -> Output<()>where
D: DevicePtr,
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Sourcepub fn get_log<D: DevicePtr>(&self, device: &D) -> Output<String>
pub fn get_log<D: DevicePtr>(&self, device: &D) -> Output<String>
Examples found in repository?
12fn run_procedural() {
13 unsafe {
14 let src = include_str!("simple_add.ocl");
15
16 let mut platforms = list_platforms().unwrap();
17
18 if platforms.len() == 0 {
19 panic!("No platforms found!!!");
20 }
21
22 let platform = platforms.remove(0);
23 let devices = list_devices_by_type(&platform, DeviceType::ALL).unwrap();
24
25 if devices.len() == 0 {
26 panic!("No devices found!!!");
27 }
28 let context = ClContext::create(&devices[..]).unwrap();
29
30 println!("creating program...");
31 let mut program: ClProgram = ClProgram::create_with_source(&context, src).unwrap();
32
33 let names = devices.iter().map(|d| d.name().unwrap());
34 println!("building program on devices {:?}...", names);
35
36 let () = program
37 .build(&devices[..])
38 .unwrap_or_else(|e| panic!("Failed to build program {:?}", e));
39
40 for device in devices[0..1].iter() {
41 let program2 = (&program).clone();
42 let r_count = program2.reference_count().unwrap();
43 let prog_log = program2.get_log(device).unwrap();
44 let prog_src = program2.source().unwrap();
45 println!("Program log {:?} {:?}, {:?}", r_count, prog_log, prog_src);
46 println!("Device {:?}", device);
47
48 let mut command_queue: ClCommandQueue =
49 ClCommandQueue::create(&context, device, None).unwrap();
50
51 let vec_a = vec![1i64, 2, 3];
52 let vec_b = vec![0i64, -1, -2];
53
54 let len = vec_a.len();
55
56 let work: Work = Work::new(len);
57 let name = device.name().unwrap();
58 println!("{}", name);
59
60 let mut mem_a = ClMem::create::<i64, usize>(
61 &context,
62 len,
63 HostAccess::WriteOnly,
64 KernelAccess::ReadOnly,
65 MemLocation::AllocOnDevice,
66 )
67 .unwrap();
68 let mut mem_b = ClMem::create::<i64, usize>(
69 &context,
70 len,
71 HostAccess::WriteOnly,
72 KernelAccess::ReadOnly,
73 MemLocation::AllocOnDevice,
74 )
75 .unwrap();
76 let mut mem_c = ClMem::create::<i64, usize>(
77 &context,
78 len,
79 HostAccess::ReadOnly,
80 KernelAccess::WriteOnly,
81 MemLocation::AllocOnDevice,
82 )
83 .unwrap();
84 println!("Creating kernel simple_add");
85 let mut simple_add = ClKernel::create(&program2, "simple_add").unwrap();
86
87 println!("writing buffer a...");
88 let _write_event_a = command_queue
89 .write_buffer(&mut mem_a, &vec_a[..], None)
90 .unwrap();
91
92 println!("writing buffer b...");
93 let _write_event_b = command_queue
94 .write_buffer(&mut mem_b, &vec_b[..], None)
95 .unwrap();
96
97 println!("mem_a {:?}", mem_a);
98
99 println!("setting simple_add arg 0 as mem_a");
100 simple_add.set_arg(0, &mut mem_a).unwrap();
101
102 println!("setting simple_add arg 1 as mem_b");
103 simple_add.set_arg(1, &mut mem_b).unwrap();
104
105 println!("setting simple_add mut arg 2 as mem_c");
106 simple_add.set_arg(2, &mut mem_c).unwrap();
107
108 println!("calling enqueue_kernel on simple_add");
109 let event = command_queue
110 .enqueue_kernel(&mut simple_add, &work, None)
111 .unwrap();
112 let () = event.wait().unwrap();
113 println!("done putting event into WaitList...");
114 let mut vec_c = vec![0i64; len];
115
116 let _read_event = command_queue
117 .read_buffer(&mem_c, &mut vec_c[..], None)
118 .unwrap();
119
120 println!(" {}", string_from_slice(&vec_a[..]));
121 println!("+ {}", string_from_slice(&vec_b[..]));
122 println!("= {}", string_from_slice(&vec_c[..]));
123 }
124 }
125}
Trait Implementations§
Source§impl<T: RetainRelease> Clone for ObjectWrapper<T>
impl<T: RetainRelease> Clone for ObjectWrapper<T>
Source§fn clone(&self) -> ObjectWrapper<T>
fn clone(&self) -> ObjectWrapper<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more