Skip to content

Commit 9869d0e

Browse files
authored
Merge pull request #1534 from bratpiorka/rrudnick_resident_evict
implement Level Zero memory eviction
2 parents 1209db2 + e82c6a7 commit 9869d0e

File tree

7 files changed

+50
-3
lines changed

7 files changed

+50
-3
lines changed

src/provider/provider_level_zero.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ typedef struct ze_ops_t {
107107
ze_result_t (*zeContextMakeMemoryResident)(ze_context_handle_t,
108108
ze_device_handle_t, void *,
109109
size_t);
110+
ze_result_t (*zeContextEvictMemory)(ze_context_handle_t, ze_device_handle_t,
111+
void *, size_t);
110112
ze_result_t (*zeDeviceGetProperties)(ze_device_handle_t,
111113
ze_device_properties_t *);
112114
ze_result_t (*zeMemFreeExt)(ze_context_handle_t,
@@ -218,6 +220,8 @@ static void init_ze_global_state(void) {
218220
utils_get_symbol_addr(lib_handle, "zeMemCloseIpcHandle", lib_name);
219221
*(void **)&g_ze_ops.zeContextMakeMemoryResident = utils_get_symbol_addr(
220222
lib_handle, "zeContextMakeMemoryResident", lib_name);
223+
*(void **)&g_ze_ops.zeContextEvictMemory =
224+
utils_get_symbol_addr(lib_handle, "zeContextEvictMemory", lib_name);
221225
*(void **)&g_ze_ops.zeDeviceGetProperties =
222226
utils_get_symbol_addr(lib_handle, "zeDeviceGetProperties", lib_name);
223227
*(void **)&g_ze_ops.zeMemFreeExt =
@@ -230,7 +234,8 @@ static void init_ze_global_state(void) {
230234
!g_ze_ops.zeMemGetIpcHandle || !g_ze_ops.zeMemOpenIpcHandle ||
231235
!g_ze_ops.zeMemCloseIpcHandle ||
232236
!g_ze_ops.zeContextMakeMemoryResident ||
233-
!g_ze_ops.zeDeviceGetProperties || !g_ze_ops.zeMemGetAllocProperties) {
237+
!g_ze_ops.zeContextEvictMemory || !g_ze_ops.zeDeviceGetProperties ||
238+
!g_ze_ops.zeMemGetAllocProperties) {
234239
// g_ze_ops.zeMemPutIpcHandle can be NULL because it was introduced
235240
// starting from Level Zero 1.6
236241
LOG_FATAL("Required Level Zero symbols not found.");
@@ -1012,8 +1017,9 @@ static int ze_memory_provider_resident_device_change_helper(uintptr_t key,
10121017
change_data->source_memory_provider->context,
10131018
change_data->peer_device, info->props.base, info->props.base_size);
10141019
} else {
1015-
result = ZE_RESULT_SUCCESS;
1016-
// TODO: currently not implemented call evict here
1020+
result = g_ze_ops.zeContextEvictMemory(
1021+
change_data->source_memory_provider->context,
1022+
change_data->peer_device, info->props.base, info->props.base_size);
10171023
}
10181024

10191025
if (result != ZE_RESULT_SUCCESS) {

test/common/level_zero_mocks.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class LevelZeroMock : public LevelZero {
6464
MOCK_METHOD4(zeContextMakeMemoryResident,
6565
ze_result_t(ze_context_handle_t, ze_device_handle_t, void *,
6666
size_t));
67+
MOCK_METHOD4(zeContextEvictMemory,
68+
ze_result_t(ze_context_handle_t, ze_device_handle_t, void *,
69+
size_t));
6770
MOCK_METHOD2(zeMemFree,
6871
ze_result_t(ze_context_handle_t hContext, void *ptr));
6972

test/common/ze_loopback.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,13 @@ ze_result_t ZE_APICALL zeContextMakeMemoryResident(ze_context_handle_t hContext,
263263
size);
264264
}
265265

266+
ze_result_t ZE_APICALL zeContextEvictMemory(ze_context_handle_t hContext,
267+
ze_device_handle_t hDevice,
268+
void *ptr, size_t size) {
269+
check_mock_present();
270+
return level_zero_mock->zeContextEvictMemory(hContext, hDevice, ptr, size);
271+
}
272+
266273
ze_result_t ZE_APICALL
267274
zeMemFreeExt(ze_context_handle_t hContext,
268275
const ze_memory_free_ext_desc_t *pMemFreeDesc, void *ptr) {

test/common/ze_loopback.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ EXPORTS
2424
zeCommandListAppendMemoryCopy
2525
zeCommandListAppendMemoryFill
2626
zeContextMakeMemoryResident
27+
zeContextEvictMemory
2728
zeMemGetAllocProperties
2829
zeMemAllocDevice
2930
zeMemAllocHost

test/common/ze_loopback.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ class LevelZero {
2727
virtual ze_result_t zeContextMakeMemoryResident(ze_context_handle_t,
2828
ze_device_handle_t, void *,
2929
size_t) = 0;
30+
virtual ze_result_t zeContextEvictMemory(ze_context_handle_t,
31+
ze_device_handle_t, void *,
32+
size_t) = 0;
3033
virtual ze_result_t zeMemFree(ze_context_handle_t hContext, void *ptr) = 0;
3134
};
3235

test/common/ze_loopback.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
zeCommandListAppendMemoryCopy;
2424
zeCommandListAppendMemoryFill;
2525
zeContextMakeMemoryResident;
26+
zeContextEvictMemory;
2627
zeMemGetAllocProperties;
2728
zeMemAllocDevice;
2829
zeMemAllocHost;

test/pools/pool_residency.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,32 @@ TEST_F(PoolResidencyTestFixture,
109109
umfPoolFree(pool, ptr);
110110
}
111111

112+
TEST_F(PoolResidencyTestFixture,
113+
existingAllocationsShouldBeEvictedFromRemovedDevice) {
114+
initializeMemoryPool(l0mock.initializeMemoryProviderWithResidentDevices(
115+
OUR_DEVICE, {DEVICE_2, DEVICE_3}));
116+
117+
EXPECT_CALL(l0mock, zeMemAllocDevice(CONTEXT, _, _, _, OUR_DEVICE, _))
118+
.WillOnce(
119+
DoAll(SetArgPointee<5>(POINTER_0), Return(ZE_RESULT_SUCCESS)));
120+
EXPECT_CALL(l0mock, zeContextMakeMemoryResident(CONTEXT, DEVICE_2, _, _))
121+
.WillOnce(Return(ZE_RESULT_SUCCESS));
122+
EXPECT_CALL(l0mock, zeContextMakeMemoryResident(CONTEXT, DEVICE_3, _, _))
123+
.WillOnce(Return(ZE_RESULT_SUCCESS));
124+
125+
void *ptr = umfPoolMalloc(pool, 123);
126+
EXPECT_EQ(ptr, POINTER_0);
127+
128+
EXPECT_CALL(l0mock, zeContextEvictMemory(CONTEXT, DEVICE_2, _, _))
129+
.WillOnce(Return(ZE_RESULT_SUCCESS));
130+
131+
umf_memory_provider_handle_t provider = nullptr;
132+
EXPECT_EQ(umfPoolGetMemoryProvider(pool, &provider), UMF_RESULT_SUCCESS);
133+
umfLevelZeroMemoryProviderResidentDeviceChange(provider, DEVICE_2, false);
134+
135+
umfPoolFree(pool, ptr);
136+
}
137+
112138
TEST_F(PoolResidencyTestFixture,
113139
allocationShouldNotBeMadeResidentOnRemovedDevice) {
114140
initializeMemoryPool(l0mock.initializeMemoryProviderWithResidentDevices(

0 commit comments

Comments
 (0)