Skip to content

Commit c5d2175

Browse files
Merge pull request #1882 from przemektmalon/przemek/interop-map-memory
[Bindless][Exp] Add interop memory mapping to USM.
2 parents 99489ad + c86beb6 commit c5d2175

25 files changed

+520
-0
lines changed

include/ur_api.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ typedef enum ur_function_t {
227227
UR_FUNCTION_ENQUEUE_NATIVE_COMMAND_EXP = 228, ///< Enumerator for ::urEnqueueNativeCommandExp
228228
UR_FUNCTION_LOADER_CONFIG_SET_MOCKING_ENABLED = 229, ///< Enumerator for ::urLoaderConfigSetMockingEnabled
229229
UR_FUNCTION_BINDLESS_IMAGES_RELEASE_EXTERNAL_MEMORY_EXP = 230, ///< Enumerator for ::urBindlessImagesReleaseExternalMemoryExp
230+
UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP = 231, ///< Enumerator for ::urBindlessImagesMapExternalLinearMemoryExp
230231
/// @cond
231232
UR_FUNCTION_FORCE_UINT32 = 0x7fffffff
232233
/// @endcond
@@ -7962,6 +7963,36 @@ urBindlessImagesMapExternalArrayExp(
79627963
ur_exp_image_mem_native_handle_t *phImageMem ///< [out] image memory handle to the externally allocated memory
79637964
);
79647965

7966+
///////////////////////////////////////////////////////////////////////////////
7967+
/// @brief Map an external memory handle to a device memory region described by
7968+
/// void*
7969+
///
7970+
/// @returns
7971+
/// - ::UR_RESULT_SUCCESS
7972+
/// - ::UR_RESULT_ERROR_UNINITIALIZED
7973+
/// - ::UR_RESULT_ERROR_DEVICE_LOST
7974+
/// - ::UR_RESULT_ERROR_ADAPTER_SPECIFIC
7975+
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
7976+
/// + `NULL == hContext`
7977+
/// + `NULL == hDevice`
7978+
/// + `NULL == hExternalMem`
7979+
/// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER
7980+
/// + `NULL == ppRetMem`
7981+
/// - ::UR_RESULT_ERROR_INVALID_CONTEXT
7982+
/// - ::UR_RESULT_ERROR_INVALID_VALUE
7983+
/// - ::UR_RESULT_ERROR_INVALID_IMAGE_SIZE
7984+
/// - ::UR_RESULT_ERROR_INVALID_OPERATION
7985+
/// - ::UR_RESULT_ERROR_OUT_OF_RESOURCES
7986+
UR_APIEXPORT ur_result_t UR_APICALL
7987+
urBindlessImagesMapExternalLinearMemoryExp(
7988+
ur_context_handle_t hContext, ///< [in] handle of the context object
7989+
ur_device_handle_t hDevice, ///< [in] handle of the device object
7990+
uint64_t offset, ///< [in] offset into memory region to map
7991+
uint64_t size, ///< [in] size of memory region to map
7992+
ur_exp_external_mem_handle_t hExternalMem, ///< [in] external memory handle to the external memory
7993+
void **ppRetMem ///< [out] pointer of the externally allocated memory
7994+
);
7995+
79657996
///////////////////////////////////////////////////////////////////////////////
79667997
/// @brief Release external memory
79677998
///
@@ -11231,6 +11262,19 @@ typedef struct ur_bindless_images_map_external_array_exp_params_t {
1123111262
ur_exp_image_mem_native_handle_t **pphImageMem;
1123211263
} ur_bindless_images_map_external_array_exp_params_t;
1123311264

11265+
///////////////////////////////////////////////////////////////////////////////
11266+
/// @brief Function parameters for urBindlessImagesMapExternalLinearMemoryExp
11267+
/// @details Each entry is a pointer to the parameter passed to the function;
11268+
/// allowing the callback the ability to modify the parameter's value
11269+
typedef struct ur_bindless_images_map_external_linear_memory_exp_params_t {
11270+
ur_context_handle_t *phContext;
11271+
ur_device_handle_t *phDevice;
11272+
uint64_t *poffset;
11273+
uint64_t *psize;
11274+
ur_exp_external_mem_handle_t *phExternalMem;
11275+
void ***pppRetMem;
11276+
} ur_bindless_images_map_external_linear_memory_exp_params_t;
11277+
1123411278
///////////////////////////////////////////////////////////////////////////////
1123511279
/// @brief Function parameters for urBindlessImagesReleaseExternalMemoryExp
1123611280
/// @details Each entry is a pointer to the parameter passed to the function;

include/ur_ddi.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,6 +1639,16 @@ typedef ur_result_t(UR_APICALL *ur_pfnBindlessImagesMapExternalArrayExp_t)(
16391639
ur_exp_external_mem_handle_t,
16401640
ur_exp_image_mem_native_handle_t *);
16411641

1642+
///////////////////////////////////////////////////////////////////////////////
1643+
/// @brief Function-pointer for urBindlessImagesMapExternalLinearMemoryExp
1644+
typedef ur_result_t(UR_APICALL *ur_pfnBindlessImagesMapExternalLinearMemoryExp_t)(
1645+
ur_context_handle_t,
1646+
ur_device_handle_t,
1647+
uint64_t,
1648+
uint64_t,
1649+
ur_exp_external_mem_handle_t,
1650+
void **);
1651+
16421652
///////////////////////////////////////////////////////////////////////////////
16431653
/// @brief Function-pointer for urBindlessImagesReleaseExternalMemoryExp
16441654
typedef ur_result_t(UR_APICALL *ur_pfnBindlessImagesReleaseExternalMemoryExp_t)(
@@ -1699,6 +1709,7 @@ typedef struct ur_bindless_images_exp_dditable_t {
16991709
ur_pfnBindlessImagesMipmapFreeExp_t pfnMipmapFreeExp;
17001710
ur_pfnBindlessImagesImportExternalMemoryExp_t pfnImportExternalMemoryExp;
17011711
ur_pfnBindlessImagesMapExternalArrayExp_t pfnMapExternalArrayExp;
1712+
ur_pfnBindlessImagesMapExternalLinearMemoryExp_t pfnMapExternalLinearMemoryExp;
17021713
ur_pfnBindlessImagesReleaseExternalMemoryExp_t pfnReleaseExternalMemoryExp;
17031714
ur_pfnBindlessImagesImportExternalSemaphoreExp_t pfnImportExternalSemaphoreExp;
17041715
ur_pfnBindlessImagesReleaseExternalSemaphoreExp_t pfnReleaseExternalSemaphoreExp;

include/ur_print.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,6 +2146,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urPrintBindlessImagesImportExternalMemoryExp
21462146
/// - `buff_size < out_size`
21472147
UR_APIEXPORT ur_result_t UR_APICALL urPrintBindlessImagesMapExternalArrayExpParams(const struct ur_bindless_images_map_external_array_exp_params_t *params, char *buffer, const size_t buff_size, size_t *out_size);
21482148

2149+
///////////////////////////////////////////////////////////////////////////////
2150+
/// @brief Print ur_bindless_images_map_external_linear_memory_exp_params_t struct
2151+
/// @returns
2152+
/// - ::UR_RESULT_SUCCESS
2153+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
2154+
/// - `buff_size < out_size`
2155+
UR_APIEXPORT ur_result_t UR_APICALL urPrintBindlessImagesMapExternalLinearMemoryExpParams(const struct ur_bindless_images_map_external_linear_memory_exp_params_t *params, char *buffer, const size_t buff_size, size_t *out_size);
2156+
21492157
///////////////////////////////////////////////////////////////////////////////
21502158
/// @brief Print ur_bindless_images_release_external_memory_exp_params_t struct
21512159
/// @returns

include/ur_print.hpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,9 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_function_t value) {
942942
case UR_FUNCTION_BINDLESS_IMAGES_RELEASE_EXTERNAL_MEMORY_EXP:
943943
os << "UR_FUNCTION_BINDLESS_IMAGES_RELEASE_EXTERNAL_MEMORY_EXP";
944944
break;
945+
case UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP:
946+
os << "UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP";
947+
break;
945948
default:
946949
os << "unknown enumerator";
947950
break;
@@ -15190,6 +15193,48 @@ inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct
1519015193
return os;
1519115194
}
1519215195

15196+
///////////////////////////////////////////////////////////////////////////////
15197+
/// @brief Print operator for the ur_bindless_images_map_external_linear_memory_exp_params_t type
15198+
/// @returns
15199+
/// std::ostream &
15200+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_bindless_images_map_external_linear_memory_exp_params_t *params) {
15201+
15202+
os << ".hContext = ";
15203+
15204+
ur::details::printPtr(os,
15205+
*(params->phContext));
15206+
15207+
os << ", ";
15208+
os << ".hDevice = ";
15209+
15210+
ur::details::printPtr(os,
15211+
*(params->phDevice));
15212+
15213+
os << ", ";
15214+
os << ".offset = ";
15215+
15216+
os << *(params->poffset);
15217+
15218+
os << ", ";
15219+
os << ".size = ";
15220+
15221+
os << *(params->psize);
15222+
15223+
os << ", ";
15224+
os << ".hExternalMem = ";
15225+
15226+
ur::details::printPtr(os,
15227+
*(params->phExternalMem));
15228+
15229+
os << ", ";
15230+
os << ".ppRetMem = ";
15231+
15232+
ur::details::printPtr(os,
15233+
*(params->pppRetMem));
15234+
15235+
return os;
15236+
}
15237+
1519315238
///////////////////////////////////////////////////////////////////////////////
1519415239
/// @brief Print operator for the ur_bindless_images_release_external_memory_exp_params_t type
1519515240
/// @returns
@@ -17804,6 +17849,9 @@ inline ur_result_t UR_APICALL printFunctionParams(std::ostream &os, ur_function_
1780417849
case UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_ARRAY_EXP: {
1780517850
os << (const struct ur_bindless_images_map_external_array_exp_params_t *)params;
1780617851
} break;
17852+
case UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP: {
17853+
os << (const struct ur_bindless_images_map_external_linear_memory_exp_params_t *)params;
17854+
} break;
1780717855
case UR_FUNCTION_BINDLESS_IMAGES_RELEASE_EXTERNAL_MEMORY_EXP: {
1780817856
os << (const struct ur_bindless_images_release_external_memory_exp_params_t *)params;
1780917857
} break;

scripts/core/EXP-BINDLESS-IMAGES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ Functions
181181
* Interop
182182
* ${x}BindlessImagesImportExternalMemoryExp
183183
* ${x}BindlessImagesMapExternalArrayExp
184+
* ${x}BindlessImagesMapExternalLinearMemoryExp
184185
* ${x}BindlessImagesReleaseExternalMemoryExp
185186
* ${x}BindlessImagesImportExternalSemaphoreExp
186187
* ${x}BindlessImagesReleaseExternalSemaphoreExp
@@ -250,6 +251,8 @@ Changelog
250251
| 17.0 || Rename interop related structs and funcs with "external" |
251252
| || keyword over "interop". |
252253
+----------+-------------------------------------------------------------+
254+
| 18.0 | Added BindlessImagesMapExternalLinearMemoryExp function. |
255+
+----------+-------------------------------------------------------------+
253256

254257
Contributors
255258
--------------------------------------------------------------------------------

scripts/core/exp-bindless-images.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,37 @@ returns:
737737
- $X_RESULT_ERROR_OUT_OF_RESOURCES
738738
--- #--------------------------------------------------------------------------
739739
type: function
740+
desc: "Map an external memory handle to a device memory region described by void*"
741+
class: $xBindlessImages
742+
name: MapExternalLinearMemoryExp
743+
ordinal: "0"
744+
params:
745+
- type: $x_context_handle_t
746+
name: hContext
747+
desc: "[in] handle of the context object"
748+
- type: $x_device_handle_t
749+
name: hDevice
750+
desc: "[in] handle of the device object"
751+
- type: uint64_t
752+
name: offset
753+
desc: "[in] offset into memory region to map"
754+
- type: uint64_t
755+
name: size
756+
desc: "[in] size of memory region to map"
757+
- type: $x_exp_external_mem_handle_t
758+
name: hExternalMem
759+
desc: "[in] external memory handle to the external memory"
760+
- type: void**
761+
name: ppRetMem
762+
desc: "[out] pointer of the externally allocated memory"
763+
returns:
764+
- $X_RESULT_ERROR_INVALID_CONTEXT
765+
- $X_RESULT_ERROR_INVALID_VALUE
766+
- $X_RESULT_ERROR_INVALID_IMAGE_SIZE
767+
- $X_RESULT_ERROR_INVALID_OPERATION
768+
- $X_RESULT_ERROR_OUT_OF_RESOURCES
769+
--- #--------------------------------------------------------------------------
770+
type: function
740771
desc: "Release external memory"
741772
class: $xBindlessImages
742773
name: ReleaseExternalMemoryExp

scripts/core/registry.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,9 @@ etors:
595595
- name: BINDLESS_IMAGES_RELEASE_EXTERNAL_MEMORY_EXP
596596
desc: Enumerator for $xBindlessImagesReleaseExternalMemoryExp
597597
value: '230'
598+
- name: BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP
599+
desc: Enumerator for $xBindlessImagesMapExternalLinearMemoryExp
600+
value: '231'
598601
---
599602
type: enum
600603
desc: Defines structure types

source/adapters/cuda/image.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,36 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalArrayExp(
11691169
return UR_RESULT_SUCCESS;
11701170
}
11711171

1172+
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalLinearMemoryExp(
1173+
ur_context_handle_t hContext, ur_device_handle_t hDevice, uint64_t offset,
1174+
uint64_t size, ur_exp_external_mem_handle_t hExternalMem, void **ppRetMem) {
1175+
UR_ASSERT(std::find(hContext->getDevices().begin(),
1176+
hContext->getDevices().end(),
1177+
hDevice) != hContext->getDevices().end(),
1178+
UR_RESULT_ERROR_INVALID_CONTEXT);
1179+
1180+
try {
1181+
ScopedContext Active(hDevice);
1182+
1183+
CUDA_EXTERNAL_MEMORY_BUFFER_DESC BufferDesc = {};
1184+
BufferDesc.size = size;
1185+
BufferDesc.offset = offset;
1186+
BufferDesc.flags = 0;
1187+
1188+
CUdeviceptr retMem;
1189+
UR_CHECK_ERROR(cuExternalMemoryGetMappedBuffer(
1190+
&retMem, (CUexternalMemory)hExternalMem, &BufferDesc));
1191+
1192+
*ppRetMem = (void *)retMem;
1193+
1194+
} catch (ur_result_t Err) {
1195+
return Err;
1196+
} catch (...) {
1197+
return UR_RESULT_ERROR_UNKNOWN;
1198+
}
1199+
return UR_RESULT_SUCCESS;
1200+
}
1201+
11721202
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesReleaseExternalMemoryExp(
11731203
ur_context_handle_t hContext, ur_device_handle_t hDevice,
11741204
ur_exp_external_mem_handle_t hExternalMem) {

source/adapters/cuda/ur_interface_loader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ UR_DLLEXPORT ur_result_t UR_APICALL urGetBindlessImagesExpProcAddrTable(
340340
pDdiTable->pfnImportExternalMemoryExp =
341341
urBindlessImagesImportExternalMemoryExp;
342342
pDdiTable->pfnMapExternalArrayExp = urBindlessImagesMapExternalArrayExp;
343+
pDdiTable->pfnMapExternalLinearMemoryExp =
344+
urBindlessImagesMapExternalLinearMemoryExp;
343345
pDdiTable->pfnReleaseExternalMemoryExp =
344346
urBindlessImagesReleaseExternalMemoryExp;
345347
pDdiTable->pfnImportExternalSemaphoreExp =

source/adapters/hip/image.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalArrayExp(
132132
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
133133
}
134134

135+
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalLinearMemoryExp(
136+
[[maybe_unused]] ur_context_handle_t hContext,
137+
[[maybe_unused]] ur_device_handle_t hDevice,
138+
[[maybe_unused]] uint64_t offset, [[maybe_unused]] uint64_t size,
139+
[[maybe_unused]] ur_exp_external_mem_handle_t hExternalMem,
140+
[[maybe_unused]] void **phRetMem) {
141+
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
142+
}
143+
135144
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesReleaseExternalMemoryExp(
136145
[[maybe_unused]] ur_context_handle_t hContext,
137146
[[maybe_unused]] ur_device_handle_t hDevice,

0 commit comments

Comments
 (0)