[UR] Implement IPC physical_mem API in UR#22115
Open
ldorau wants to merge 3 commits into
Open
Conversation
slawekptak
reviewed
May 26, 2026
70701a0 to
523e104
Compare
Contributor
Author
|
Rebased |
523e104 to
4cbcfa8
Compare
Contributor
Author
|
The Offload CI job fails because of #22125 |
a9eb70a to
6dac91d
Compare
Contributor
Author
|
Rebased |
29aee2c to
4a61124
Compare
6113038 to
572be16
Compare
kswiecicki
reviewed
May 28, 2026
| ur_physical_mem_handle_t hPhysMem, | ||
| void **ppIPCPhysMemHandleData, | ||
| size_t *pIPCPhysMemHandleDataSizeRet) { | ||
| #ifdef __linux__ |
Contributor
There was a problem hiding this comment.
Are L0 driver IPC calls specific to Linux?
Contributor
Author
There was a problem hiding this comment.
No, currently only implementation for Linux is needed. A Windows one will differ.
| void **ppIPCPhysMemHandleData, | ||
| size_t *pIPCPhysMemHandleDataSizeRet) { | ||
| #ifdef __linux__ | ||
| if (!hContext) |
Contributor
There was a problem hiding this comment.
Majority of those checks should probably be done on the validation layer side.
572be16 to
37d96d9
Compare
Add four new function specs to exp-inter-process-communication.yml and update registry.yml to support IPC operations on physical memory objects: - urIPCGetPhysMemHandleExp: export an IPC handle for a physical_mem - urIPCPutPhysMemHandleExp: release the exported IPC handle - urIPCOpenPhysMemHandleExp: import an IPC handle into a physical_mem - urIPCClosePhysMemHandleExp: close the imported physical_mem Also add ENABLE_IPC flag to ur_physical_mem_flags_t in virtual_memory.yml to allow allocating physical memory that can be shared via IPC handles. Add a new enumerator to ur_physical_mem_info_t that allows querying the virtual address established by zeMemOpenIpcHandle when a physical memory handle is opened via urIPCOpenPhysMemHandleExp. Returns nullptr for non-IPC handles. Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
Add auto-generated files based on the IPC physical_mem spec changes (urIPCGetPhysMemHandleExp, urIPCPutPhysMemHandleExp, urIPCOpenPhysMemHandleExp, urIPCClosePhysMemHandleExp, UR_PHYSICAL_MEM_FLAG_ENABLE_IPC, UR_DEVICE_INFO_IPC_PHYSICAL_MEMORY_SUPPORT_EXP): - ur_api.h, ur_api_funcs.def, ur_ddi.h: function declarations - ur_print.h/hpp, ur_print.cpp: printing support - ur_api.cpp: API dispatch stubs - ur_ldrddi.cpp, ur_libapi.cpp: loader implementations - ur_trcddi.cpp, ur_valddi.cpp: tracing and validation layers - ur_mockddi.cpp: mock adapter - loader.def.in, loader.map.in: loader symbol exports - level_zero ur_interface_loader.cpp/.hpp: Level-Zero DDI table entries - urinfo.hpp: updated urinfo tool Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
75afc3f to
3c08b2b
Compare
Implement urIPCGetPhysMemHandleExp, urIPCPutPhysMemHandleExp,
urIPCOpenPhysMemHandleExp, and urIPCClosePhysMemHandleExp across all
adapters.
Level Zero adapter (full implementation, Linux only):
- physical_mem.hpp: extend ur_physical_mem_handle_t_ with Device, Size,
EnableIpc, and IpcVirtualAddress fields; replace the old pid+fd-based
ZeIPCPhysMemHandleData with {ze_ipc_mem_handle_t IpcHandle; size_t Size}
(72-byte self-contained struct; IPC functions are guarded by #ifdef __linux__)
- physical_mem.cpp: implement the four IPC functions matching the approach
from the Level Zero CTS (commit 2d0d1218 in level-zero.tests):
* urIPCGetPhysMemHandleExp (producer): calls zeMemGetIpcHandleWithProperties
passing ze_physical_mem_handle_t cast to (const void*) directly — no prior
virtual mapping required; uses ze_ipc_mem_handle_type_ext_desc_t with
ZE_STRUCTURE_TYPE_IPC_MEM_HANDLE_TYPE_EXT_DESC and
ZE_IPC_MEM_HANDLE_TYPE_FLAG_DEFAULT to request a local same-machine IPC
handle; detects drivers that return an fd-based handle instead of an opaque
blob (via fcntl(F_GETFD) on the first 4 bytes) and returns
UR_RESULT_ERROR_UNSUPPORTED_FEATURE so callers skip gracefully; also maps
ZE_RESULT_ERROR_INVALID_ARGUMENT / ZE_RESULT_ERROR_UNSUPPORTED_FEATURE from
the driver to UR_RESULT_ERROR_UNSUPPORTED_FEATURE for graceful skip on
older drivers that do not support physical-mem IPC at all
* urIPCOpenPhysMemHandleExp (consumer): calls zeMemOpenIpcHandle with
ZE_IPC_MEMORY_FLAG_BIAS_UNCACHED, matching the CTS consumer side; stores
the returned virtual address in IpcVirtualAddress (ZePhysicalMem is null
on the consumer side)
* urIPCPutPhysMemHandleExp: calls zeMemPutIpcHandle
* urIPCClosePhysMemHandleExp: delegates to urPhysicalMemRelease, which calls
zeMemCloseIpcHandle for IPC-opened handles (IpcVirtualAddress != nullptr)
and zePhysicalMemDestroy for regular handles
- virtual_mem.cpp: urVirtualMemMap is a no-op for IPC-opened handles since
zeMemOpenIpcHandle already establishes the virtual mapping
- device.cpp: report UR_DEVICE_INFO_IPC_PHYSICAL_MEMORY_SUPPORT_EXP
as true on Linux, false on Windows
Other adapters (CUDA, HIP, OpenCL, Native CPU, Offload):
- Return UR_RESULT_ERROR_UNSUPPORTED_FEATURE from all four functions
- Register function pointers in ur_interface_loader.cpp
- Report UR_DEVICE_INFO_IPC_PHYSICAL_MEMORY_SUPPORT_EXP as false
Conformance tests:
- Add urIPCGetPhysMemHandleExp.cpp, urIPCPutPhysMemHandleExp.cpp,
urIPCOpenPhysMemHandleExp.cpp, urIPCClosePhysMemHandleExp.cpp
- Add urIPCPhysMemHandleExpFixtures.hpp with urIPCPhysMemTest,
urIPCPhysMemHandleTest, urIPCOpenedPhysMemTest fixtures
- Tests skip when UR_DEVICE_INFO_IPC_PHYSICAL_MEMORY_SUPPORT_EXP is false
or when urIPCGetPhysMemHandleExp returns UR_RESULT_ERROR_UNSUPPORTED_FEATURE
at runtime (e.g. on drivers that return fd-based handles)
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
Contributor
Author
|
@nrspruit please review 2 files: |
Contributor
Author
|
The Offload CI job fails because of #22125 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implement
urIPCGetPhysMemHandleExp,urIPCPutPhysMemHandleExp,urIPCOpenPhysMemHandleExp, andurIPCClosePhysMemHandleExpacross alladapters.
Level Zero adapter (full implementation, Linux only)
ur_physical_mem_handle_t_withDevice,Size,EnableIpc,and
IpcVirtualAddressfields;ZeIPCPhysMemHandleDataholds aze_ipc_mem_handle_t+ size (self-contained 64-byte opaque blob).zeMemGetIpcHandleWithPropertieswithze_ipc_mem_handle_type_ext_desc_t/ZE_IPC_MEM_HANDLE_TYPE_FLAG_DEFAULT,passing the
ze_physical_mem_handle_tcast toconst void*(spec-definedbehavior). Older drivers may return
ZE_RESULT_ERROR_INVALID_ARGUMENTinstead of
ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; both are mapped toUR_RESULT_ERROR_UNSUPPORTED_FEATURE.zeMemOpenIpcHandlewhich establishes the virtual mappingdirectly; the pointer is stored in
IpcVirtualAddress.urVirtualMemMapis a no-op for IPC-opened handles.UR_DEVICE_INFO_IPC_PHYSICAL_MEMORY_SUPPORT_EXPastrueonLinux,
falseon Windows.Other adapters (CUDA, HIP, OpenCL, Native CPU, Offload)
UR_RESULT_ERROR_UNSUPPORTED_FEATUREfrom all four functions.UR_DEVICE_INFO_IPC_PHYSICAL_MEMORY_SUPPORT_EXPasfalse.Conformance tests
UR_RESULT_ERROR_UNSUPPORTED_FEATUREfromurIPCGetPhysMemHandleExp).