@@ -827,6 +827,31 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice,
827827 case UR_DEVICE_INFO_VIRTUAL_MEMORY_SUPPORT: {
828828 return ReturnValue (false );
829829 }
830+ case UR_DEVICE_INFO_NUM_COMPUTE_UNITS:{
831+
832+ bool ExtensionSupported = false ;
833+ UR_RETURN_ON_FAILURE (cl_adapter::checkDeviceExtensions (
834+ cl_adapter::cast<cl_device_id>(hDevice),
835+ {" cl_intel_device_attribute_query" }, ExtensionSupported));
836+
837+ cl_device_type CLType;
838+ CL_RETURN_ON_FAILURE (
839+ clGetDeviceInfo (cl_adapter::cast<cl_device_id>(hDevice), CL_DEVICE_TYPE,
840+ sizeof (cl_device_type), &CLType, nullptr ));
841+
842+ cl_uint NumComputeUnits;
843+ if (ExtensionSupported && (CLType & CL_DEVICE_TYPE_GPU)) {
844+ cl_uint SliceCount = 0 ;
845+ cl_uint SubSlicePerSliceCount =0 ;
846+ CL_RETURN_ON_FAILURE (clGetDeviceInfo (cl_adapter::cast<cl_device_id>(hDevice), CL_DEVICE_NUM_SLICES_INTEL, sizeof (cl_uint), &SliceCount, nullptr ));
847+ CL_RETURN_ON_FAILURE (clGetDeviceInfo (cl_adapter::cast<cl_device_id>(hDevice), CL_DEVICE_NUM_SUB_SLICES_PER_SLICE_INTEL, sizeof (cl_uint), &SubSlicePerSliceCount, nullptr ));
848+ NumComputeUnits = SliceCount*SubSlicePerSliceCount;
849+ }else {
850+ CL_RETURN_ON_FAILURE (clGetDeviceInfo (cl_adapter::cast<cl_device_id>(hDevice), CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (cl_uint), &NumComputeUnits, nullptr ));
851+ }
852+
853+ return ReturnValue (static_cast <size_t >(NumComputeUnits));
854+ }
830855 case UR_DEVICE_INFO_TIMESTAMP_RECORDING_SUPPORT_EXP: {
831856 return ReturnValue (false );
832857 }
0 commit comments