From 6e690242cbbc5dc48b7b07b6896bac834eca2203 Mon Sep 17 00:00:00 2001 From: Rafal Bielski Date: Tue, 19 Aug 2025 15:23:27 +0100 Subject: [PATCH 1/2] [UR][Offload] Implement more device info properties The liboffload olGetDeviceInfo functionality was extended with additional properties in https://github.com/llvm/llvm-project/pull/152533. Implement retrieving these properties in the UR Offload adapter. Also map all the error codes that may be returned by olGetDeviceInfo to the corresponding UR error codes. --- .../source/adapters/offload/device.cpp | 158 +++++++++++------- .../source/adapters/offload/ur2offload.hpp | 8 + 2 files changed, 109 insertions(+), 57 deletions(-) diff --git a/unified-runtime/source/adapters/offload/device.cpp b/unified-runtime/source/adapters/offload/device.cpp index 1c026de27936b..849d4dc8f3360 100644 --- a/unified-runtime/source/adapters/offload/device.cpp +++ b/unified-runtime/source/adapters/offload/device.cpp @@ -62,12 +62,71 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, case UR_DEVICE_INFO_VENDOR: olInfo = OL_DEVICE_INFO_VENDOR; break; + case UR_DEVICE_INFO_VENDOR_ID: + olInfo = OL_DEVICE_INFO_VENDOR_ID; + break; case UR_DEVICE_INFO_DRIVER_VERSION: olInfo = OL_DEVICE_INFO_DRIVER_VERSION; break; case UR_DEVICE_INFO_PLATFORM: return ReturnValue(hDevice->Platform); break; + case UR_DEVICE_INFO_MAX_COMPUTE_UNITS: + case UR_DEVICE_INFO_NUM_COMPUTE_UNITS: + olInfo = OL_DEVICE_INFO_NUM_COMPUTE_UNITS; + break; + case UR_DEVICE_INFO_SINGLE_FP_CONFIG: + olInfo = OL_DEVICE_INFO_SINGLE_FP_CONFIG; + break; + case UR_DEVICE_INFO_HALF_FP_CONFIG: + olInfo = OL_DEVICE_INFO_HALF_FP_CONFIG; + break; + case UR_DEVICE_INFO_DOUBLE_FP_CONFIG: + olInfo = OL_DEVICE_INFO_DOUBLE_FP_CONFIG; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE; + break; + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_HALF: + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF: + olInfo = OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF; + break; + case UR_DEVICE_INFO_MAX_CLOCK_FREQUENCY: + olInfo = OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY; + break; + case UR_DEVICE_INFO_MEMORY_CLOCK_RATE: + olInfo = OL_DEVICE_INFO_MEMORY_CLOCK_RATE; + break; + case UR_DEVICE_INFO_ADDRESS_BITS: + olInfo = OL_DEVICE_INFO_ADDRESS_BITS; + break; + case UR_DEVICE_INFO_MAX_MEM_ALLOC_SIZE: + olInfo = OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE; + break; + case UR_DEVICE_INFO_GLOBAL_MEM_SIZE: + olInfo = OL_DEVICE_INFO_GLOBAL_MEM_SIZE; + break; case UR_DEVICE_INFO_USM_DEVICE_SUPPORT: case UR_DEVICE_INFO_USM_HOST_SUPPORT: case UR_DEVICE_INFO_USM_SINGLE_SHARED_SUPPORT: @@ -164,51 +223,6 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, } return UR_RESULT_SUCCESS; } - case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE: { - return ReturnValue(1u); - } - case UR_DEVICE_INFO_SINGLE_FP_CONFIG: - case UR_DEVICE_INFO_DOUBLE_FP_CONFIG: { - // This minimal set of flags will at least signal to sycl that we support - // the basic FP types. - ur_device_fp_capability_flags_t SupportedFlags = - UR_DEVICE_FP_CAPABILITY_FLAG_INF_NAN | - UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST; - return ReturnValue(SupportedFlags); - } case UR_DEVICE_INFO_AVAILABLE: { return ReturnValue(ur_bool_t{true}); } @@ -229,21 +243,51 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, if (pPropValue) { OL_RETURN_ON_ERR( olGetDeviceInfo(hDevice->OffloadDevice, olInfo, propSize, pPropValue)); - // Need to explicitly map this type - if (olInfo == OL_DEVICE_INFO_TYPE) { - auto urPropPtr = reinterpret_cast(pPropValue); - auto olPropPtr = reinterpret_cast(pPropValue); - - switch (*olPropPtr) { - case OL_DEVICE_TYPE_CPU: - *urPropPtr = UR_DEVICE_TYPE_CPU; - break; - case OL_DEVICE_TYPE_GPU: - *urPropPtr = UR_DEVICE_TYPE_GPU; + + // Need to explicitly map these types + switch (olInfo) { + case OL_DEVICE_INFO_TYPE: { + auto *urPropPtr = reinterpret_cast(pPropValue); + auto *olPropPtr = reinterpret_cast(pPropValue); + + switch (*olPropPtr) { + case OL_DEVICE_TYPE_CPU: + *urPropPtr = UR_DEVICE_TYPE_CPU; + break; + case OL_DEVICE_TYPE_GPU: + *urPropPtr = UR_DEVICE_TYPE_GPU; + break; + default: + break; + } break; + } + case OL_DEVICE_INFO_SINGLE_FP_CONFIG: + case OL_DEVICE_INFO_HALF_FP_CONFIG: + case OL_DEVICE_INFO_DOUBLE_FP_CONFIG: { + auto olValue = *reinterpret_cast(pPropValue); + ur_device_fp_capability_flags_t urValue{0}; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_INF_NAN; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_DENORM) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_DENORM; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_FMA) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_FMA; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_SOFT_FLOAT) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_SOFT_FLOAT; + auto *urPropPtr = reinterpret_cast(pPropValue); + *urPropPtr = urValue; + } default: break; - } } } diff --git a/unified-runtime/source/adapters/offload/ur2offload.hpp b/unified-runtime/source/adapters/offload/ur2offload.hpp index 201b6e3b5670e..dd13f2cf0de6e 100644 --- a/unified-runtime/source/adapters/offload/ur2offload.hpp +++ b/unified-runtime/source/adapters/offload/ur2offload.hpp @@ -24,6 +24,14 @@ inline ur_result_t offloadResultToUR(ol_result_t Result) { return UR_RESULT_ERROR_INVALID_NULL_POINTER; case OL_ERRC_UNSUPPORTED: return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION; + case OL_ERRC_INVALID_ENUMERATION: + return UR_RESULT_ERROR_INVALID_ENUMERATION; + case OL_ERRC_INVALID_SIZE: + return UR_RESULT_ERROR_INVALID_SIZE; + case OL_ERRC_UNINITIALIZED: + return UR_RESULT_ERROR_UNINITIALIZED; + case OL_ERRC_INVALID_DEVICE: + return UR_RESULT_ERROR_INVALID_DEVICE; case OL_ERRC_INVALID_BINARY: return UR_RESULT_ERROR_INVALID_BINARY; // Returned whenever a kernel can't be found From 49042703c542f6eadc6fc670311523b69950b33f Mon Sep 17 00:00:00 2001 From: Rafal Bielski Date: Tue, 19 Aug 2025 17:12:40 +0100 Subject: [PATCH 2/2] [UR][Offload] Remove UNINITIALIZED error mapping; clang-format --- .../source/adapters/offload/device.cpp | 80 ++++++++++--------- .../source/adapters/offload/ur2offload.hpp | 2 - 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/unified-runtime/source/adapters/offload/device.cpp b/unified-runtime/source/adapters/offload/device.cpp index 849d4dc8f3360..c9bb6df9224a0 100644 --- a/unified-runtime/source/adapters/offload/device.cpp +++ b/unified-runtime/source/adapters/offload/device.cpp @@ -246,48 +246,50 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, // Need to explicitly map these types switch (olInfo) { - case OL_DEVICE_INFO_TYPE: { - auto *urPropPtr = reinterpret_cast(pPropValue); - auto *olPropPtr = reinterpret_cast(pPropValue); - - switch (*olPropPtr) { - case OL_DEVICE_TYPE_CPU: - *urPropPtr = UR_DEVICE_TYPE_CPU; - break; - case OL_DEVICE_TYPE_GPU: - *urPropPtr = UR_DEVICE_TYPE_GPU; - break; - default: - break; - } + case OL_DEVICE_INFO_TYPE: { + auto *urPropPtr = reinterpret_cast(pPropValue); + auto *olPropPtr = reinterpret_cast(pPropValue); + + switch (*olPropPtr) { + case OL_DEVICE_TYPE_CPU: + *urPropPtr = UR_DEVICE_TYPE_CPU; + break; + case OL_DEVICE_TYPE_GPU: + *urPropPtr = UR_DEVICE_TYPE_GPU; break; - } - case OL_DEVICE_INFO_SINGLE_FP_CONFIG: - case OL_DEVICE_INFO_HALF_FP_CONFIG: - case OL_DEVICE_INFO_DOUBLE_FP_CONFIG: { - auto olValue = *reinterpret_cast(pPropValue); - ur_device_fp_capability_flags_t urValue{0}; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_INF_NAN; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_DENORM) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_DENORM; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_FMA) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_FMA; - if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_SOFT_FLOAT) - urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_SOFT_FLOAT; - auto *urPropPtr = reinterpret_cast(pPropValue); - *urPropPtr = urValue; - } default: break; + } + break; + } + case OL_DEVICE_INFO_SINGLE_FP_CONFIG: + case OL_DEVICE_INFO_HALF_FP_CONFIG: + case OL_DEVICE_INFO_DOUBLE_FP_CONFIG: { + auto olValue = + *reinterpret_cast(pPropValue); + ur_device_fp_capability_flags_t urValue{0}; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_INF_NAN; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_DENORM) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_DENORM; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_FMA) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_FMA; + if (olValue & OL_DEVICE_FP_CAPABILITY_FLAG_SOFT_FLOAT) + urValue |= UR_DEVICE_FP_CAPABILITY_FLAG_SOFT_FLOAT; + auto *urPropPtr = + reinterpret_cast(pPropValue); + *urPropPtr = urValue; + } + default: + break; } } diff --git a/unified-runtime/source/adapters/offload/ur2offload.hpp b/unified-runtime/source/adapters/offload/ur2offload.hpp index dd13f2cf0de6e..c11fea3c75443 100644 --- a/unified-runtime/source/adapters/offload/ur2offload.hpp +++ b/unified-runtime/source/adapters/offload/ur2offload.hpp @@ -28,8 +28,6 @@ inline ur_result_t offloadResultToUR(ol_result_t Result) { return UR_RESULT_ERROR_INVALID_ENUMERATION; case OL_ERRC_INVALID_SIZE: return UR_RESULT_ERROR_INVALID_SIZE; - case OL_ERRC_UNINITIALIZED: - return UR_RESULT_ERROR_UNINITIALIZED; case OL_ERRC_INVALID_DEVICE: return UR_RESULT_ERROR_INVALID_DEVICE; case OL_ERRC_INVALID_BINARY: