opencl3/
device.rs

1// Copyright (c) 2020-2024 Via Technology Ltd.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//    http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15pub use cl3::device::*;
16
17pub use cl3::ext::cl_device_feature_capabilities_intel;
18
19use super::Result;
20use super::platform::get_platforms;
21#[allow(unused_imports)]
22use cl3::ext;
23#[allow(unused_imports)]
24use libc::{intptr_t, size_t};
25
26/// Get the ids of all available devices of the given type.
27pub fn get_all_devices(device_type: cl_device_type) -> Result<Vec<cl_device_id>> {
28    let mut device_ids = Vec::<cl_device_id>::new();
29
30    let platforms = get_platforms()?;
31    for platform in platforms {
32        let mut devices = platform.get_devices(device_type)?;
33        device_ids.append(&mut devices);
34    }
35    Ok(device_ids)
36}
37
38#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
39#[derive(Debug)]
40pub struct SubDevice {
41    id: cl_device_id,
42}
43
44#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
45impl From<cl_device_id> for SubDevice {
46    fn from(id: cl_device_id) -> Self {
47        Self { id }
48    }
49}
50
51#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
52impl From<SubDevice> for cl_device_id {
53    fn from(value: SubDevice) -> Self {
54        value.id
55    }
56}
57
58#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
59impl Drop for SubDevice {
60    fn drop(&mut self) {
61        unsafe { release_device(self.id()).expect("Error: clReleaseDevice") };
62    }
63}
64
65#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
66unsafe impl Send for SubDevice {}
67
68#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
69unsafe impl Sync for SubDevice {}
70
71#[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
72impl SubDevice {
73    pub const fn new(id: cl_device_id) -> Self {
74        Self { id }
75    }
76
77    /// Accessor for the underlying device id.
78    pub const fn id(&self) -> cl_device_id {
79        self.id
80    }
81}
82
83/// An OpenCL device id and methods to query it.
84///
85/// The query methods calls clGetDeviceInfo with the relevant param_name, see:
86/// [Device Queries](https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#device-queries-table).
87#[derive(Copy, Clone, Debug)]
88pub struct Device {
89    id: intptr_t,
90}
91
92impl From<cl_device_id> for Device {
93    fn from(value: cl_device_id) -> Self {
94        Self {
95            id: value as intptr_t,
96        }
97    }
98}
99
100impl From<Device> for cl_device_id {
101    fn from(value: Device) -> Self {
102        value.id as Self
103    }
104}
105
106unsafe impl Send for Device {}
107unsafe impl Sync for Device {}
108
109impl Device {
110    pub fn new(id: cl_device_id) -> Self {
111        Self { id: id as intptr_t }
112    }
113
114    /// Accessor for the underlying device id.
115    pub const fn id(&self) -> cl_device_id {
116        self.id as cl_device_id
117    }
118
119    /// Create sub-devices by partitioning an OpenCL device.
120    ///
121    /// * `properties` - the slice of cl_device_partition_property, see
122    ///   [Subdevice Partition](https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#subdevice-partition-table).
123    ///
124    /// returns a Result containing a vector of available SubDevices
125    /// or the error code from the OpenCL C API function.
126    #[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
127    pub fn create_sub_devices(
128        &self,
129        properties: &[cl_device_partition_property],
130    ) -> Result<Vec<SubDevice>> {
131        let sub_device_ids = create_sub_devices(self.id(), properties)?;
132        Ok(sub_device_ids
133            .iter()
134            .map(|id| SubDevice::new(*id))
135            .collect::<Vec<SubDevice>>())
136    }
137
138    #[cfg(any(feature = "CL_VERSION_2_1", feature = "dynamic"))]
139    #[inline]
140    pub fn get_device_and_host_timer(&self) -> Result<[cl_ulong; 2]> {
141        Ok(get_device_and_host_timer(self.id())?)
142    }
143
144    #[cfg(any(feature = "CL_VERSION_2_1", feature = "dynamic"))]
145    #[inline]
146    pub fn get_host_timer(&self) -> Result<cl_ulong> {
147        Ok(get_host_timer(self.id())?)
148    }
149
150    /// The OpenCL device type, see
151    /// [Device Types](https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#device-types-table).  
152    pub fn dev_type(&self) -> Result<cl_device_type> {
153        Ok(get_device_info(self.id(), CL_DEVICE_TYPE)?.into())
154    }
155
156    /// A unique device vendor identifier: a [PCI vendor ID](https://www.pcilookup.com/)
157    /// or a Khronos vendor ID if the vendor does not have a PCI vendor ID.  
158    pub fn vendor_id(&self) -> Result<cl_uint> {
159        Ok(get_device_info(self.id(), CL_DEVICE_VENDOR_ID)?.into())
160    }
161
162    /// The number of parallel compute units on the device, minimum 1.  
163    pub fn max_compute_units(&self) -> Result<cl_uint> {
164        Ok(get_device_info(self.id(), CL_DEVICE_MAX_COMPUTE_UNITS)?.into())
165    }
166
167    /// Maximum dimensions for global and local work-item IDs, minimum 3
168    /// if device is not CL_DEVICE_TYPE_CUSTOM.  
169    pub fn max_work_item_dimensions(&self) -> Result<cl_uint> {
170        Ok(get_device_info(self.id(), CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS)?.into())
171    }
172
173    /// Maximum number of work-items for each dimension of a work-group,
174    /// minimum [1, 1, 1] if device is not CL_DEVICE_TYPE_CUSTOM.  
175    pub fn max_work_group_size(&self) -> Result<size_t> {
176        Ok(get_device_info(self.id(), CL_DEVICE_MAX_WORK_GROUP_SIZE)?.into())
177    }
178
179    pub fn max_work_item_sizes(&self) -> Result<Vec<size_t>> {
180        Ok(get_device_info(self.id(), CL_DEVICE_MAX_WORK_ITEM_SIZES)?.into())
181    }
182
183    pub fn max_preferred_vector_width_char(&self) -> Result<cl_uint> {
184        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR)?.into())
185    }
186
187    pub fn max_preferred_vector_width_short(&self) -> Result<cl_uint> {
188        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT)?.into())
189    }
190
191    pub fn max_preferred_vector_width_int(&self) -> Result<cl_uint> {
192        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT)?.into())
193    }
194
195    pub fn max_preferred_vector_width_long(&self) -> Result<cl_uint> {
196        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG)?.into())
197    }
198
199    pub fn max_preferred_vector_width_float(&self) -> Result<cl_uint> {
200        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT)?.into())
201    }
202
203    pub fn max_preferred_vector_width_double(&self) -> Result<cl_uint> {
204        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE)?.into())
205    }
206
207    pub fn max_clock_frequency(&self) -> Result<cl_uint> {
208        Ok(get_device_info(self.id(), CL_DEVICE_MAX_CLOCK_FREQUENCY)?.into())
209    }
210
211    pub fn address_bits(&self) -> Result<cl_uint> {
212        Ok(get_device_info(self.id(), CL_DEVICE_ADDRESS_BITS)?.into())
213    }
214
215    pub fn max_read_image_args(&self) -> Result<cl_uint> {
216        Ok(get_device_info(self.id(), CL_DEVICE_MAX_READ_IMAGE_ARGS)?.into())
217    }
218
219    pub fn max_write_image_args(&self) -> Result<cl_uint> {
220        Ok(get_device_info(self.id(), CL_DEVICE_MAX_WRITE_IMAGE_ARGS)?.into())
221    }
222
223    pub fn max_mem_alloc_size(&self) -> Result<cl_ulong> {
224        Ok(get_device_info(self.id(), CL_DEVICE_MAX_MEM_ALLOC_SIZE)?.into())
225    }
226
227    pub fn image2d_max_width(&self) -> Result<size_t> {
228        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE2D_MAX_WIDTH)?.into())
229    }
230
231    pub fn image2d_max_height(&self) -> Result<size_t> {
232        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE2D_MAX_HEIGHT)?.into())
233    }
234
235    pub fn image3d_max_width(&self) -> Result<size_t> {
236        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE3D_MAX_WIDTH)?.into())
237    }
238
239    pub fn image3d_max_height(&self) -> Result<size_t> {
240        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE3D_MAX_HEIGHT)?.into())
241    }
242
243    pub fn image3d_max_depth(&self) -> Result<size_t> {
244        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE3D_MAX_DEPTH)?.into())
245    }
246
247    pub fn image_support(&self) -> Result<bool> {
248        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_IMAGE_SUPPORT)?) != CL_FALSE)
249    }
250
251    pub fn max_parameter_size(&self) -> Result<size_t> {
252        Ok(get_device_info(self.id(), CL_DEVICE_MAX_PARAMETER_SIZE)?.into())
253    }
254
255    pub fn max_device_samples(&self) -> Result<cl_uint> {
256        Ok(get_device_info(self.id(), CL_DEVICE_MAX_SAMPLERS)?.into())
257    }
258
259    pub fn mem_base_addr_align(&self) -> Result<cl_uint> {
260        Ok(get_device_info(self.id(), CL_DEVICE_MEM_BASE_ADDR_ALIGN)?.into())
261    }
262
263    pub fn min_data_type_align_size(&self) -> Result<cl_uint> {
264        Ok(get_device_info(self.id(), CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE)?.into())
265    }
266
267    pub fn single_fp_config(&self) -> Result<cl_ulong> {
268        Ok(get_device_info(self.id(), CL_DEVICE_SINGLE_FP_CONFIG)?.into())
269    }
270
271    pub fn global_mem_cache_type(&self) -> Result<cl_uint> {
272        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_CACHE_TYPE)?.into())
273    }
274
275    pub fn global_mem_cacheline_size(&self) -> Result<cl_uint> {
276        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE)?.into())
277    }
278
279    pub fn global_mem_cache_size(&self) -> Result<cl_ulong> {
280        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_CACHE_SIZE)?.into())
281    }
282
283    pub fn global_mem_size(&self) -> Result<cl_ulong> {
284        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_SIZE)?.into())
285    }
286
287    pub fn max_constant_buffer_size(&self) -> Result<cl_ulong> {
288        Ok(get_device_info(self.id(), CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE)?.into())
289    }
290
291    pub fn max_constant_args(&self) -> Result<cl_uint> {
292        Ok(get_device_info(self.id(), CL_DEVICE_MAX_CONSTANT_ARGS)?.into())
293    }
294
295    pub fn local_mem_type(&self) -> Result<cl_uint> {
296        Ok(get_device_info(self.id(), CL_DEVICE_LOCAL_MEM_TYPE)?.into())
297    }
298
299    pub fn local_mem_size(&self) -> Result<cl_ulong> {
300        Ok(get_device_info(self.id(), CL_DEVICE_LOCAL_MEM_SIZE)?.into())
301    }
302
303    pub fn error_correction_support(&self) -> Result<bool> {
304        Ok(cl_uint::from(get_device_info(
305            self.id(),
306            CL_DEVICE_ERROR_CORRECTION_SUPPORT,
307        )?) != CL_FALSE)
308    }
309
310    pub fn profiling_timer_resolution(&self) -> Result<size_t> {
311        Ok(get_device_info(self.id(), CL_DEVICE_PROFILING_TIMER_RESOLUTION)?.into())
312    }
313
314    pub fn endian_little(&self) -> Result<bool> {
315        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_ENDIAN_LITTLE)?) != CL_FALSE)
316    }
317
318    pub fn available(&self) -> Result<bool> {
319        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_AVAILABLE)?) != CL_FALSE)
320    }
321
322    pub fn compiler_available(&self) -> Result<bool> {
323        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_COMPILER_AVAILABLE)?) != CL_FALSE)
324    }
325
326    pub fn execution_capabilities(&self) -> Result<cl_ulong> {
327        Ok(get_device_info(self.id(), CL_DEVICE_EXECUTION_CAPABILITIES)?.into())
328    }
329
330    pub fn queue_on_host_properties(&self) -> Result<cl_ulong> {
331        Ok(get_device_info(self.id(), CL_DEVICE_QUEUE_ON_HOST_PROPERTIES)?.into())
332    }
333
334    pub fn name(&self) -> Result<String> {
335        Ok(get_device_info(self.id(), CL_DEVICE_NAME)?.into())
336    }
337
338    pub fn vendor(&self) -> Result<String> {
339        Ok(get_device_info(self.id(), CL_DEVICE_VENDOR)?.into())
340    }
341
342    pub fn driver_version(&self) -> Result<String> {
343        Ok(get_device_info(self.id(), CL_DRIVER_VERSION)?.into())
344    }
345
346    pub fn profile(&self) -> Result<String> {
347        Ok(get_device_info(self.id(), CL_DEVICE_PROFILE)?.into())
348    }
349
350    pub fn version(&self) -> Result<String> {
351        Ok(get_device_info(self.id(), CL_DEVICE_VERSION)?.into())
352    }
353
354    pub fn extensions(&self) -> Result<String> {
355        Ok(get_device_info(self.id(), CL_DEVICE_EXTENSIONS)?.into())
356    }
357
358    pub fn platform(&self) -> Result<cl_platform_id> {
359        Ok(intptr_t::from(get_device_info(self.id(), CL_DEVICE_PLATFORM)?) as cl_platform_id)
360    }
361
362    /// CL_VERSION_1_2
363    pub fn double_fp_config(&self) -> Result<cl_ulong> {
364        Ok(get_device_info(self.id(), CL_DEVICE_DOUBLE_FP_CONFIG)?.into())
365    }
366
367    pub fn half_fp_config(&self) -> Result<cl_ulong> {
368        Ok(get_device_info(self.id(), CL_DEVICE_HALF_FP_CONFIG)?.into())
369    }
370
371    pub fn preferred_vector_width_half(&self) -> Result<cl_uint> {
372        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF)?.into())
373    }
374
375    // DEPRECATED 2.0
376    pub fn host_unified_memory(&self) -> Result<bool> {
377        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_HOST_UNIFIED_MEMORY)?) != CL_FALSE)
378    }
379
380    pub fn native_vector_width_char(&self) -> Result<cl_uint> {
381        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR)?.into())
382    }
383
384    pub fn native_vector_width_short(&self) -> Result<cl_uint> {
385        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT)?.into())
386    }
387
388    pub fn native_vector_width_int(&self) -> Result<cl_uint> {
389        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_INT)?.into())
390    }
391
392    pub fn native_vector_width_long(&self) -> Result<cl_uint> {
393        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG)?.into())
394    }
395
396    pub fn native_vector_width_float(&self) -> Result<cl_uint> {
397        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT)?.into())
398    }
399
400    pub fn native_vector_width_double(&self) -> Result<cl_uint> {
401        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE)?.into())
402    }
403
404    pub fn native_vector_width_half(&self) -> Result<cl_uint> {
405        Ok(get_device_info(self.id(), CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF)?.into())
406    }
407
408    pub fn opencl_c_version(&self) -> Result<String> {
409        Ok(get_device_info(self.id(), CL_DEVICE_OPENCL_C_VERSION)?.into())
410    }
411
412    /// CL_VERSION_1_2
413    pub fn linker_available(&self) -> Result<bool> {
414        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_LINKER_AVAILABLE)?) != CL_FALSE)
415    }
416
417    /// CL_VERSION_1_2
418    pub fn built_in_kernels(&self) -> Result<String> {
419        Ok(get_device_info(self.id(), CL_DEVICE_BUILT_IN_KERNELS)?.into())
420    }
421
422    /// CL_VERSION_1_2
423    pub fn image_max_buffer_size(&self) -> Result<size_t> {
424        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE_MAX_BUFFER_SIZE)?.into())
425    }
426
427    /// CL_VERSION_1_2
428    pub fn image_max_array_size(&self) -> Result<size_t> {
429        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE_MAX_ARRAY_SIZE)?.into())
430    }
431
432    /// CL_VERSION_1_2
433    pub fn parent_device(&self) -> Result<cl_device_id> {
434        Ok(intptr_t::from(get_device_info(self.id(), CL_DEVICE_PARENT_DEVICE)?) as cl_device_id)
435    }
436
437    /// CL_VERSION_1_2
438    pub fn partition_max_sub_devices(&self) -> Result<cl_uint> {
439        Ok(get_device_info(self.id(), CL_DEVICE_PARTITION_MAX_SUB_DEVICES)?.into())
440    }
441
442    /// CL_VERSION_1_2
443    pub fn partition_properties(&self) -> Result<Vec<intptr_t>> {
444        Ok(get_device_info(self.id(), CL_DEVICE_PARTITION_PROPERTIES)?.into())
445    }
446
447    /// CL_VERSION_1_2
448    pub fn partition_affinity_domain(&self) -> Result<Vec<cl_ulong>> {
449        Ok(get_device_info(self.id(), CL_DEVICE_PARTITION_AFFINITY_DOMAIN)?.into())
450    }
451
452    /// CL_VERSION_1_2
453    pub fn partition_type(&self) -> Result<Vec<intptr_t>> {
454        Ok(get_device_info(self.id(), CL_DEVICE_PARTITION_TYPE)?.into())
455    }
456
457    /// CL_VERSION_1_2
458    pub fn reference_count(&self) -> Result<cl_uint> {
459        Ok(get_device_info(self.id(), CL_DEVICE_REFERENCE_COUNT)?.into())
460    }
461
462    /// CL_VERSION_1_2
463    pub fn preferred_interop_user_sync(&self) -> Result<bool> {
464        Ok(cl_uint::from(get_device_info(
465            self.id(),
466            CL_DEVICE_PREFERRED_INTEROP_USER_SYNC,
467        )?) != CL_FALSE)
468    }
469
470    /// CL_VERSION_1_2
471    pub fn printf_buffer_size(&self) -> Result<size_t> {
472        Ok(get_device_info(self.id(), CL_DEVICE_PRINTF_BUFFER_SIZE)?.into())
473    }
474
475    /// CL_VERSION_2_0
476    pub fn image_pitch_alignment(&self) -> Result<cl_uint> {
477        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE_PITCH_ALIGNMENT)?.into())
478    }
479
480    /// CL_VERSION_2_0
481    pub fn image_base_address_alignment(&self) -> Result<cl_uint> {
482        Ok(get_device_info(self.id(), CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT)?.into())
483    }
484
485    /// CL_VERSION_2_0
486    pub fn max_read_write_image_args(&self) -> Result<cl_uint> {
487        Ok(get_device_info(self.id(), CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS)?.into())
488    }
489
490    /// CL_VERSION_2_0
491    pub fn max_global_variable_size(&self) -> Result<size_t> {
492        Ok(get_device_info(self.id(), CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE)?.into())
493    }
494
495    /// CL_VERSION_2_0
496    pub fn queue_on_device_properties(&self) -> Result<Vec<intptr_t>> {
497        Ok(get_device_info(self.id(), CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES)?.into())
498    }
499
500    /// CL_VERSION_2_0
501    pub fn queue_on_device_preferred_size(&self) -> Result<size_t> {
502        Ok(get_device_info(self.id(), CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE)?.into())
503    }
504
505    /// CL_VERSION_2_0
506    pub fn queue_on_device_max_size(&self) -> Result<size_t> {
507        Ok(get_device_info(self.id(), CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE)?.into())
508    }
509
510    /// CL_VERSION_2_0
511    pub fn max_on_device_queues(&self) -> Result<cl_uint> {
512        Ok(get_device_info(self.id(), CL_DEVICE_MAX_ON_DEVICE_QUEUES)?.into())
513    }
514
515    /// CL_VERSION_2_0
516    pub fn max_on_device_events(&self) -> Result<cl_uint> {
517        Ok(get_device_info(self.id(), CL_DEVICE_MAX_ON_DEVICE_EVENTS)?.into())
518    }
519
520    /// CL_VERSION_2_0
521    pub fn svm_capabilities(&self) -> Result<cl_device_svm_capabilities> {
522        Ok(get_device_info(self.id(), CL_DEVICE_SVM_CAPABILITIES)?.into())
523    }
524
525    /// CL_VERSION_2_0
526    pub fn global_variable_preferred_total_size(&self) -> Result<size_t> {
527        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE)?.into())
528    }
529
530    /// CL_VERSION_2_0
531    pub fn max_pipe_args(&self) -> Result<cl_uint> {
532        Ok(get_device_info(self.id(), CL_DEVICE_MAX_PIPE_ARGS)?.into())
533    }
534
535    /// CL_VERSION_2_0
536    pub fn pipe_max_active_reservations(&self) -> Result<cl_uint> {
537        Ok(get_device_info(self.id(), CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS)?.into())
538    }
539
540    /// CL_VERSION_2_0
541    pub fn pipe_max_packet_size(&self) -> Result<cl_uint> {
542        Ok(get_device_info(self.id(), CL_DEVICE_PIPE_MAX_PACKET_SIZE)?.into())
543    }
544
545    /// CL_VERSION_2_0
546    pub fn preferred_platform_atomic_alignment(&self) -> Result<cl_uint> {
547        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT)?.into())
548    }
549
550    /// CL_VERSION_2_0
551    pub fn preferred_global_atomic_alignment(&self) -> Result<cl_uint> {
552        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT)?.into())
553    }
554
555    /// CL_VERSION_2_0
556    pub fn preferred_local_atomic_alignment(&self) -> Result<cl_uint> {
557        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT)?.into())
558    }
559
560    /// CL_VERSION_2_1
561    pub fn il_version(&self) -> Result<String> {
562        Ok(get_device_info(self.id(), CL_DEVICE_IL_VERSION)?.into())
563    }
564
565    /// CL_VERSION_2_1
566    pub fn max_num_sub_groups(&self) -> Result<cl_uint> {
567        Ok(get_device_info(self.id(), CL_DEVICE_MAX_NUM_SUB_GROUPS)?.into())
568    }
569
570    /// CL_VERSION_2_1
571    pub fn sub_group_independent_forward_progress(&self) -> Result<bool> {
572        Ok(cl_uint::from(get_device_info(
573            self.id(),
574            CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS,
575        )?) != CL_FALSE)
576    }
577
578    /// CL_VERSION_3_0
579    pub fn numeric_version(&self) -> Result<cl_uint> {
580        Ok(get_device_info(self.id(), CL_DEVICE_NUMERIC_VERSION)?.into())
581    }
582
583    /// CL_VERSION_3_0
584    pub fn extensions_with_version(&self) -> Result<Vec<cl_name_version>> {
585        Ok(get_device_info(self.id(), CL_DEVICE_EXTENSIONS_WITH_VERSION)?.into())
586    }
587
588    /// CL_VERSION_3_0
589    pub fn ils_with_version(&self) -> Result<Vec<cl_name_version>> {
590        Ok(get_device_info(self.id(), CL_DEVICE_ILS_WITH_VERSION)?.into())
591    }
592
593    /// CL_VERSION_3_0
594    pub fn built_in_kernels_with_version(&self) -> Result<Vec<cl_name_version>> {
595        Ok(get_device_info(self.id(), CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION)?.into())
596    }
597
598    /// CL_VERSION_3_0
599    pub fn atomic_memory_capabilities(&self) -> Result<cl_ulong> {
600        Ok(get_device_info(self.id(), CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES)?.into())
601    }
602
603    /// CL_VERSION_3_0
604    pub fn atomic_fence_capabilities(&self) -> Result<cl_ulong> {
605        Ok(get_device_info(self.id(), CL_DEVICE_ATOMIC_FENCE_CAPABILITIES)?.into())
606    }
607
608    /// CL_VERSION_3_0
609    pub fn non_uniform_work_group_support(&self) -> Result<bool> {
610        Ok(cl_uint::from(get_device_info(
611            self.id(),
612            CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT,
613        )?) != CL_FALSE)
614    }
615
616    /// CL_VERSION_3_0
617    pub fn opencl_c_all_versions(&self) -> Result<Vec<cl_name_version>> {
618        Ok(get_device_info(self.id(), CL_DEVICE_OPENCL_C_ALL_VERSIONS)?.into())
619    }
620
621    /// CL_VERSION_3_0
622    pub fn preferred_work_group_size_multiple(&self) -> Result<size_t> {
623        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE)?.into())
624    }
625
626    /// CL_VERSION_3_0
627    pub fn work_group_collective_functions_support(&self) -> Result<bool> {
628        Ok(cl_uint::from(get_device_info(
629            self.id(),
630            CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT,
631        )?) != CL_FALSE)
632    }
633
634    /// CL_VERSION_3_0
635    pub fn generic_address_space_support(&self) -> Result<bool> {
636        Ok(cl_uint::from(get_device_info(
637            self.id(),
638            CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT,
639        )?) != CL_FALSE)
640    }
641
642    /// CL_VERSION_3_0
643    pub fn uuid_khr(&self) -> Result<[u8; CL_UUID_SIZE_KHR]> {
644        Ok(get_device_info(self.id(), CL_DEVICE_UUID_KHR)?.into())
645    }
646
647    /// CL_VERSION_3_0
648    pub fn driver_uuid_khr(&self) -> Result<[u8; CL_UUID_SIZE_KHR]> {
649        Ok(get_device_info(self.id(), CL_DRIVER_UUID_KHR)?.into())
650    }
651
652    /// CL_VERSION_3_0
653    pub fn luid_valid_khr(&self) -> Result<bool> {
654        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_LUID_VALID_KHR)?) != CL_FALSE)
655    }
656
657    /// CL_VERSION_3_0
658    pub fn luid_khr(&self) -> Result<[u8; CL_LUID_SIZE_KHR]> {
659        Ok(get_device_info(self.id(), CL_DEVICE_LUID_KHR)?.into())
660    }
661
662    /// CL_VERSION_3_0
663    pub fn node_mask_khr(&self) -> Result<cl_uint> {
664        Ok(get_device_info(self.id(), CL_DEVICE_NODE_MASK_KHR)?.into())
665    }
666
667    /// CL_VERSION_3_0
668    pub fn opencl_c_features(&self) -> Result<Vec<cl_name_version>> {
669        Ok(get_device_info(self.id(), CL_DEVICE_OPENCL_C_FEATURES)?.into())
670    }
671
672    /// CL_VERSION_3_0
673    pub fn device_enqueue_capabilities(&self) -> Result<cl_ulong> {
674        Ok(get_device_info(self.id(), CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES)?.into())
675    }
676
677    /// CL_VERSION_3_0
678    pub fn pipe_support(&self) -> Result<bool> {
679        Ok(cl_uint::from(get_device_info(self.id(), CL_DEVICE_PIPE_SUPPORT)?) != CL_FALSE)
680    }
681
682    /// CL_VERSION_3_0
683    pub fn latest_conformance_version_passed(&self) -> Result<String> {
684        Ok(get_device_info(self.id(), CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED)?.into())
685    }
686
687    pub fn integer_dot_product_capabilities_khr(&self) -> Result<cl_ulong> {
688        Ok(get_device_info(self.id(), CL_DEVICE_INTEGER_DOT_PRODUCT_CAPABILITIES_KHR)?.into())
689    }
690
691    pub fn integer_dot_product_acceleration_properties_8bit_khr(
692        &self,
693    ) -> Result<cl_device_integer_dot_product_acceleration_properties_khr> {
694        let value: Vec<u8> = get_device_info(
695            self.id(),
696            CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR,
697        )?
698        .into();
699        Ok(get_device_integer_dot_product_acceleration_properties_khr(
700            &value,
701        ))
702    }
703
704    pub fn integer_dot_product_acceleration_properties_4x8bit_packed_khr(
705        &self,
706    ) -> Result<cl_device_integer_dot_product_acceleration_properties_khr> {
707        let value: Vec<u8> = get_device_info(
708            self.id(),
709            CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_4x8BIT_PACKED_KHR,
710        )?
711        .into();
712        Ok(get_device_integer_dot_product_acceleration_properties_khr(
713            &value,
714        ))
715    }
716
717    pub fn compute_capability_major_nv(&self) -> Result<cl_uint> {
718        Ok(get_device_info(self.id(), CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV)?.into())
719    }
720
721    pub fn compute_capability_minor_nv(&self) -> Result<cl_uint> {
722        Ok(get_device_info(self.id(), CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV)?.into())
723    }
724
725    pub fn registers_per_block_nv(&self) -> Result<cl_uint> {
726        Ok(get_device_info(self.id(), CL_DEVICE_REGISTERS_PER_BLOCK_NV)?.into())
727    }
728
729    pub fn wrap_size_nv(&self) -> Result<cl_uint> {
730        Ok(get_device_info(self.id(), CL_DEVICE_WARP_SIZE_NV)?.into())
731    }
732
733    pub fn gpu_overlap_nv(&self) -> Result<cl_uint> {
734        Ok(get_device_info(self.id(), CL_DEVICE_GPU_OVERLAP_NV)?.into())
735    }
736
737    pub fn compute_kernel_exec_timeout_nv(&self) -> Result<cl_uint> {
738        Ok(get_device_info(self.id(), CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV)?.into())
739    }
740
741    pub fn integrated_memory_nv(&self) -> Result<cl_uint> {
742        Ok(get_device_info(self.id(), CL_DEVICE_INTEGRATED_MEMORY_NV)?.into())
743    }
744
745    pub fn pci_bus_id_nv(&self) -> Result<cl_uint> {
746        Ok(get_device_info(self.id(), CL_DEVICE_PCI_BUS_ID_NV)?.into())
747    }
748
749    pub fn pci_slot_id_nv(&self) -> Result<cl_uint> {
750        Ok(get_device_info(self.id(), CL_DEVICE_PCI_SLOT_ID_NV)?.into())
751    }
752
753    pub fn profiling_timer_offset_amd(&self) -> Result<size_t> {
754        Ok(get_device_info(self.id(), CL_DEVICE_PROFILING_TIMER_OFFSET_AMD)?.into())
755    }
756
757    pub fn topology_amd(&self) -> Result<cl_amd_device_topology> {
758        let value: Vec<u8> = get_device_info(self.id(), CL_DEVICE_TOPOLOGY_AMD)?.into();
759        Ok(get_amd_device_topology(&value))
760    }
761
762    pub fn pci_bus_id_amd(&self) -> Result<cl_uint> {
763        let value = self.topology_amd()?;
764        Ok(value.bus as cl_uint)
765    }
766
767    pub fn pcibusinfokhr_intel(&self) -> Result<cl_device_pci_bus_info_khr> {
768        let value: Vec<u8> = get_device_info(self.id(), CL_DEVICE_PCI_BUS_INFO_KHR)?.into();
769        Ok(get_device_pci_bus_info_khr(&value))
770    }
771
772    pub fn pci_bus_id_intel(&self) -> Result<cl_uint> {
773        let value = self.pcibusinfokhr_intel()?;
774        Ok(value.pci_bus as cl_uint)
775    }
776
777    pub fn board_name_amd(&self) -> Result<String> {
778        Ok(get_device_info(self.id(), CL_DEVICE_BOARD_NAME_AMD)?.into())
779    }
780
781    pub fn global_free_memory_amd(&self) -> Result<size_t> {
782        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_FREE_MEMORY_AMD)?.into())
783    }
784
785    pub fn simd_per_compute_unit_amd(&self) -> Result<cl_uint> {
786        Ok(get_device_info(self.id(), CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD)?.into())
787    }
788
789    pub fn simd_width_amd(&self) -> Result<cl_uint> {
790        Ok(get_device_info(self.id(), CL_DEVICE_SIMD_WIDTH_AMD)?.into())
791    }
792
793    pub fn simd_instruction_width_amd(&self) -> Result<cl_uint> {
794        Ok(get_device_info(self.id(), CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD)?.into())
795    }
796
797    pub fn wavefront_width_amd(&self) -> Result<cl_uint> {
798        Ok(get_device_info(self.id(), CL_DEVICE_WAVEFRONT_WIDTH_AMD)?.into())
799    }
800
801    pub fn global_mem_channels_amd(&self) -> Result<cl_uint> {
802        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD)?.into())
803    }
804
805    pub fn global_mem_channel_banks_amd(&self) -> Result<cl_uint> {
806        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD)?.into())
807    }
808
809    pub fn global_mem_channel_bank_width_amd(&self) -> Result<cl_uint> {
810        Ok(get_device_info(self.id(), CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD)?.into())
811    }
812
813    pub fn local_mem_size_per_compute_unit_amd(&self) -> Result<cl_uint> {
814        Ok(get_device_info(self.id(), CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD)?.into())
815    }
816
817    pub fn local_mem_banks_amd(&self) -> Result<cl_uint> {
818        Ok(get_device_info(self.id(), CL_DEVICE_LOCAL_MEM_BANKS_AMD)?.into())
819    }
820
821    pub fn thread_trace_supported_amd(&self) -> Result<cl_uint> {
822        Ok(get_device_info(self.id(), CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD)?.into())
823    }
824
825    pub fn gfxip_major_amd(&self) -> Result<cl_uint> {
826        Ok(get_device_info(self.id(), CL_DEVICE_GFXIP_MAJOR_AMD)?.into())
827    }
828
829    pub fn gfxip_minor_amd(&self) -> Result<cl_uint> {
830        Ok(get_device_info(self.id(), CL_DEVICE_GFXIP_MINOR_AMD)?.into())
831    }
832
833    pub fn available_async_queues_amd(&self) -> Result<cl_uint> {
834        Ok(get_device_info(self.id(), CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD)?.into())
835    }
836
837    pub fn preferred_work_group_size_amd(&self) -> Result<size_t> {
838        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD)?.into())
839    }
840
841    pub fn max_work_group_size_amd(&self) -> Result<size_t> {
842        Ok(get_device_info(self.id(), CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD)?.into())
843    }
844
845    pub fn preferred_constant_buffer_size_amd(&self) -> Result<size_t> {
846        Ok(get_device_info(self.id(), CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD)?.into())
847    }
848
849    pub fn pcie_id_amd(&self) -> Result<cl_uint> {
850        Ok(get_device_info(self.id(), CL_DEVICE_PCIE_ID_AMD)?.into())
851    }
852
853    pub fn device_ip_version_intel(&self) -> Result<cl_uint> {
854        Ok(get_device_info(self.id(), CL_DEVICE_IP_VERSION_INTEL)?.into())
855    }
856
857    pub fn device_id_intel(&self) -> Result<cl_uint> {
858        Ok(get_device_info(self.id(), CL_DEVICE_ID_INTEL)?.into())
859    }
860
861    pub fn device_num_slices_intel(&self) -> Result<cl_uint> {
862        Ok(get_device_info(self.id(), CL_DEVICE_NUM_SLICES_INTEL)?.into())
863    }
864
865    pub fn device_num_sub_slices_per_slice_intel(&self) -> Result<cl_uint> {
866        Ok(get_device_info(self.id(), CL_DEVICE_NUM_SUB_SLICES_PER_SLICE_INTEL)?.into())
867    }
868
869    pub fn device_num_eus_per_sub_slice_intel(&self) -> Result<cl_uint> {
870        Ok(get_device_info(self.id(), CL_DEVICE_NUM_EUS_PER_SUB_SLICE_INTEL)?.into())
871    }
872
873    pub fn device_num_threads_per_eu_intel(&self) -> Result<cl_uint> {
874        Ok(get_device_info(self.id(), CL_DEVICE_NUM_THREADS_PER_EU_INTEL)?.into())
875    }
876
877    pub fn device_feature_capabilities_intel(
878        &self,
879    ) -> Result<cl_device_feature_capabilities_intel> {
880        Ok(get_device_info(self.id(), CL_DEVICE_FEATURE_CAPABILITIES_INTEL)?.into())
881    }
882
883    pub fn device_external_memory_import_handle_types_khr(&self) -> Result<Vec<u32>> {
884        Ok(get_device_info(self.id(), CL_DEVICE_EXTERNAL_MEMORY_IMPORT_HANDLE_TYPES_KHR)?.into())
885    }
886
887    pub fn device_semaphore_import_handle_types_khr(&self) -> Result<Vec<u32>> {
888        Ok(get_device_info(self.id(), CL_DEVICE_SEMAPHORE_IMPORT_HANDLE_TYPES_KHR)?.into())
889    }
890
891    pub fn device_semaphore_export_handle_types_khr(&self) -> Result<Vec<u32>> {
892        Ok(get_device_info(self.id(), CL_DEVICE_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR)?.into())
893    }
894
895    pub fn device_semaphore_types_khr(&self) -> Result<Vec<u32>> {
896        Ok(get_device_info(self.id(), CL_DEVICE_SEMAPHORE_TYPES_KHR)?.into())
897    }
898
899    pub fn device_command_buffer_capabilities_khr(&self) -> Result<cl_ulong> {
900        Ok(get_device_info(self.id(), CL_DEVICE_COMMAND_BUFFER_CAPABILITIES_KHR)?.into())
901    }
902
903    pub fn device_command_buffer_required_queue_properties_khr(&self) -> Result<cl_ulong> {
904        Ok(get_device_info(
905            self.id(),
906            CL_DEVICE_COMMAND_BUFFER_REQUIRED_QUEUE_PROPERTIES_KHR,
907        )?
908        .into())
909    }
910
911    /// Get data about an OpenCL device.
912    /// Calls clGetDeviceInfo to get the desired data about the device.
913    pub fn get_data(&self, param_name: cl_device_info) -> Result<Vec<u8>> {
914        Ok(get_device_data(self.id(), param_name)?)
915    }
916
917    /// Determine if the device supports the given half floating point capability.  
918    /// Returns true if the device supports it, false otherwise.
919    pub fn supports_half(&self, min_fp_capability: cl_device_fp_config) -> bool {
920        self.half_fp_config()
921            .is_ok_and(|fp| 0 < fp & min_fp_capability)
922    }
923    /// Determine if the device supports the given double floating point capability.  
924    /// Returns true if the device supports it, false otherwise.
925    ///
926    /// CL_VERSION_1_2
927    pub fn supports_double(&self, min_fp_capability: cl_device_fp_config) -> bool {
928        self.double_fp_config()
929            .is_ok_and(|fp| 0 < fp & min_fp_capability)
930    }
931
932    /// Determine if the device supports SVM and, if so, what kind of SVM.  
933    /// Returns zero if the device does not support SVM.
934    ///
935    /// CL_VERSION_2_0
936    pub fn svm_mem_capability(&self) -> cl_device_svm_capabilities {
937        self.svm_capabilities().map_or(0, |svm| svm)
938    }
939
940    #[cfg(any(feature = "cl_khr_external_semaphore", feature = "dynamic"))]
941    pub fn get_semaphore_handle_for_type_khr(
942        &self,
943        sema_object: ext::cl_semaphore_khr,
944        handle_type: ext::cl_external_semaphore_handle_type_khr,
945    ) -> Result<ext::cl_semaphore_khr> {
946        Ok(ext::get_semaphore_handle_for_type_khr(
947            sema_object,
948            self.id(),
949            handle_type,
950        )?)
951    }
952}
953
954#[cfg(test)]
955mod tests {
956    use super::*;
957    use crate::platform::get_platforms;
958    use cl3::info_type::InfoType;
959    #[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
960    use std::ptr;
961
962    #[test]
963    fn test_get_devices() {
964        let platforms = get_platforms().unwrap();
965        println!("Number of platforms: {}", platforms.len());
966        assert!(0 < platforms.len());
967
968        for platform in platforms {
969            println!("CL_PLATFORM_NAME: {}", platform.name().unwrap());
970
971            let devices = platform.get_devices(CL_DEVICE_TYPE_ALL).unwrap();
972            for device_id in devices {
973                let device = Device::new(device_id);
974
975                println!("Device Debug Trait: {:?}", device);
976                println!("\tCL_DEVICE_NAME: {}", device.name().unwrap());
977                println!("\tCL_DEVICE_TYPE: {:X}", device.dev_type().unwrap());
978                println!("\tCL_DEVICE_VENDOR_ID: {:X}", device.vendor_id().unwrap());
979                println!("\tCL_DEVICE_VENDOR: {}", device.vendor().unwrap());
980                println!(
981                    "\tCL_DEVICE_OPENCL_C_VERSION: {:?}",
982                    device.opencl_c_version().unwrap()
983                );
984                println!();
985            }
986        }
987    }
988
989    #[cfg(any(feature = "CL_VERSION_1_2", feature = "dynamic"))]
990    #[test]
991    fn test_get_sub_devices() {
992        let platforms = get_platforms().unwrap();
993        println!("Number of platforms: {}", platforms.len());
994        assert!(0 < platforms.len());
995
996        // Find an OpenCL device with sub devices
997        let mut device_id = ptr::null_mut();
998        let mut has_sub_devices: bool = false;
999
1000        for platform in platforms {
1001            let device_ids = platform.get_devices(CL_DEVICE_TYPE_CPU).unwrap();
1002
1003            for dev_id in device_ids {
1004                let device = Device::new(dev_id);
1005                let max_sub_devices = device.partition_max_sub_devices().unwrap();
1006
1007                has_sub_devices = 1 < max_sub_devices;
1008                if has_sub_devices {
1009                    device_id = dev_id;
1010                    break;
1011                }
1012            }
1013        }
1014
1015        if has_sub_devices {
1016            let device = Device::new(device_id);
1017            let properties: [cl_device_partition_property; 3] = [CL_DEVICE_PARTITION_EQUALLY, 2, 0];
1018            let sub_devices = device.create_sub_devices(&properties).unwrap();
1019
1020            println!("sub_devices len: {}", sub_devices.len());
1021            assert!(0 < sub_devices.len());
1022        } else {
1023            println!("OpenCL device capable of sub division not found");
1024        }
1025    }
1026
1027    #[test]
1028    fn test_device_info() {
1029        let platforms = get_platforms().unwrap();
1030        assert!(!platforms.is_empty());
1031
1032        // Choose the first platform
1033        let platform = &platforms[0];
1034
1035        let devices = platform.get_devices(CL_DEVICE_TYPE_GPU).unwrap();
1036        println!("CL_DEVICE_TYPE_GPU count: {}", devices.len());
1037        assert!(!devices.is_empty());
1038
1039        // Choose the first device
1040        let device_id = devices[0];
1041        let device = Device::new(device_id);
1042
1043        let value = device.dev_type().unwrap();
1044        assert_eq!(CL_DEVICE_TYPE_GPU, value);
1045
1046        let value = device.vendor_id().unwrap();
1047        println!("CL_DEVICE_VENDOR_ID: {:X}", value);
1048        assert!(0 < value);
1049
1050        let vendor_text = match value {
1051            0x1002 => "AMD",
1052            0x10DE => "Nvidia",
1053            0x8086 => "Intel",
1054            _ => "unknown",
1055        };
1056        println!("Device vendor is: {}", vendor_text);
1057
1058        let value = device.max_compute_units().unwrap();
1059        println!("CL_DEVICE_MAX_COMPUTE_UNITS: {}", value);
1060        assert!(0 < value);
1061
1062        let value = device.max_work_item_dimensions().unwrap();
1063        println!("CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: {}", value);
1064        assert!(0 < value);
1065
1066        let value = device.max_work_group_size().unwrap();
1067        println!("CL_DEVICE_MAX_WORK_GROUP_SIZE: {}", value);
1068        assert!(0 < value);
1069
1070        let value = device.max_work_item_sizes().unwrap();
1071        println!("CL_DEVICE_MAX_WORK_ITEM_SIZES: {}", value.len());
1072        println!("CL_DEVICE_MAX_WORK_ITEM_SIZES: {:?}", value);
1073        assert!(0 < value.len());
1074
1075        let value = device.max_preferred_vector_width_char().unwrap();
1076        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: {}", value);
1077        assert!(0 < value);
1078
1079        let value = device.max_preferred_vector_width_short().unwrap();
1080        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT: {}", value);
1081        assert!(0 < value);
1082
1083        let value = device.max_preferred_vector_width_int().unwrap();
1084        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: {}", value);
1085        assert!(0 < value);
1086
1087        let value = device.max_preferred_vector_width_long().unwrap();
1088        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: {}", value);
1089        assert!(0 < value);
1090
1091        let value = device.max_preferred_vector_width_float().unwrap();
1092        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: {}", value);
1093        assert!(0 < value);
1094
1095        let value = device.max_preferred_vector_width_double().unwrap();
1096        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: {}", value);
1097        assert!(0 < value);
1098
1099        let value = device.max_clock_frequency().unwrap();
1100        println!("CL_DEVICE_MAX_CLOCK_FREQUENCY: {}", value);
1101        assert!(0 < value);
1102
1103        let value = device.address_bits().unwrap();
1104        println!("CL_DEVICE_ADDRESS_BITS: {}", value);
1105        assert!(0 < value);
1106
1107        let value = device.max_read_image_args().unwrap();
1108        println!("CL_DEVICE_MAX_READ_IMAGE_ARGS: {}", value);
1109        assert!(0 < value);
1110
1111        let value = device.max_write_image_args().unwrap();
1112        println!("CL_DEVICE_MAX_WRITE_IMAGE_ARGS: {}", value);
1113        assert!(0 < value);
1114
1115        let value = device.max_mem_alloc_size().unwrap();
1116        println!("CL_DEVICE_MAX_MEM_ALLOC_SIZE: {}", value);
1117        assert!(0 < value);
1118
1119        let value = device.image2d_max_width().unwrap();
1120        println!("CL_DEVICE_IMAGE2D_MAX_WIDTH: {}", value);
1121        assert!(0 < value);
1122
1123        let value = device.image2d_max_height().unwrap();
1124        println!("CL_DEVICE_IMAGE2D_MAX_HEIGHT: {}", value);
1125        assert!(0 < value);
1126
1127        let value = device.image3d_max_width().unwrap();
1128        println!("CL_DEVICE_IMAGE3D_MAX_WIDTH: {}", value);
1129        assert!(0 < value);
1130
1131        let value = device.image3d_max_height().unwrap();
1132        println!("CL_DEVICE_IMAGE3D_MAX_HEIGHT: {}", value);
1133        assert!(0 < value);
1134
1135        let value = device.image3d_max_depth().unwrap();
1136        println!("CL_DEVICE_IMAGE3D_MAX_DEPTH: {}", value);
1137        assert!(0 < value);
1138
1139        let value = device.image_support().unwrap();
1140        println!("CL_DEVICE_IMAGE_SUPPORT: {}", value);
1141        assert!(value);
1142
1143        let value = device.max_parameter_size().unwrap();
1144        println!("CL_DEVICE_MAX_PARAMETER_SIZE: {}", value);
1145        assert!(0 < value);
1146
1147        let value = device.max_device_samples().unwrap();
1148        println!("CL_DEVICE_MAX_SAMPLERS: {}", value);
1149        assert!(0 < value);
1150
1151        let value = device.mem_base_addr_align().unwrap();
1152        println!("CL_DEVICE_MEM_BASE_ADDR_ALIGN: {}", value);
1153        assert!(0 < value);
1154
1155        let value = device.min_data_type_align_size().unwrap();
1156        println!("CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: {}", value);
1157        assert!(0 < value);
1158        let value = device.single_fp_config().unwrap();
1159        println!("CL_DEVICE_SINGLE_FP_CONFIG: {:X}", value);
1160        assert!(0 < value);
1161
1162        let value = device.global_mem_cache_type().unwrap();
1163        println!("CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: {:X}", value);
1164        assert!(0 < value);
1165
1166        let value = device.global_mem_cacheline_size().unwrap();
1167        println!("CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: {}", value);
1168        assert!(0 < value);
1169
1170        let value = device.global_mem_cache_size().unwrap();
1171        println!("CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: {}", value);
1172        assert!(0 < value);
1173
1174        let value = device.global_mem_size().unwrap();
1175        println!("CL_DEVICE_GLOBAL_MEM_SIZE: {}", value);
1176        assert!(0 < value);
1177        let value = device.max_constant_buffer_size().unwrap();
1178        println!("CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: {}", value);
1179        assert!(0 < value);
1180
1181        let value = device.max_constant_args().unwrap();
1182        println!("CL_DEVICE_MAX_CONSTANT_ARGS: {}", value);
1183        assert!(0 < value);
1184
1185        let value = device.local_mem_type().unwrap();
1186        println!("CL_DEVICE_LOCAL_MEM_TYPE: {:X}", value);
1187        assert!(0 < value);
1188
1189        let value = device.local_mem_size().unwrap();
1190        println!("CL_DEVICE_LOCAL_MEM_SIZE: {}", value);
1191        assert!(0 < value);
1192
1193        let value = device.error_correction_support().unwrap();
1194        println!("CL_DEVICE_ERROR_CORRECTION_SUPPORT: {}", value);
1195
1196        let value = device.profiling_timer_resolution().unwrap();
1197        println!("CL_DEVICE_PROFILING_TIMER_RESOLUTION: {}", value);
1198        assert!(0 < value);
1199
1200        let value = device.endian_little().unwrap();
1201        println!("CL_DEVICE_ENDIAN_LITTLE: {}", value);
1202        assert!(value);
1203
1204        let value = device.available().unwrap();
1205        println!("CL_DEVICE_AVAILABLE: {}", value);
1206        assert!(value);
1207
1208        let value = device.compiler_available().unwrap();
1209        println!("CL_DEVICE_COMPILER_AVAILABLE: {}", value);
1210        assert!(value);
1211
1212        let value = device.execution_capabilities().unwrap();
1213        println!("CL_DEVICE_EXECUTION_CAPABILITIES: {:X}", value);
1214        assert!(0 < value);
1215
1216        // CL_VERSION_2_0
1217        match device.queue_on_host_properties() {
1218            Ok(value) => {
1219                println!("CL_DEVICE_QUEUE_ON_HOST_PROPERTIES: {:X}", value)
1220            }
1221            Err(e) => println!(
1222                "OpenCL error, CL_DEVICE_QUEUE_ON_HOST_PROPERTIES: {:?}, {}",
1223                e, e
1224            ),
1225        };
1226
1227        let value = device.name().unwrap();
1228        println!("CL_DEVICE_NAME: {}", value);
1229        assert!(!value.is_empty());
1230
1231        let value = device.vendor().unwrap();
1232        println!("CL_DEVICE_VENDOR: {}", value);
1233        assert!(!value.is_empty());
1234
1235        let value = device.driver_version().unwrap();
1236        println!("CL_DRIVER_VERSION: {}", value);
1237        assert!(!value.is_empty());
1238
1239        let value = device.profile().unwrap();
1240        println!("CL_DEVICE_PROFILE: {}", value);
1241        assert!(!value.is_empty());
1242
1243        let value = device.version().unwrap();
1244        println!("CL_DEVICE_VERSION: {}", value);
1245        assert!(!value.is_empty());
1246
1247        let value = device.extensions().unwrap();
1248        println!("CL_DEVICE_EXTENSIONS: {}", value);
1249        assert!(!value.is_empty());
1250
1251        let value = device.platform().unwrap();
1252        println!("CL_DEVICE_PLATFORM: {:X}", value as intptr_t);
1253        assert_eq!(platform.id(), value);
1254
1255        // Device may not support double fp precision
1256        match device.double_fp_config() {
1257            Ok(value) => {
1258                println!("CL_DEVICE_DOUBLE_FP_CONFIG: {:X}", value)
1259            }
1260            Err(e) => println!("OpenCL error, CL_DEVICE_DOUBLE_FP_CONFIG: {:?}, {}", e, e),
1261        };
1262
1263        // Device may not support half fp precision
1264        match device.half_fp_config() {
1265            Ok(value) => {
1266                println!("CL_DEVICE_HALF_FP_CONFIG: {:X}", value)
1267            }
1268            Err(e) => println!("OpenCL error, CL_DEVICE_HALF_FP_CONFIG: {:?}, {}", e, e),
1269        };
1270
1271        let value = device.preferred_vector_width_half().unwrap();
1272        println!("CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF: {}", value);
1273
1274        let value = device.host_unified_memory().unwrap();
1275        println!("CL_DEVICE_HOST_UNIFIED_MEMORY: {}", value);
1276
1277        let value = device.native_vector_width_char().unwrap();
1278        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR: {}", value);
1279        assert!(0 < value);
1280
1281        let value = device.native_vector_width_short().unwrap();
1282        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT: {}", value);
1283        assert!(0 < value);
1284
1285        let value = device.native_vector_width_int().unwrap();
1286        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_INT: {}", value);
1287        assert!(0 < value);
1288
1289        let value = device.native_vector_width_long().unwrap();
1290        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG: {}", value);
1291        assert!(0 < value);
1292
1293        let value = device.native_vector_width_float().unwrap();
1294        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT: {}", value);
1295        assert!(0 < value);
1296
1297        let value = device.native_vector_width_double().unwrap();
1298        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE: {}", value);
1299
1300        let value = device.native_vector_width_half().unwrap();
1301        println!("CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF: {}", value);
1302
1303        let value = device.opencl_c_version().unwrap();
1304        println!("CL_DEVICE_OPENCL_C_VERSION: {}", value);
1305        assert!(!value.is_empty());
1306
1307        let value = device.linker_available().unwrap();
1308        println!("CL_DEVICE_LINKER_AVAILABLE: {}", value);
1309
1310        let value = device.built_in_kernels().unwrap();
1311        println!("CL_DEVICE_BUILT_IN_KERNELS: {:?}", value);
1312
1313        let value = device.image_max_buffer_size().unwrap();
1314        println!("CL_DEVICE_IMAGE_MAX_BUFFER_SIZE: {}", value);
1315        assert!(0 < value);
1316
1317        let value = device.image_max_array_size().unwrap();
1318        println!("CL_DEVICE_IMAGE_MAX_ARRAY_SIZE: {}", value);
1319        assert!(0 < value);
1320
1321        let value = device.parent_device().unwrap();
1322        println!("CL_DEVICE_PARENT_DEVICE: {:X}", value as intptr_t);
1323        let value = device.partition_max_sub_devices().unwrap();
1324        println!("CL_DEVICE_PARTITION_MAX_SUB_DEVICES: {}", value);
1325
1326        let value = device.partition_properties().unwrap();
1327        println!("CL_DEVICE_PARTITION_PROPERTIES: {:?}", value);
1328        assert!(0 < value.len());
1329
1330        let value = device.partition_affinity_domain().unwrap();
1331        println!("CL_DEVICE_PARTITION_AFFINITY_DOMAIN: {:?}", value);
1332        assert!(0 < value.len());
1333
1334        let value = device.partition_type().unwrap();
1335        println!("CL_DEVICE_PARTITION_TYPE: {:?}", value);
1336        // assert!(0 < value.len());
1337
1338        let value = device.reference_count().unwrap();
1339        println!("CL_DEVICE_REFERENCE_COUNT: {}", value);
1340        assert!(0 < value);
1341
1342        let value = device.preferred_interop_user_sync().unwrap();
1343        println!("CL_DEVICE_PREFERRED_INTEROP_USER_SYNC: {}", value);
1344
1345        let value = device.printf_buffer_size().unwrap();
1346        println!("CL_DEVICE_PRINTF_BUFFER_SIZE: {}", value);
1347        assert!(0 < value);
1348
1349        //////////////////////////////////////////////////////////////////////
1350        // CL_VERSION_2_0 parameters
1351        match device.image_pitch_alignment() {
1352            Ok(value) => {
1353                println!("CL_DEVICE_IMAGE_PITCH_ALIGNMENT: {}", value)
1354            }
1355            Err(e) => println!(
1356                "OpenCL error, CL_DEVICE_IMAGE_PITCH_ALIGNMENT: {:?}, {}",
1357                e, e
1358            ),
1359        };
1360
1361        match device.image_base_address_alignment() {
1362            Ok(value) => {
1363                println!("CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT: {}", value)
1364            }
1365            Err(e) => println!(
1366                "OpenCL error, CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT: {:?}, {}",
1367                e, e
1368            ),
1369        };
1370
1371        match device.max_read_write_image_args() {
1372            Ok(value) => {
1373                println!("CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS: {}", value)
1374            }
1375            Err(e) => println!(
1376                "OpenCL error, CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS: {:?}, {}",
1377                e, e
1378            ),
1379        };
1380
1381        match device.max_global_variable_size() {
1382            Ok(value) => {
1383                println!("CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE: {}", value)
1384            }
1385            Err(e) => println!(
1386                "OpenCL error, CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE: {:?}, {}",
1387                e, e
1388            ),
1389        };
1390
1391        match device.queue_on_device_properties() {
1392            Ok(value) => {
1393                println!("CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES: {:?}", value)
1394            }
1395            Err(e) => println!(
1396                "OpenCL error, CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES: {:?}, {}",
1397                e, e
1398            ),
1399        };
1400
1401        match device.queue_on_device_preferred_size() {
1402            Ok(value) => {
1403                println!("CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE: {}", value)
1404            }
1405            Err(e) => println!(
1406                "OpenCL error, CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE: {:?}, {}",
1407                e, e
1408            ),
1409        };
1410
1411        match device.queue_on_device_max_size() {
1412            Ok(value) => {
1413                println!("CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE: {}", value)
1414            }
1415            Err(e) => println!(
1416                "OpenCL error, CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE: {:?}, {}",
1417                e, e
1418            ),
1419        };
1420
1421        match device.max_on_device_queues() {
1422            Ok(value) => {
1423                println!("CL_DEVICE_MAX_ON_DEVICE_QUEUES: {}", value)
1424            }
1425            Err(e) => println!(
1426                "OpenCL error, CL_DEVICE_MAX_ON_DEVICE_QUEUES: {:?}, {}",
1427                e, e
1428            ),
1429        };
1430
1431        match device.max_on_device_events() {
1432            Ok(value) => {
1433                println!("CL_DEVICE_MAX_ON_DEVICE_EVENTS: {}", value)
1434            }
1435            Err(e) => println!(
1436                "OpenCL error, CL_DEVICE_MAX_ON_DEVICE_EVENTS: {:?}, {}",
1437                e, e
1438            ),
1439        };
1440
1441        match device.svm_capabilities() {
1442            Ok(value) => {
1443                println!("CL_DEVICE_SVM_CAPABILITIES: {}", value)
1444            }
1445            Err(e) => println!("OpenCL error, CL_DEVICE_SVM_CAPABILITIES: {:?}, {}", e, e),
1446        };
1447
1448        match device.global_variable_preferred_total_size() {
1449            Ok(value) => {
1450                println!("CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE: {}", value)
1451            }
1452            Err(e) => println!(
1453                "OpenCL error, CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE: {:?}, {}",
1454                e, e
1455            ),
1456        };
1457
1458        match device.max_pipe_args() {
1459            Ok(value) => {
1460                println!("CL_DEVICE_MAX_PIPE_ARGS: {}", value)
1461            }
1462            Err(e) => println!("OpenCL error, CL_DEVICE_MAX_PIPE_ARGS: {:?}, {}", e, e),
1463        };
1464
1465        match device.pipe_max_active_reservations() {
1466            Ok(value) => {
1467                println!("CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS: {}", value)
1468            }
1469            Err(e) => println!(
1470                "OpenCL error, CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS: {:?}, {}",
1471                e, e
1472            ),
1473        };
1474
1475        match device.pipe_max_packet_size() {
1476            Ok(value) => {
1477                println!("CL_DEVICE_PIPE_MAX_PACKET_SIZE: {}", value)
1478            }
1479            Err(e) => println!(
1480                "OpenCL error, CL_DEVICE_PIPE_MAX_PACKET_SIZE: {:?}, {}",
1481                e, e
1482            ),
1483        };
1484
1485        match device.preferred_platform_atomic_alignment() {
1486            Ok(value) => {
1487                println!("CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT: {}", value)
1488            }
1489            Err(e) => println!(
1490                "OpenCL error, CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT: {:?}, {}",
1491                e, e
1492            ),
1493        };
1494
1495        match device.preferred_global_atomic_alignment() {
1496            Ok(value) => {
1497                println!("CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT: {}", value)
1498            }
1499            Err(e) => println!(
1500                "OpenCL error, CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT: {:?}, {}",
1501                e, e
1502            ),
1503        };
1504
1505        match device.preferred_local_atomic_alignment() {
1506            Ok(value) => {
1507                println!("CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT: {}", value)
1508            }
1509            Err(e) => println!(
1510                "OpenCL error, CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT: {:?}, {}",
1511                e, e
1512            ),
1513        };
1514
1515        // //////////////////////////////////////////////////////////////////////
1516        // // CL_VERSION_2_1 parameters
1517
1518        match device.il_version() {
1519            Ok(value) => {
1520                println!("CL_DEVICE_IL_VERSION: {:?}", value)
1521            }
1522            Err(e) => println!("OpenCL error, CL_DEVICE_IL_VERSION: {:?}, {}", e, e),
1523        };
1524
1525        match device.max_num_sub_groups() {
1526            Ok(value) => {
1527                println!("CL_DEVICE_MAX_NUM_SUB_GROUPS: {:?}", value)
1528            }
1529            Err(e) => println!("OpenCL error, CL_DEVICE_MAX_NUM_SUB_GROUPS: {:?}, {}", e, e),
1530        };
1531
1532        match device.sub_group_independent_forward_progress() {
1533            Ok(value) => {
1534                println!(
1535                    "CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS: {:?}",
1536                    value
1537                )
1538            }
1539            Err(e) => println!(
1540                "OpenCL error, CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS:{:?}, {}",
1541                e, e
1542            ),
1543        };
1544
1545        //////////////////////////////////////////////////////////////////////
1546        // CL_VERSION_3_0 parameters
1547
1548        match device.numeric_version() {
1549            Ok(value) => {
1550                println!("CL_DEVICE_NUMERIC_VERSION: {:X}", value)
1551            }
1552            Err(e) => println!("OpenCL error, CL_DEVICE_NUMERIC_VERSION: {:?}, {}", e, e),
1553        };
1554
1555        match device.extensions_with_version() {
1556            Ok(value) => {
1557                println!(
1558                    "CL_DEVICE_EXTENSIONS_WITH_VERSION: {}",
1559                    InfoType::VecNameVersion(value)
1560                )
1561            }
1562            Err(e) => println!(
1563                "OpenCL error, CL_DEVICE_EXTENSIONS_WITH_VERSION: {:?}, {}",
1564                e, e
1565            ),
1566        };
1567
1568        match device.ils_with_version() {
1569            Ok(value) => {
1570                println!(
1571                    "CL_DEVICE_ILS_WITH_VERSION: {}",
1572                    InfoType::VecNameVersion(value)
1573                )
1574            }
1575            Err(e) => println!("OpenCL error, CL_DEVICE_ILS_WITH_VERSION: {:?}, {}", e, e),
1576        };
1577
1578        match device.built_in_kernels_with_version() {
1579            Ok(value) => {
1580                println!(
1581                    "CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION: {}",
1582                    InfoType::VecNameVersion(value)
1583                )
1584            }
1585            Err(e) => println!(
1586                "OpenCL error, CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION: {:?}, {}",
1587                e, e
1588            ),
1589        };
1590
1591        match device.atomic_memory_capabilities() {
1592            Ok(value) => {
1593                println!("CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES: {:X}", value)
1594            }
1595            Err(e) => println!(
1596                "OpenCL error, CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES: {:?}, {}",
1597                e, e
1598            ),
1599        };
1600
1601        match device.atomic_fence_capabilities() {
1602            Ok(value) => {
1603                println!("CL_DEVICE_ATOMIC_FENCE_CAPABILITIES: {:X}", value)
1604            }
1605            Err(e) => println!(
1606                "OpenCL error, CL_DEVICE_ATOMIC_FENCE_CAPABILITIES: {:?}, {}",
1607                e, e
1608            ),
1609        };
1610
1611        match device.non_uniform_work_group_support() {
1612            Ok(value) => {
1613                println!("CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT: {}", value)
1614            }
1615            Err(e) => println!(
1616                "OpenCL error, CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT: {:?}, {}",
1617                e, e
1618            ),
1619        };
1620
1621        match device.opencl_c_all_versions() {
1622            Ok(value) => {
1623                println!(
1624                    "CL_DEVICE_OPENCL_C_ALL_VERSIONS: {}",
1625                    InfoType::VecNameVersion(value)
1626                )
1627            }
1628            Err(e) => println!(
1629                "OpenCL error, CL_DEVICE_OPENCL_C_ALL_VERSIONS: {:?}, {}",
1630                e, e
1631            ),
1632        };
1633
1634        match device.preferred_work_group_size_multiple() {
1635            Ok(value) => {
1636                println!("CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE: {}", value)
1637            }
1638            Err(e) => println!(
1639                "OpenCL error, CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE: {:?}, {}",
1640                e, e
1641            ),
1642        };
1643
1644        match device.work_group_collective_functions_support() {
1645            Ok(value) => {
1646                println!(
1647                    "CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT: {}",
1648                    value
1649                )
1650            }
1651            Err(e) => println!(
1652                "OpenCL error, CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT: {:?}, {}",
1653                e, e
1654            ),
1655        };
1656
1657        match device.generic_address_space_support() {
1658            Ok(value) => {
1659                println!("CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT: {}", value)
1660            }
1661            Err(e) => println!(
1662                "OpenCL error, CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT: {:?}, {}",
1663                e, e
1664            ),
1665        };
1666
1667        match device.uuid_khr() {
1668            Ok(value) => {
1669                println!("CL_DEVICE_UUID_KHR: {}", InfoType::Uuid(value))
1670            }
1671            Err(e) => println!("OpenCL error, CL_DEVICE_UUID_KHR: {:?}, {}", e, e),
1672        };
1673
1674        match device.driver_uuid_khr() {
1675            Ok(value) => {
1676                println!("CL_DRIVER_UUID_KHR: {}", InfoType::Uuid(value))
1677            }
1678            Err(e) => println!("OpenCL error, CL_DRIVER_UUID_KHR: {:?}, {}", e, e),
1679        };
1680
1681        match device.luid_valid_khr() {
1682            Ok(value) => {
1683                println!("CL_DEVICE_LUID_VALID_KHR: {}", value)
1684            }
1685            Err(e) => println!("OpenCL error, CL_DEVICE_LUID_VALID_KHR: {:?}, {}", e, e),
1686        };
1687
1688        match device.luid_khr() {
1689            Ok(value) => {
1690                println!("CL_DEVICE_LUID_KHR: {}", InfoType::Luid(value))
1691            }
1692            Err(e) => println!("OpenCL error, CL_DEVICE_LUID_KHR: {:?}, {}", e, e),
1693        };
1694
1695        match device.node_mask_khr() {
1696            Ok(value) => {
1697                println!("CL_DEVICE_NODE_MASK_KHR: {}", value)
1698            }
1699            Err(e) => println!("OpenCL error, CL_DEVICE_NODE_MASK_KHR: {:?}, {}", e, e),
1700        };
1701
1702        match device.opencl_c_features() {
1703            Ok(value) => {
1704                println!(
1705                    "CL_DEVICE_OPENCL_C_FEATURES: {}",
1706                    InfoType::VecNameVersion(value)
1707                )
1708            }
1709            Err(e) => println!("OpenCL error, CL_DEVICE_OPENCL_C_FEATURES: {:?}, {}", e, e),
1710        };
1711
1712        match device.device_enqueue_capabilities() {
1713            Ok(value) => {
1714                println!("CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES: {:X}", value)
1715            }
1716            Err(e) => println!(
1717                "OpenCL error, CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES: {:?}, {}",
1718                e, e
1719            ),
1720        };
1721
1722        match device.pipe_support() {
1723            Ok(value) => {
1724                println!("CL_DEVICE_PIPE_SUPPORT: {}", value)
1725            }
1726            Err(e) => println!("OpenCL error, CL_DEVICE_PIPE_SUPPORT: {:?}, {}", e, e),
1727        };
1728
1729        match device.latest_conformance_version_passed() {
1730            Ok(value) => {
1731                println!("CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED: {:?}", value)
1732            }
1733            Err(e) => println!(
1734                "OpenCL error, CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED: {:?}, {}",
1735                e, e
1736            ),
1737        };
1738
1739        match device.integer_dot_product_capabilities_khr() {
1740            Ok(value) => {
1741                println!(
1742                    "CL_DEVICE_INTEGER_DOT_PRODUCT_CAPABILITIES_KHR: {:?}",
1743                    value
1744                )
1745            }
1746            Err(e) => println!(
1747                "OpenCL error, CL_DEVICE_INTEGER_DOT_PRODUCT_CAPABILITIES_KHR: {:?}, {}",
1748                e, e
1749            ),
1750        };
1751
1752        match device.integer_dot_product_acceleration_properties_8bit_khr() {
1753            Ok(value) => {
1754                println!(
1755                    "CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR: {:?}",
1756                    value
1757                )
1758            }
1759            Err(e) => println!(
1760                "OpenCL error, CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR: {:?}, {}",
1761                e, e
1762            ),
1763        };
1764
1765        match device.integer_dot_product_acceleration_properties_4x8bit_packed_khr() {
1766            Ok(value) => {
1767                println!(
1768                    "CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_4x8BIT_PACKED_KHR: {:?}",
1769                    value
1770                )
1771            }
1772            Err(e) => println!(
1773                "OpenCL error, CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_4x8BIT_PACKED_KHR: {:?}, {}",
1774                e, e
1775            ),
1776        };
1777
1778        match device.compute_capability_major_nv() {
1779            Ok(value) => {
1780                println!("CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV: {}", value)
1781            }
1782            Err(e) => println!(
1783                "OpenCL error, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV: {:?}, {}",
1784                e, e
1785            ),
1786        };
1787
1788        match device.compute_capability_minor_nv() {
1789            Ok(value) => {
1790                println!("CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV: {}", value)
1791            }
1792            Err(e) => println!(
1793                "OpenCL error, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV: {:?}, {}",
1794                e, e
1795            ),
1796        };
1797
1798        match device.registers_per_block_nv() {
1799            Ok(value) => {
1800                println!("CL_DEVICE_REGISTERS_PER_BLOCK_NV: {}", value)
1801            }
1802            Err(e) => println!(
1803                "OpenCL error, CL_DEVICE_REGISTERS_PER_BLOCK_NV: {:?}, {}",
1804                e, e
1805            ),
1806        };
1807
1808        match device.wrap_size_nv() {
1809            Ok(value) => {
1810                println!("CL_DEVICE_WARP_SIZE_NV: {}", value)
1811            }
1812            Err(e) => println!("OpenCL error, CL_DEVICE_WARP_SIZE_NV: {:?}, {}", e, e),
1813        };
1814
1815        match device.gpu_overlap_nv() {
1816            Ok(value) => {
1817                println!("CL_DEVICE_GPU_OVERLAP_NV: {}", value)
1818            }
1819            Err(e) => println!("OpenCL error, CL_DEVICE_GPU_OVERLAP_NV: {:?}, {}", e, e),
1820        };
1821
1822        match device.compute_kernel_exec_timeout_nv() {
1823            Ok(value) => {
1824                println!("CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV: {}", value)
1825            }
1826            Err(e) => println!(
1827                "OpenCL error, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV: {:?}, {}",
1828                e, e
1829            ),
1830        };
1831
1832        match device.integrated_memory_nv() {
1833            Ok(value) => {
1834                println!("CL_DEVICE_INTEGRATED_MEMORY_NV: {}", value)
1835            }
1836            Err(e) => println!(
1837                "OpenCL error, CL_DEVICE_INTEGRATED_MEMORY_NV: {:?}, {}",
1838                e, e
1839            ),
1840        };
1841
1842        match device.pci_bus_id_nv() {
1843            Ok(value) => {
1844                println!("CL_DEVICE_PCI_BUS_ID_NV: {}", value)
1845            }
1846            Err(e) => println!("OpenCL error, CL_DEVICE_PCI_BUS_ID_NV: {:?}, {}", e, e),
1847        };
1848
1849        match device.profiling_timer_offset_amd() {
1850            Ok(value) => {
1851                println!("CL_DEVICE_PROFILING_TIMER_OFFSET_AMD: {}", value)
1852            }
1853            Err(e) => println!(
1854                "OpenCL error, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD: {:?}, {}",
1855                e, e
1856            ),
1857        };
1858
1859        match device.topology_amd() {
1860            Ok(value) => {
1861                println!("CL_DEVICE_TOPOLOGY_AMD: {:?}", value)
1862            }
1863            Err(e) => println!("OpenCL error, CL_DEVICE_TOPOLOGY_AMD: {:?}, {}", e, e),
1864        };
1865
1866        match device.pci_bus_id_amd() {
1867            Ok(value) => {
1868                println!("pci_bus_id_amd: {}", value)
1869            }
1870            Err(e) => println!("OpenCL error, pci_bus_id_amd: {:?}, {}", e, e),
1871        };
1872
1873        match device.pcibusinfokhr_intel() {
1874            Ok(value) => {
1875                println!("CL_DEVICE_PCI_BUS_INFO_KHR: {:?}", value)
1876            }
1877            Err(e) => println!("OpenCL error, CL_DEVICE_PCI_BUS_INFO_KHR: {:?}, {}", e, e),
1878        };
1879
1880        match device.pci_bus_id_intel() {
1881            Ok(value) => {
1882                println!("pci_bus_id_intel: {}", value)
1883            }
1884            Err(e) => println!("OpenCL error, pci_bus_id_intel: {:?}, {}", e, e),
1885        };
1886
1887        match device.board_name_amd() {
1888            Ok(value) => {
1889                println!("CL_DEVICE_BOARD_NAME_AMD: {}", value)
1890            }
1891            Err(e) => println!("OpenCL error, CL_DEVICE_BOARD_NAME_AMD: {:?}, {}", e, e),
1892        };
1893
1894        match device.global_free_memory_amd() {
1895            Ok(value) => {
1896                println!("CL_DEVICE_GLOBAL_FREE_MEMORY_AMD: {}", value)
1897            }
1898            Err(e) => println!(
1899                "OpenCL error, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD: {:?}, {}",
1900                e, e
1901            ),
1902        };
1903
1904        match device.simd_per_compute_unit_amd() {
1905            Ok(value) => {
1906                println!("CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD: {}", value)
1907            }
1908            Err(e) => println!(
1909                "OpenCL error, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD: {:?}, {}",
1910                e, e
1911            ),
1912        };
1913
1914        match device.simd_width_amd() {
1915            Ok(value) => {
1916                println!("CL_DEVICE_SIMD_WIDTH_AMD: {}", value)
1917            }
1918            Err(e) => println!("OpenCL error, CL_DEVICE_SIMD_WIDTH_AMD: {:?}, {}", e, e),
1919        };
1920
1921        match device.simd_instruction_width_amd() {
1922            Ok(value) => {
1923                println!("CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD: {}", value)
1924            }
1925            Err(e) => println!(
1926                "OpenCL error, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD: {:?}, {}",
1927                e, e
1928            ),
1929        };
1930
1931        match device.wavefront_width_amd() {
1932            Ok(value) => {
1933                println!("CL_DEVICE_WAVEFRONT_WIDTH_AMD: {}", value)
1934            }
1935            Err(e) => println!(
1936                "OpenCL error, CL_DEVICE_WAVEFRONT_WIDTH_AMD: {:?}, {}",
1937                e, e
1938            ),
1939        };
1940
1941        match device.global_mem_channels_amd() {
1942            Ok(value) => {
1943                println!("CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD: {}", value)
1944            }
1945            Err(e) => println!(
1946                "OpenCL error, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD: {:?}, {}",
1947                e, e
1948            ),
1949        };
1950
1951        match device.global_mem_channel_banks_amd() {
1952            Ok(value) => {
1953                println!("CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD: {}", value)
1954            }
1955            Err(e) => println!(
1956                "OpenCL error, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD: {:?}, {}",
1957                e, e
1958            ),
1959        };
1960
1961        match device.global_mem_channel_bank_width_amd() {
1962            Ok(value) => {
1963                println!("CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD: {}", value)
1964            }
1965            Err(e) => println!(
1966                "OpenCL error, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD: {:?}, {}",
1967                e, e
1968            ),
1969        };
1970
1971        match device.local_mem_size_per_compute_unit_amd() {
1972            Ok(value) => {
1973                println!("CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD: {}", value)
1974            }
1975            Err(e) => println!(
1976                "OpenCL error, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD: {:?}, {}",
1977                e, e
1978            ),
1979        };
1980
1981        match device.local_mem_banks_amd() {
1982            Ok(value) => {
1983                println!("CL_DEVICE_LOCAL_MEM_BANKS_AMD: {}", value)
1984            }
1985            Err(e) => println!(
1986                "OpenCL error, CL_DEVICE_LOCAL_MEM_BANKS_AMD: {:?}, {}",
1987                e, e
1988            ),
1989        };
1990
1991        match device.thread_trace_supported_amd() {
1992            Ok(value) => {
1993                println!("CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD: {}", value)
1994            }
1995            Err(e) => println!(
1996                "OpenCL error, CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD: {:?}, {}",
1997                e, e
1998            ),
1999        };
2000
2001        match device.gfxip_major_amd() {
2002            Ok(value) => {
2003                println!("CL_DEVICE_GFXIP_MAJOR_AMD: {}", value)
2004            }
2005            Err(e) => println!("OpenCL error, CL_DEVICE_GFXIP_MAJOR_AMD: {:?}, {}", e, e),
2006        };
2007
2008        match device.gfxip_minor_amd() {
2009            Ok(value) => {
2010                println!("CL_DEVICE_GFXIP_MINOR_AMD: {}", value)
2011            }
2012            Err(e) => println!("OpenCL error, CL_DEVICE_GFXIP_MINOR_AMD: {:?}, {}", e, e),
2013        };
2014
2015        match device.available_async_queues_amd() {
2016            Ok(value) => {
2017                println!("CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD: {}", value)
2018            }
2019            Err(e) => println!(
2020                "OpenCL error, CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD: {:?}, {}",
2021                e, e
2022            ),
2023        };
2024
2025        match device.preferred_work_group_size_amd() {
2026            Ok(value) => {
2027                println!("CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD: {}", value)
2028            }
2029            Err(e) => println!(
2030                "OpenCL error, CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD: {:?}, {}",
2031                e, e
2032            ),
2033        };
2034
2035        match device.max_work_group_size_amd() {
2036            Ok(value) => {
2037                println!("CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD: {}", value)
2038            }
2039            Err(e) => println!(
2040                "OpenCL error, CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD: {:?}, {}",
2041                e, e
2042            ),
2043        };
2044
2045        match device.preferred_constant_buffer_size_amd() {
2046            Ok(value) => {
2047                println!("CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD: {}", value)
2048            }
2049            Err(e) => println!(
2050                "OpenCL error, CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD: {:?}, {}",
2051                e, e
2052            ),
2053        };
2054
2055        match device.pcie_id_amd() {
2056            Ok(value) => {
2057                println!("CL_DEVICE_PCIE_ID_AMD: {}", value)
2058            }
2059            Err(e) => println!("OpenCL error, CL_DEVICE_PCIE_ID_AMD: {:?}, {}", e, e),
2060        };
2061
2062        match device.device_ip_version_intel() {
2063            Ok(value) => {
2064                println!("CL_DEVICE_IP_VERSION_INTEL: {}", value)
2065            }
2066            Err(e) => println!("OpenCL error, CL_DEVICE_IP_VERSION_INTEL: {:?}, {}", e, e),
2067        };
2068
2069        match device.device_id_intel() {
2070            Ok(value) => {
2071                println!("CL_DEVICE_ID_INTEL: {}", value)
2072            }
2073            Err(e) => println!("OpenCL error, CL_DEVICE_ID_INTEL: {:?}, {}", e, e),
2074        };
2075
2076        match device.device_num_slices_intel() {
2077            Ok(value) => {
2078                println!("CL_DEVICE_NUM_SLICES_INTEL: {}", value)
2079            }
2080            Err(e) => println!("OpenCL error, CL_DEVICE_NUM_SLICES_INTEL: {:?}, {}", e, e),
2081        };
2082
2083        match device.device_num_sub_slices_per_slice_intel() {
2084            Ok(value) => {
2085                println!("CL_DEVICE_NUM_SUB_SLICES_PER_SLICE_INTEL: {}", value)
2086            }
2087            Err(e) => println!(
2088                "OpenCL error, CL_DEVICE_NUM_SUB_SLICES_PER_SLICE_INTEL: {:?}, {}",
2089                e, e
2090            ),
2091        };
2092
2093        match device.device_num_eus_per_sub_slice_intel() {
2094            Ok(value) => {
2095                println!("CL_DEVICE_NUM_EUS_PER_SUB_SLICE_INTEL: {}", value)
2096            }
2097            Err(e) => println!(
2098                "OpenCL error, CL_DEVICE_NUM_EUS_PER_SUB_SLICE_INTEL: {:?}, {}",
2099                e, e
2100            ),
2101        };
2102
2103        match device.device_num_threads_per_eu_intel() {
2104            Ok(value) => {
2105                println!("CL_DEVICE_NUM_THREADS_PER_EU_INTEL: {}", value)
2106            }
2107            Err(e) => println!(
2108                "OpenCL error, CL_DEVICE_NUM_THREADS_PER_EU_INTEL: {:?}, {}",
2109                e, e
2110            ),
2111        };
2112
2113        match device.device_feature_capabilities_intel() {
2114            Ok(value) => {
2115                println!("CL_DEVICE_FEATURE_CAPABILITIES_INTEL: {:?}", value)
2116            }
2117            Err(e) => println!(
2118                "OpenCL error, CL_DEVICE_FEATURE_CAPABILITIES_INTEL: {:?}, {}",
2119                e, e
2120            ),
2121        };
2122
2123        match device.device_external_memory_import_handle_types_khr() {
2124            Ok(value) => {
2125                println!(
2126                    "CL_DEVICE_EXTERNAL_MEMORY_IMPORT_HANDLE_TYPES_KHR: {:?}",
2127                    value
2128                )
2129            }
2130            Err(e) => println!(
2131                "OpenCL error, CL_DEVICE_EXTERNAL_MEMORY_IMPORT_HANDLE_TYPES_KHR: {:?}, {}",
2132                e, e
2133            ),
2134        };
2135
2136        match device.device_semaphore_import_handle_types_khr() {
2137            Ok(value) => {
2138                println!("CL_DEVICE_SEMAPHORE_IMPORT_HANDLE_TYPES_KHR: {:?}", value)
2139            }
2140            Err(e) => println!(
2141                "OpenCL error, CL_DEVICE_SEMAPHORE_IMPORT_HANDLE_TYPES_KHR: {:?}, {}",
2142                e, e
2143            ),
2144        };
2145
2146        match device.device_semaphore_export_handle_types_khr() {
2147            Ok(value) => {
2148                println!("CL_DEVICE_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR: {:?}", value)
2149            }
2150            Err(e) => println!(
2151                "OpenCL error, CL_DEVICE_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR: {:?}, {}",
2152                e, e
2153            ),
2154        };
2155
2156        match device.device_semaphore_types_khr() {
2157            Ok(value) => {
2158                println!("CL_DEVICE_SEMAPHORE_TYPES_KHR: {:?}", value)
2159            }
2160            Err(e) => println!(
2161                "OpenCL error, CL_DEVICE_SEMAPHORE_TYPES_KHR: {:?}, {}",
2162                e, e
2163            ),
2164        };
2165
2166        match device.device_command_buffer_capabilities_khr() {
2167            Ok(value) => {
2168                println!("CL_DEVICE_COMMAND_BUFFER_CAPABILITIES_KHR: {:?}", value)
2169            }
2170            Err(e) => println!(
2171                "OpenCL error, CL_DEVICE_COMMAND_BUFFER_CAPABILITIES_KHR: {:?}, {}",
2172                e, e
2173            ),
2174        };
2175
2176        match device.device_command_buffer_required_queue_properties_khr() {
2177            Ok(value) => {
2178                println!(
2179                    "CL_DEVICE_COMMAND_BUFFER_REQUIRED_QUEUE_PROPERTIES_KHR: {:?}",
2180                    value
2181                )
2182            }
2183            Err(e) => println!(
2184                "OpenCL error, CL_DEVICE_COMMAND_BUFFER_REQUIRED_QUEUE_PROPERTIES_KHR: {:?}, {}",
2185                e, e
2186            ),
2187        };
2188    }
2189
2190    #[test]
2191    fn test_public_re_export() {
2192        assert_eq!(
2193            opencl3::device::CL_UUID_SIZE_KHR,
2194            16,
2195            "Constant is accessible"
2196        );
2197    }
2198}