From b3f36b96aa79885f503f2c8b75bb98f3d936c44b Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Thu, 20 Jun 2024 15:09:01 -0700 Subject: [PATCH] [L0] Fix Handle used in calls to L0 Driver exp apis given multi drivers Signed-off-by: Neil R. Spruit --- source/adapters/level_zero/adapter.cpp | 3 +++ source/adapters/level_zero/adapter.hpp | 1 + source/adapters/level_zero/command_buffer.cpp | 22 +++++++++++++------ source/adapters/level_zero/command_buffer.hpp | 4 ++++ source/adapters/level_zero/image.cpp | 11 ++++++++-- source/adapters/level_zero/memory.cpp | 6 +++-- source/adapters/level_zero/platform.hpp | 4 ++++ source/adapters/level_zero/ur_level_zero.hpp | 1 + source/adapters/level_zero/usm.cpp | 6 +++-- 9 files changed, 45 insertions(+), 13 deletions(-) diff --git a/source/adapters/level_zero/adapter.cpp b/source/adapters/level_zero/adapter.cpp index 0605b9a40c..10f97a81c5 100644 --- a/source/adapters/level_zero/adapter.cpp +++ b/source/adapters/level_zero/adapter.cpp @@ -49,6 +49,9 @@ ur_result_t initPlatforms(PlatformVec &platforms) noexcept try { for (uint32_t I = 0; I < ZeDriverCount; ++I) { auto platform = std::make_unique(ZeDrivers[I]); UR_CALL(platform->initialize()); + ZE2UR_CALL(zelLoaderTranslateHandle, + (ZEL_HANDLE_DRIVER, platform->ZeDriver, + (void **)&platform->ZeDriverHandleExpTranslated)); // Save a copy in the cache for future uses. platforms.push_back(std::move(platform)); diff --git a/source/adapters/level_zero/adapter.hpp b/source/adapters/level_zero/adapter.hpp index 36eedb0f9d..273cdb4193 100644 --- a/source/adapters/level_zero/adapter.hpp +++ b/source/adapters/level_zero/adapter.hpp @@ -11,6 +11,7 @@ #include "logger/ur_logger.hpp" #include +#include #include #include #include diff --git a/source/adapters/level_zero/command_buffer.cpp b/source/adapters/level_zero/command_buffer.cpp index 642173d675..d88e00d8e4 100644 --- a/source/adapters/level_zero/command_buffer.cpp +++ b/source/adapters/level_zero/command_buffer.cpp @@ -56,12 +56,14 @@ bool PreferCopyEngineForFill = [] { ur_exp_command_buffer_handle_t_::ur_exp_command_buffer_handle_t_( ur_context_handle_t Context, ur_device_handle_t Device, ze_command_list_handle_t CommandList, + ze_command_list_handle_t CommandListTranslated, ze_command_list_handle_t CommandListResetEvents, ze_command_list_handle_t CopyCommandList, ZeStruct ZeDesc, ZeStruct ZeCopyDesc, const ur_exp_command_buffer_desc_t *Desc, const bool IsInOrderCmdList) : Context(Context), Device(Device), ZeComputeCommandList(CommandList), + ZeComputeCommandListTranslated(CommandListTranslated), ZeCommandListResetEvents(CommandListResetEvents), ZeCommandListDesc(ZeDesc), ZeCopyCommandList(CopyCommandList), ZeCopyCommandListDesc(ZeCopyDesc), ZeFencesMap(), ZeActiveFence(nullptr), @@ -605,11 +607,16 @@ urCommandBufferCreateExp(ur_context_handle_t Context, ur_device_handle_t Device, &ZeCopyCommandList)); } + ze_command_list_handle_t ZeComputeCommandListTranslated = nullptr; + ZE2UR_CALL(zelLoaderTranslateHandle, + (ZEL_HANDLE_COMMAND_LIST, ZeComputeCommandList, + (void **)&ZeComputeCommandListTranslated)); + try { *CommandBuffer = new ur_exp_command_buffer_handle_t_( - Context, Device, ZeComputeCommandList, ZeCommandListResetEvents, - ZeCopyCommandList, ZeCommandListDesc, ZeCopyCommandListDesc, - CommandBufferDesc, IsInOrder); + Context, Device, ZeComputeCommandList, ZeComputeCommandListTranslated, + ZeCommandListResetEvents, ZeCopyCommandList, ZeCommandListDesc, + ZeCopyCommandListDesc, CommandBufferDesc, IsInOrder); } catch (const std::bad_alloc &) { return UR_RESULT_ERROR_OUT_OF_HOST_MEMORY; } catch (...) { @@ -791,8 +798,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendKernelLaunchExp( UR_ASSERT(Plt->ZeMutableCmdListExt.Supported, UR_RESULT_ERROR_UNSUPPORTED_FEATURE); ZE2UR_CALL(Plt->ZeMutableCmdListExt.zexCommandListGetNextCommandIdExp, - (CommandBuffer->ZeComputeCommandList, &ZeMutableCommandDesc, - &CommandId)); + (CommandBuffer->ZeComputeCommandListTranslated, + &ZeMutableCommandDesc, &CommandId)); DEBUG_LOG(CommandId); } try { @@ -1619,8 +1626,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferUpdateKernelLaunchExp( auto Plt = CommandBuffer->Context->getPlatform(); UR_ASSERT(Plt->ZeMutableCmdListExt.Supported, UR_RESULT_ERROR_UNSUPPORTED_FEATURE); - ZE2UR_CALL(Plt->ZeMutableCmdListExt.zexCommandListUpdateMutableCommandsExp, - (CommandBuffer->ZeComputeCommandList, &MutableCommandDesc)); + ZE2UR_CALL( + Plt->ZeMutableCmdListExt.zexCommandListUpdateMutableCommandsExp, + (CommandBuffer->ZeComputeCommandListTranslated, &MutableCommandDesc)); ZE2UR_CALL(zeCommandListClose, (CommandBuffer->ZeComputeCommandList)); return UR_RESULT_SUCCESS; diff --git a/source/adapters/level_zero/command_buffer.hpp b/source/adapters/level_zero/command_buffer.hpp index 48f1c68330..649c4f7880 100644 --- a/source/adapters/level_zero/command_buffer.hpp +++ b/source/adapters/level_zero/command_buffer.hpp @@ -28,6 +28,7 @@ struct ur_exp_command_buffer_handle_t_ : public _ur_object { ur_exp_command_buffer_handle_t_( ur_context_handle_t Context, ur_device_handle_t Device, ze_command_list_handle_t CommandList, + ze_command_list_handle_t CommandListTranslated, ze_command_list_handle_t CommandListResetEvents, ze_command_list_handle_t CopyCommandList, ZeStruct ZeDesc, @@ -55,6 +56,9 @@ struct ur_exp_command_buffer_handle_t_ : public _ur_object { ur_device_handle_t Device; // Level Zero command list handle ze_command_list_handle_t ZeComputeCommandList; + // Given a multi driver scenario, the driver handle must be translated to the + // internal driver handle to allow calls to driver experimental apis. + ze_command_list_handle_t ZeComputeCommandListTranslated; // Level Zero command list handle ze_command_list_handle_t ZeCommandListResetEvents; // Level Zero command list descriptor diff --git a/source/adapters/level_zero/image.cpp b/source/adapters/level_zero/image.cpp index 524ed879f3..e37b00a33e 100644 --- a/source/adapters/level_zero/image.cpp +++ b/source/adapters/level_zero/image.cpp @@ -488,7 +488,11 @@ ur_result_t bindlessImagesCreateImpl(ur_context_handle_t hContext, return UR_RESULT_ERROR_INVALID_OPERATION; uint64_t DeviceOffset{}; - ZE2UR_CALL(zeImageGetDeviceOffsetExpFunctionPtr, (ZeImage, &DeviceOffset)); + ze_image_handle_t ZeImageTranslated; + ZE2UR_CALL(zelLoaderTranslateHandle, + (ZEL_HANDLE_IMAGE, ZeImage, (void **)&ZeImageTranslated)); + ZE2UR_CALL(zeImageGetDeviceOffsetExpFunctionPtr, + (ZeImageTranslated, &DeviceOffset)); *phImage = reinterpret_cast(DeviceOffset); return UR_RESULT_SUCCESS; @@ -652,8 +656,11 @@ UR_APIEXPORT ur_result_t UR_APICALL urUSMPitchedAllocExp( size_t Width = widthInBytes / elementSizeBytes; size_t RowPitch; + ze_device_handle_t ZeDeviceTranslated; + ZE2UR_CALL(zelLoaderTranslateHandle, (ZEL_HANDLE_DEVICE, hDevice->ZeDevice, + (void **)&ZeDeviceTranslated)); ZE2UR_CALL(zeMemGetPitchFor2dImageFunctionPtr, - (hContext->ZeContext, hDevice->ZeDevice, Width, height, + (hContext->ZeContext, ZeDeviceTranslated, Width, height, elementSizeBytes, &RowPitch)); *pResultPitch = RowPitch; diff --git a/source/adapters/level_zero/memory.cpp b/source/adapters/level_zero/memory.cpp index 44f8a0090f..24b9c53afb 100644 --- a/source/adapters/level_zero/memory.cpp +++ b/source/adapters/level_zero/memory.cpp @@ -1668,7 +1668,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemBufferCreate( // If not shared of any type, we can import the ptr if (ZeMemoryAllocationProperties.type == ZE_MEMORY_TYPE_UNKNOWN) { // Promote the host ptr to USM host memory - ze_driver_handle_t driverHandle = Context->getPlatform()->ZeDriver; + ze_driver_handle_t driverHandle = + Context->getPlatform()->ZeDriverHandleExpTranslated; ZeUSMImport.doZeUSMImport(driverHandle, Host, Size); HostPtrImported = true; } @@ -2252,7 +2253,8 @@ ur_result_t _ur_buffer::free() { UR_CALL(ZeMemFreeHelper(UrContext, ZeHandle)); break; case allocation_t::unimport: - ZeUSMImport.doZeUSMRelease(UrContext->getPlatform()->ZeDriver, ZeHandle); + ZeUSMImport.doZeUSMRelease( + UrContext->getPlatform()->ZeDriverHandleExpTranslated, ZeHandle); break; default: die("_ur_buffer::free(): Unhandled release action"); diff --git a/source/adapters/level_zero/platform.hpp b/source/adapters/level_zero/platform.hpp index fa9bc6b735..daff5a6390 100644 --- a/source/adapters/level_zero/platform.hpp +++ b/source/adapters/level_zero/platform.hpp @@ -24,6 +24,10 @@ struct ur_platform_handle_t_ : public _ur_platform { // a pretty good fit to keep here. ze_driver_handle_t ZeDriver; + // Given a multi driver scenario, the driver handle must be translated to the + // internal driver handle to allow calls to driver experimental apis. + ze_driver_handle_t ZeDriverHandleExpTranslated; + // Cache versions info from zeDriverGetProperties. std::string ZeDriverVersion; std::string ZeDriverApiVersion; diff --git a/source/adapters/level_zero/ur_level_zero.hpp b/source/adapters/level_zero/ur_level_zero.hpp index 2b41db2d4b..096ae076f9 100644 --- a/source/adapters/level_zero/ur_level_zero.hpp +++ b/source/adapters/level_zero/ur_level_zero.hpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include diff --git a/source/adapters/level_zero/usm.cpp b/source/adapters/level_zero/usm.cpp index 19d31bcb9b..eb47a89a3f 100644 --- a/source/adapters/level_zero/usm.cpp +++ b/source/adapters/level_zero/usm.cpp @@ -1026,7 +1026,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urUSMImportExp(ur_context_handle_t Context, // If not shared of any type, we can import the ptr if (ZeMemoryAllocationProperties.type == ZE_MEMORY_TYPE_UNKNOWN) { // Promote the host ptr to USM host memory - ze_driver_handle_t driverHandle = Context->getPlatform()->ZeDriver; + ze_driver_handle_t driverHandle = + Context->getPlatform()->ZeDriverHandleExpTranslated; ZeUSMImport.doZeUSMImport(driverHandle, HostPtr, Size); } } @@ -1039,6 +1040,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urUSMReleaseExp(ur_context_handle_t Context, // Release the imported memory. if (ZeUSMImport.Supported && HostPtr != nullptr) - ZeUSMImport.doZeUSMRelease(Context->getPlatform()->ZeDriver, HostPtr); + ZeUSMImport.doZeUSMRelease( + Context->getPlatform()->ZeDriverHandleExpTranslated, HostPtr); return UR_RESULT_SUCCESS; }