Skip to content

Commit d19bc63

Browse files
committed
L-1 provider: implement support for defer and blocking free
1 parent c2781ff commit d19bc63

File tree

5 files changed

+80
-2
lines changed

5 files changed

+80
-2
lines changed

include/umf/providers/provider_level_zero.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@ umf_result_t umfLevelZeroMemoryProviderParamsSetResidentDevices(
6868
umf_level_zero_memory_provider_params_handle_t hParams,
6969
ze_device_handle_t *hDevices, uint32_t deviceCount);
7070

71+
typedef enum umf_level_zero_memory_provider_free_policy_t {
72+
UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFAULT =
73+
0, ///< Free memory immediately. Default.
74+
UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_BLOCKING_FREE, ///< Blocks until all commands using the memory are complete before freeing.
75+
UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFER_FREE, ///< Schedules the memory to be freed but does not free immediately.
76+
} umf_level_zero_memory_provider_free_policy_t;
77+
78+
/// @brief Set the memory free policy.
79+
/// @param hParams handle to the parameters of the Level Zero Memory Provider.
80+
/// @param policy memory free policy.
81+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
82+
umf_result_t umfLevelZeroMemoryProviderParamsSetFreePolicy(
83+
umf_level_zero_memory_provider_params_handle_t hParams,
84+
umf_level_zero_memory_provider_free_policy_t policy);
85+
7186
umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void);
7287

7388
#ifdef __cplusplus

src/libumf.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,5 @@ EXPORTS
120120
umfScalablePoolParamsDestroy
121121
umfScalablePoolParamsSetGranularity
122122
umfScalablePoolParamsSetKeepAllMemory
123+
; Added in UMF_0.11
124+
umfLevelZeroMemoryProviderParamsSetFreePolicy

src/libumf.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,5 @@ UMF_0.11 {
119119
umfFixedMemoryProviderOps;
120120
umfFixedMemoryProviderParamsCreate;
121121
umfFixedMemoryProviderParamsDestroy;
122+
umfLevelZeroMemoryProviderParamsSetFreePolicy;
122123
} UMF_0.10;

src/provider/provider_level_zero.c

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ umf_result_t umfLevelZeroMemoryProviderParamsSetResidentDevices(
7575
return UMF_RESULT_ERROR_NOT_SUPPORTED;
7676
}
7777

78+
umf_result_t umfLevelZeroMemoryProviderParamsSetFreePolicy(
79+
umf_level_zero_memory_provider_params_handle_t hParams,
80+
umf_level_zero_memory_provider_free_policy_t policy) {
81+
(void)hParams;
82+
(void)policy;
83+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
84+
}
85+
7886
umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) {
7987
// not supported
8088
LOG_ERR("L0 memory provider is disabled! (UMF_BUILD_LEVEL_ZERO_PROVIDER is "
@@ -107,6 +115,9 @@ typedef struct umf_level_zero_memory_provider_params_t {
107115
resident_device_handles; ///< Array of devices for which the memory should be made resident
108116
uint32_t
109117
resident_device_count; ///< Number of devices for which the memory should be made resident
118+
119+
umf_level_zero_memory_provider_free_policy_t
120+
freePolicy; ///< Memory free policy
110121
} umf_level_zero_memory_provider_params_t;
111122

112123
typedef struct ze_memory_provider_t {
@@ -118,6 +129,8 @@ typedef struct ze_memory_provider_t {
118129
uint32_t resident_device_count;
119130

120131
ze_device_properties_t device_properties;
132+
133+
ze_driver_memory_free_policy_ext_flags_t freePolicyFlags;
121134
} ze_memory_provider_t;
122135

123136
typedef struct ze_ops_t {
@@ -144,6 +157,8 @@ typedef struct ze_ops_t {
144157
size_t);
145158
ze_result_t (*zeDeviceGetProperties)(ze_device_handle_t,
146159
ze_device_properties_t *);
160+
ze_result_t (*zeMemFreeExt)(ze_context_handle_t,
161+
ze_memory_free_ext_desc_t *, void *);
147162
} ze_ops_t;
148163

149164
static ze_ops_t g_ze_ops;
@@ -197,6 +212,8 @@ static void init_ze_global_state(void) {
197212
utils_get_symbol_addr(0, "zeContextMakeMemoryResident", lib_name);
198213
*(void **)&g_ze_ops.zeDeviceGetProperties =
199214
utils_get_symbol_addr(0, "zeDeviceGetProperties", lib_name);
215+
*(void **)&g_ze_ops.zeMemFreeExt =
216+
utils_get_symbol_addr(0, "zeMemFreeExt", lib_name);
200217

201218
if (!g_ze_ops.zeMemAllocHost || !g_ze_ops.zeMemAllocDevice ||
202219
!g_ze_ops.zeMemAllocShared || !g_ze_ops.zeMemFree ||
@@ -232,6 +249,7 @@ umf_result_t umfLevelZeroMemoryProviderParamsCreate(
232249
params->memory_type = UMF_MEMORY_TYPE_UNKNOWN;
233250
params->resident_device_handles = NULL;
234251
params->resident_device_count = 0;
252+
params->freePolicy = UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFAULT;
235253

236254
*hParams = params;
237255

@@ -308,6 +326,32 @@ umf_result_t umfLevelZeroMemoryProviderParamsSetResidentDevices(
308326
return UMF_RESULT_SUCCESS;
309327
}
310328

329+
umf_result_t umfLevelZeroMemoryProviderParamsSetFreePolicy(
330+
umf_level_zero_memory_provider_params_handle_t hParams,
331+
umf_level_zero_memory_provider_free_policy_t policy) {
332+
if (!hParams) {
333+
LOG_ERR("Level zero memory provider params handle is NULL");
334+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
335+
}
336+
337+
hParams->freePolicy = policy;
338+
return UMF_RESULT_SUCCESS;
339+
}
340+
341+
static ze_driver_memory_free_policy_ext_flags_t
342+
umfFreePolicyToZePolicy(umf_level_zero_memory_provider_free_policy_t policy) {
343+
switch (policy) {
344+
case UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFAULT:
345+
return 0;
346+
case UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_BLOCKING_FREE:
347+
return ZE_DRIVER_MEMORY_FREE_POLICY_EXT_FLAG_BLOCKING_FREE;
348+
case UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFER_FREE:
349+
return ZE_DRIVER_MEMORY_FREE_POLICY_EXT_FLAG_DEFER_FREE;
350+
default:
351+
return 0;
352+
}
353+
}
354+
311355
static umf_result_t ze_memory_provider_initialize(void *params,
312356
void **provider) {
313357
if (params == NULL) {
@@ -351,6 +395,8 @@ static umf_result_t ze_memory_provider_initialize(void *params,
351395
ze_provider->context = ze_params->level_zero_context_handle;
352396
ze_provider->device = ze_params->level_zero_device_handle;
353397
ze_provider->memory_type = (ze_memory_type_t)ze_params->memory_type;
398+
ze_provider->freePolicyFlags =
399+
umfFreePolicyToZePolicy(ze_params->freePolicy);
354400

355401
memset(&ze_provider->device_properties, 0,
356402
sizeof(ze_provider->device_properties));
@@ -493,8 +539,18 @@ static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
493539
}
494540

495541
ze_memory_provider_t *ze_provider = (ze_memory_provider_t *)provider;
496-
ze_result_t ze_result = g_ze_ops.zeMemFree(ze_provider->context, ptr);
497-
return ze2umf_result(ze_result);
542+
543+
if (ze_provider->freePolicyFlags == 0) {
544+
return ze2umf_result(g_ze_ops.zeMemFree(ze_provider->context, ptr));
545+
}
546+
547+
ze_memory_free_ext_desc_t desc = {
548+
.stype = ZE_STRUCTURE_TYPE_MEMORY_FREE_EXT_DESC,
549+
.pNext = NULL,
550+
.freePolicy = ze_provider->freePolicyFlags};
551+
552+
return ze2umf_result(
553+
g_ze_ops.zeMemFreeExt(ze_provider->context, &desc, ptr));
498554
}
499555

500556
static void ze_memory_provider_get_last_native_error(void *provider,

test/providers/provider_level_zero_not_impl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ TEST_F(test, level_zero_provider_not_implemented) {
3131
hDevices, 1);
3232
ASSERT_EQ(result, UMF_RESULT_ERROR_NOT_SUPPORTED);
3333

34+
result = umfLevelZeroMemoryProviderParamsSetFreePolicy(
35+
hParams, UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFAULT);
36+
ASSERT_EQ(result, UMF_RESULT_ERROR_NOT_SUPPORTED);
37+
3438
umf_memory_provider_ops_t *ops = umfLevelZeroMemoryProviderOps();
3539
ASSERT_EQ(ops, nullptr);
3640
}

0 commit comments

Comments
 (0)