Skip to content

Commit 1d5edf0

Browse files
committed
addition of num_compute_units query for device info
1 parent 897861e commit 1d5edf0

File tree

7 files changed

+50
-0
lines changed

7 files changed

+50
-0
lines changed

include/ur_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1719,6 +1719,7 @@ typedef enum ur_device_info_t {
17191719
UR_DEVICE_INFO_LOW_POWER_EVENTS_EXP = 0x2021, ///< [::ur_bool_t] returns true if the device supports low-power events.
17201720
UR_DEVICE_INFO_2D_BLOCK_ARRAY_CAPABILITIES_EXP = 0x2022, ///< [::ur_exp_device_2d_block_array_capability_flags_t] return a bit-field
17211721
///< of Intel GPU 2D block array capabilities
1722+
UR_DEVICE_INFO_NUM_COMPUTE_UNITS = 0x2023, ///< [uint32_t] the number of compute units for specific backend
17221723
/// @cond
17231724
UR_DEVICE_INFO_FORCE_UINT32 = 0x7fffffff
17241725
/// @endcond

include/ur_print.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2291,6 +2291,9 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_device_info_t value) {
22912291
case UR_DEVICE_INFO_MAX_COMPUTE_UNITS:
22922292
os << "UR_DEVICE_INFO_MAX_COMPUTE_UNITS";
22932293
break;
2294+
case UR_DEVICE_INFO_NUM_COMPUTE_UNITS:
2295+
os << "UR_DEVICE_INFO_NUM_COMPUTE_UNITS";
2296+
break;
22942297
case UR_DEVICE_INFO_MAX_WORK_ITEM_DIMENSIONS:
22952298
os << "UR_DEVICE_INFO_MAX_WORK_ITEM_DIMENSIONS";
22962299
break;
@@ -2802,6 +2805,18 @@ inline ur_result_t printTagged(std::ostream &os, const void *ptr, ur_device_info
28022805

28032806
os << ")";
28042807
} break;
2808+
case UR_DEVICE_INFO_NUM_COMPUTE_UNITS: {
2809+
const uint32_t *tptr = (const uint32_t *)ptr;
2810+
if (sizeof(uint32_t) > size) {
2811+
os << "invalid size (is: " << size << ", expected: >=" << sizeof(uint32_t) << ")";
2812+
return UR_RESULT_ERROR_INVALID_SIZE;
2813+
}
2814+
os << (const void *)(tptr) << " (";
2815+
2816+
os << *tptr;
2817+
2818+
os << ")";
2819+
} break;
28052820
case UR_DEVICE_INFO_MAX_WORK_ITEM_DIMENSIONS: {
28062821
const uint32_t *tptr = (const uint32_t *)ptr;
28072822
if (sizeof(uint32_t) > size) {

source/adapters/cuda/device.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice,
5656
case UR_DEVICE_INFO_VENDOR_ID: {
5757
return ReturnValue(4318u);
5858
}
59+
case UR_DEVICE_INFO_NUM_COMPUTE_UNITS:
5960
case UR_DEVICE_INFO_MAX_COMPUTE_UNITS: {
6061
return ReturnValue(hDevice->getNumComputeUnits());
6162
}

source/adapters/hip/device.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice,
5757
#endif
5858
return ReturnValue(VendorId);
5959
}
60+
case UR_DEVICE_INFO_NUM_COMPUTE_UNITS:
6061
case UR_DEVICE_INFO_MAX_COMPUTE_UNITS: {
6162
int ComputeUnits = 0;
6263
UR_CHECK_ERROR(hipDeviceGetAttribute(

source/adapters/level_zero/device.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,12 @@ ur_result_t urDeviceGetInfo(
322322

323323
return ReturnValue(uint32_t{MaxComputeUnits});
324324
}
325+
case UR_DEVICE_INFO_NUM_COMPUTE_UNITS:{
326+
uint32_t NumComputeUnits =
327+
Device->ZeDeviceProperties->numSubslicesPerSlice *
328+
Device->ZeDeviceProperties->numSlices;
329+
return ReturnValue(uint32_t{NumComputeUnits});
330+
}
325331
case UR_DEVICE_INFO_MAX_WORK_ITEM_DIMENSIONS:
326332
// Level Zero spec defines only three dimensions
327333
return ReturnValue(uint32_t{3});

source/adapters/native_cpu/device.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice,
164164
return ReturnValue(bool{true});
165165
case UR_DEVICE_INFO_LINKER_AVAILABLE:
166166
return ReturnValue(bool{true});
167+
case UR_DEVICE_INFO_NUM_COMPUTE_UNITS:
167168
case UR_DEVICE_INFO_MAX_COMPUTE_UNITS:
168169
return ReturnValue(static_cast<uint32_t>(hDevice->tp.num_threads()));
169170
case UR_DEVICE_INFO_PARTITION_MAX_SUB_DEVICES:

source/adapters/opencl/device.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)