Skip to content

Commit 579299b

Browse files
authored
[UR][Offload] Implement memory buffer get/create native handle (#20210)
Buffers are implemented under the hood using USM pointers, so return USM pointers as the appropriate "native handle". With the info queries from liboffload, we can recreate equivalent buffer objects from arbitrary USM pointers.
1 parent a31aa2c commit 579299b

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

unified-runtime/source/adapters/offload/memory.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemRelease(ur_mem_handle_t hMem) {
8080
// Subbuffers should not free their parents
8181
if (!BufferImpl->Parent) {
8282
// TODO: Handle registered host memory
83-
OL_RETURN_ON_ERR(olMemFree(BufferImpl->Ptr));
83+
if (hMem->IsNativeHandleOwned) {
84+
OL_RETURN_ON_ERR(olMemFree(BufferImpl->Ptr));
85+
}
8486
} else {
8587
return urMemRelease(BufferImpl->Parent);
8688
}
@@ -143,6 +145,50 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemBufferPartition(
143145
return urMemRetain(hBuffer);
144146
}
145147

148+
// Liboffload has no equivalent to buffers. Buffers are implemented as USM
149+
UR_APIEXPORT ur_result_t UR_APICALL urMemGetNativeHandle(
150+
ur_mem_handle_t hMem, ur_device_handle_t, ur_native_handle_t *phNativeMem) {
151+
*phNativeMem = reinterpret_cast<ur_native_handle_t>(hMem->AsBufferMem()->Ptr);
152+
return UR_RESULT_SUCCESS;
153+
}
154+
155+
UR_APIEXPORT ur_result_t UR_APICALL urMemBufferCreateWithNativeHandle(
156+
ur_native_handle_t hNativeMem, ur_context_handle_t hContext,
157+
const ur_mem_native_properties_t *pProperties, ur_mem_handle_t *phMem) {
158+
void *Ptr = reinterpret_cast<void *>(hNativeMem);
159+
ol_device_handle_t Device;
160+
OL_RETURN_ON_ERR(
161+
olGetMemInfo(Ptr, OL_MEM_INFO_DEVICE, sizeof(Device), &Device));
162+
void *Base;
163+
OL_RETURN_ON_ERR(olGetMemInfo(Ptr, OL_MEM_INFO_BASE, sizeof(Base), &Base));
164+
165+
// Check that this pointer is valid
166+
if (Base != Ptr || Device != hContext->Device->OffloadDevice) {
167+
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
168+
}
169+
170+
size_t Size;
171+
OL_RETURN_ON_ERR(olGetMemInfo(Ptr, OL_MEM_INFO_SIZE, sizeof(Size), &Size));
172+
173+
ol_alloc_type_t Type;
174+
OL_RETURN_ON_ERR(olGetMemInfo(Ptr, OL_MEM_INFO_TYPE, sizeof(Type), &Type));
175+
176+
*phMem = new ur_mem_handle_t_{/*Context=*/hContext,
177+
/*Parent=*/nullptr,
178+
/*MemFlags=*/UR_MEM_FLAG_READ_WRITE,
179+
/*Mode=*/
180+
(Type == OL_ALLOC_TYPE_HOST
181+
? BufferMem::AllocMode::AllocHostPtr
182+
: BufferMem::AllocMode::Default),
183+
/*Ptr=*/Ptr,
184+
/*HostPtr=*/nullptr,
185+
/*Size=*/Size};
186+
(*phMem)->IsNativeHandleOwned =
187+
pProperties ? pProperties->isNativeHandleOwned : false;
188+
189+
return UR_RESULT_SUCCESS;
190+
}
191+
146192
UR_APIEXPORT ur_result_t UR_APICALL
147193
urMemImageCreate(ur_context_handle_t, ur_mem_flags_t, const ur_image_format_t *,
148194
const ur_image_desc_t *, void *, ur_mem_handle_t *) {

unified-runtime/source/adapters/offload/memory.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
struct BufferMem {
1818
enum class AllocMode {
1919
Default,
20-
UseHostPtr,
2120
CopyIn,
2221
AllocHostPtr,
2322
};
@@ -93,6 +92,7 @@ struct ur_mem_handle_t_ : RefCounted {
9392
ur_context_handle_t Context;
9493

9594
ur_mem_flags_t MemFlags;
95+
bool IsNativeHandleOwned;
9696

9797
// For now we only support BufferMem. Eventually we'll support images, so use
9898
// a variant to store the underlying object.
@@ -101,7 +101,7 @@ struct ur_mem_handle_t_ : RefCounted {
101101
ur_mem_handle_t_(ur_context_handle_t Context, ur_mem_handle_t Parent,
102102
ur_mem_flags_t MemFlags, BufferMem::AllocMode Mode,
103103
void *Ptr, void *HostPtr, size_t Size)
104-
: Context{Context}, MemFlags{MemFlags},
104+
: Context{Context}, MemFlags{MemFlags}, IsNativeHandleOwned(true),
105105
Mem{BufferMem{Parent, Mode, Ptr, HostPtr, Size}} {
106106
urContextRetain(Context);
107107
};

unified-runtime/source/adapters/offload/ur_interface_loader.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,11 @@ urGetMemProcAddrTable(ur_api_version_t version, ur_mem_dditable_t *pDdiTable) {
151151
}
152152
pDdiTable->pfnBufferCreate = urMemBufferCreate;
153153
pDdiTable->pfnBufferPartition = urMemBufferPartition;
154-
pDdiTable->pfnBufferCreateWithNativeHandle = nullptr;
154+
pDdiTable->pfnBufferCreateWithNativeHandle =
155+
urMemBufferCreateWithNativeHandle;
155156
pDdiTable->pfnImageCreateWithNativeHandle = urMemImageCreateWithNativeHandle;
156157
pDdiTable->pfnGetInfo = urMemGetInfo;
157-
pDdiTable->pfnGetNativeHandle = nullptr;
158+
pDdiTable->pfnGetNativeHandle = urMemGetNativeHandle;
158159
pDdiTable->pfnImageCreate = urMemImageCreate;
159160
pDdiTable->pfnImageGetInfo = urMemImageGetInfo;
160161
pDdiTable->pfnRelease = urMemRelease;

0 commit comments

Comments
 (0)