From 9b9bb307b69d1dac3a937c1f688d849f413ca815 Mon Sep 17 00:00:00 2001 From: Igor Chorazewicz Date: Tue, 17 Dec 2024 01:28:50 +0000 Subject: [PATCH 1/2] [SYCL][UR][L0 v2] make umf error handling less verbose --- .../source/adapters/level_zero/v2/usm.cpp | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/unified-runtime/source/adapters/level_zero/v2/usm.cpp b/unified-runtime/source/adapters/level_zero/v2/usm.cpp index e1df35cc29ace..29e98e070271b 100644 --- a/unified-runtime/source/adapters/level_zero/v2/usm.cpp +++ b/unified-runtime/source/adapters/level_zero/v2/usm.cpp @@ -17,6 +17,12 @@ #include +static inline void UMF_CALL_THROWS(umf_result_t res) { + if (res != UMF_RESULT_SUCCESS) { + throw res; + } +} + namespace umf { ur_result_t getProviderNativeError(const char *providerName, int32_t nativeError) { @@ -99,35 +105,21 @@ descToDisjoinPoolMemType(const usm::pool_descriptor &desc) { static umf::provider_unique_handle_t makeProvider(usm::pool_descriptor poolDescriptor) { umf_level_zero_memory_provider_params_handle_t hParams; - umf_result_t umf_ret = umfLevelZeroMemoryProviderParamsCreate(&hParams); - if (umf_ret != UMF_RESULT_SUCCESS) { - throw umf::umf2urResult(umf_ret); - } - + UMF_CALL_THROWS(umfLevelZeroMemoryProviderParamsCreate(&hParams)); std::unique_ptr params(hParams, &umfLevelZeroMemoryProviderParamsDestroy); - umf_ret = umfLevelZeroMemoryProviderParamsSetContext( - hParams, poolDescriptor.hContext->getZeHandle()); - if (umf_ret != UMF_RESULT_SUCCESS) { - throw umf::umf2urResult(umf_ret); - }; + UMF_CALL_THROWS(umfLevelZeroMemoryProviderParamsSetContext( + hParams, poolDescriptor.hContext->getZeHandle())); ze_device_handle_t level_zero_device_handle = poolDescriptor.hDevice ? poolDescriptor.hDevice->ZeDevice : nullptr; - umf_ret = umfLevelZeroMemoryProviderParamsSetDevice(hParams, - level_zero_device_handle); - if (umf_ret != UMF_RESULT_SUCCESS) { - throw umf::umf2urResult(umf_ret); - } - - umf_ret = umfLevelZeroMemoryProviderParamsSetMemoryType( - hParams, urToUmfMemoryType(poolDescriptor.type)); - if (umf_ret != UMF_RESULT_SUCCESS) { - throw umf::umf2urResult(umf_ret); - } + UMF_CALL_THROWS(umfLevelZeroMemoryProviderParamsSetDevice( + hParams, level_zero_device_handle)); + UMF_CALL_THROWS(umfLevelZeroMemoryProviderParamsSetMemoryType( + hParams, urToUmfMemoryType(poolDescriptor.type))); std::vector residentZeHandles; @@ -140,11 +132,8 @@ makeProvider(usm::pool_descriptor poolDescriptor) { residentZeHandles.push_back(device->ZeDevice); } - umf_ret = umfLevelZeroMemoryProviderParamsSetResidentDevices( - hParams, residentZeHandles.data(), residentZeHandles.size()); - if (umf_ret != UMF_RESULT_SUCCESS) { - throw umf::umf2urResult(umf_ret); - } + UMF_CALL_THROWS(umfLevelZeroMemoryProviderParamsSetResidentDevices( + hParams, residentZeHandles.data(), residentZeHandles.size())); } auto [ret, provider] = From e251dc98f343879adfd25da644b51dec6b47160d Mon Sep 17 00:00:00 2001 From: Igor Chorazewicz Date: Fri, 28 Feb 2025 00:08:53 +0000 Subject: [PATCH 2/2] [SYCL][UR][L0 v2] use blocking free when returning memory to the driver This patch fixes undefined behavior when freeing memory that might still be in use. Using regular zeMemFree (as was done before this change) is unsafe. L0 spec says that for zeMemFree, the application must ensure the device is not referencing memory before it is freed. SYCL sets 'indirect access' flag for every kernel. This means that each kernel can potentially access any memory and hence it is unsafe to free any memory allocation during kernel execution (if that kernel was submitted at some point in time when that allocation was alive). This replaces the 'indirect access tracking' mechanism used in the legacy adapter (see https://github.com/intel/llvm/blob/4c9b19bdd8b4b95b865522d583b6252bda301d98/unified-runtime/source/adapters/level_zero/context.hpp#L153) Related clarification in the SYCL spec: https://github.com/KhronosGroup/SYCL-Docs/pull/758 --- unified-runtime/source/adapters/level_zero/v2/usm.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unified-runtime/source/adapters/level_zero/v2/usm.cpp b/unified-runtime/source/adapters/level_zero/v2/usm.cpp index 29e98e070271b..1a2ca4e73e37d 100644 --- a/unified-runtime/source/adapters/level_zero/v2/usm.cpp +++ b/unified-runtime/source/adapters/level_zero/v2/usm.cpp @@ -136,6 +136,9 @@ makeProvider(usm::pool_descriptor poolDescriptor) { hParams, residentZeHandles.data(), residentZeHandles.size())); } + UMF_CALL_THROWS(umfLevelZeroMemoryProviderParamsSetFreePolicy( + hParams, UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_BLOCKING_FREE)); + auto [ret, provider] = umf::providerMakeUniqueFromOps(umfLevelZeroMemoryProviderOps(), hParams); if (ret != UMF_RESULT_SUCCESS) {