/*
* Copyright © 2012 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
* Author: Benjamin Segovia
*/
#ifndef __CL_DEVICE_ID_H__
#define __CL_DEVICE_ID_H__
#define EXTENSTION_LENGTH 512
#include "cl_base_object.h"
/* Store complete information about the device */
struct _cl_device_id {
_cl_base_object base;
cl_device_type device_type;
cl_uint device_id;
cl_uint vendor_id;
cl_uint max_compute_unit; // maximum EU number
cl_uint max_thread_per_unit; // maximum EU threads per EU.
cl_uint sub_slice_count; // Device's sub slice count
cl_uint max_work_item_dimensions; // should be 3.
size_t max_work_item_sizes[3]; // equal to maximum work group size.
size_t max_work_group_size; // maximum work group size under simd16 mode.
size_t max_1d_global_work_sizes[3]; // maximum 1d global work size for builtin kernels.
size_t max_2d_global_work_sizes[3]; // maximum 2d global work size for builtin kernels.
size_t max_3d_global_work_sizes[3]; // maximum 3d global work size for builtin kernels.
cl_uint preferred_vector_width_char;
cl_uint preferred_vector_width_short;
cl_uint preferred_vector_width_int;
cl_uint preferred_vector_width_long;
cl_uint preferred_vector_width_float;
cl_uint preferred_vector_width_double;
cl_uint preferred_vector_width_half;
cl_uint native_vector_width_char;
cl_uint native_vector_width_short;
cl_uint native_vector_width_int;
cl_uint native_vector_width_long;
cl_uint native_vector_width_float;
cl_uint native_vector_width_double;
cl_uint native_vector_width_half;
cl_uint max_clock_frequency;
cl_uint address_bits;
cl_ulong max_mem_alloc_size;
cl_device_svm_capabilities svm_capabilities;
cl_uint preferred_platform_atomic_alignment;
cl_uint preferred_global_atomic_alignment;
cl_uint preferred_local_atomic_alignment;
cl_bool image_support;
cl_uint max_read_image_args;
cl_uint max_write_image_args;
cl_uint max_read_write_image_args;
size_t image2d_max_width;
size_t image_max_array_size;
size_t image2d_max_height;
size_t image3d_max_width;
size_t image3d_max_height;
size_t image3d_max_depth;
size_t image_mem_size;
cl_uint max_samplers;
size_t max_parameter_size;
cl_uint mem_base_addr_align;
cl_uint min_data_type_align_size;
cl_uint max_pipe_args;
cl_uint pipe_max_active_reservations;
cl_uint pipe_max_packet_siz;
cl_device_fp_config single_fp_config;
cl_device_fp_config half_fp_config;
cl_device_fp_config double_fp_config;
cl_device_mem_cache_type global_mem_cache_type;
cl_uint global_mem_cache_line_size;
cl_ulong global_mem_cache_size;
cl_ulong global_mem_size;
cl_ulong max_constant_buffer_size;
cl_uint max_constant_args;
size_t max_global_variable_size;
size_t global_variable_preferred_total_size;
cl_device_local_mem_type local_mem_type;
cl_ulong local_mem_size;
cl_ulong scratch_mem_size;
cl_bool error_correction_support;
cl_bool host_unified_memory;
size_t profiling_timer_resolution;
cl_bool endian_little;
cl_bool available;
cl_bool compiler_available;
cl_bool linker_available;
cl_device_exec_capabilities execution_capabilities;
cl_command_queue_properties queue_properties;
cl_command_queue_properties queue_on_host_properties;
cl_command_queue_properties queue_on_device_properties;
cl_uint queue_on_device_preferred_size;
cl_uint queue_on_device_max_size;
cl_uint max_on_device_queues;
cl_uint max_on_device_events;
cl_platform_id platform;
size_t printf_buffer_size;
cl_bool interop_user_sync;
const char *name;
const char *vendor;
const char *version;
const char *profile;
const char *opencl_c_version;
const char extensions[EXTENSTION_LENGTH];
const char *driver_version;
const char *spir_versions;
const char *built_in_kernels;
size_t name_sz;
size_t vendor_sz;
size_t version_sz;
size_t profile_sz;
size_t opencl_c_version_sz;
size_t extensions_sz;
size_t driver_version_sz;
size_t spir_versions_sz;
size_t built_in_kernels_sz;
/* SubDevice specific info */
cl_device_id parent_device;
cl_uint partition_max_sub_device;
cl_device_partition_property partition_property[3];
cl_device_affinity_domain affinity_domain;
cl_device_partition_property partition_type[3];
uint32_t atomic_test_result;
cl_uint image_pitch_alignment;
cl_uint image_base_address_alignment;
size_t sub_group_sizes[2];
size_t sub_group_sizes_sz;
//inited as NULL, created only when cmrt kernel is used
void* cmrt_device; //realtype: CmDevice*
};
#define CL_OBJECT_DEVICE_MAGIC 0x2acaddcca8853c52LL
#define CL_OBJECT_IS_DEVICE(obj) ((obj && \
((cl_base_object)obj)->magic == CL_OBJECT_DEVICE_MAGIC && \
CL_OBJECT_GET_REF(obj) >= 1))
/* Get a device from the given platform */
extern cl_int cl_get_device_ids(cl_platform_id platform,
cl_device_type device_type,
cl_uint num_entries,
cl_device_id * devices,
cl_uint * num_devices);
/* Get the intel GPU device we currently have in this machine (if any) */
extern cl_device_id cl_get_gt_device(cl_device_type device_type);
/* Provide info about the device */
extern cl_int cl_get_device_info(cl_device_id device,
cl_device_info param_name,
size_t param_value_size,
void * param_value,
size_t * param_value_size_ret);
extern cl_int cl_get_kernel_workgroup_info(cl_kernel kernel,
cl_device_id device,
cl_kernel_work_group_info param_name,
size_t param_value_size,
void * param_value,
size_t * param_value_size_ret);
extern cl_int cl_get_kernel_subgroup_info(cl_kernel kernel,
cl_device_id device,
cl_kernel_work_group_info param_name,
size_t input_value_size,
const void * input_value,
size_t param_value_size,
void * param_value,
size_t * param_value_size_ret);
/* Returns the Gen device ID */
extern cl_int cl_device_get_version(cl_device_id device, cl_int *ver);
extern size_t cl_get_kernel_max_wg_sz(cl_kernel);
extern cl_int cl_devices_list_check(cl_uint num_devices, const cl_device_id *devices);
extern cl_int cl_devices_list_include_check(cl_uint num_devices, const cl_device_id *devices,
cl_uint num_to_check, const cl_device_id *devices_to_check);
#endif /* __CL_DEVICE_ID_H__ */