1pub 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
26pub 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 pub const fn id(&self) -> cl_device_id {
79 self.id
80 }
81}
82
83#[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 pub const fn id(&self) -> cl_device_id {
116 self.id as cl_device_id
117 }
118
119 #[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 pub fn dev_type(&self) -> Result<cl_device_type> {
153 Ok(get_device_info(self.id(), CL_DEVICE_TYPE)?.into())
154 }
155
156 pub fn vendor_id(&self) -> Result<cl_uint> {
159 Ok(get_device_info(self.id(), CL_DEVICE_VENDOR_ID)?.into())
160 }
161
162 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 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 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 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 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 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 pub fn built_in_kernels(&self) -> Result<String> {
419 Ok(get_device_info(self.id(), CL_DEVICE_BUILT_IN_KERNELS)?.into())
420 }
421
422 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 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 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 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 pub fn partition_properties(&self) -> Result<Vec<intptr_t>> {
444 Ok(get_device_info(self.id(), CL_DEVICE_PARTITION_PROPERTIES)?.into())
445 }
446
447 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 pub fn partition_type(&self) -> Result<Vec<intptr_t>> {
454 Ok(get_device_info(self.id(), CL_DEVICE_PARTITION_TYPE)?.into())
455 }
456
457 pub fn reference_count(&self) -> Result<cl_uint> {
459 Ok(get_device_info(self.id(), CL_DEVICE_REFERENCE_COUNT)?.into())
460 }
461
462 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 pub fn il_version(&self) -> Result<String> {
562 Ok(get_device_info(self.id(), CL_DEVICE_IL_VERSION)?.into())
563 }
564
565 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 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 pub fn numeric_version(&self) -> Result<cl_uint> {
580 Ok(get_device_info(self.id(), CL_DEVICE_NUMERIC_VERSION)?.into())
581 }
582
583 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}