Skip to content

Commit 8462487

Browse files
committed
Update Level Zero provider config API
1 parent 7ef936c commit 8462487

14 files changed

+792
-190
lines changed

benchmark/ubench.c

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -421,11 +421,10 @@ static void do_ipc_get_put_benchmark(alloc_t *allocs, size_t num_allocs,
421421
}
422422
}
423423

424-
int create_level_zero_params(level_zero_memory_provider_params_t *params) {
424+
int create_level_zero_params(ze_context_handle_t *context,
425+
ze_device_handle_t *device) {
425426
uint32_t driver_idx = 0;
426427
ze_driver_handle_t driver = NULL;
427-
ze_context_handle_t context = NULL;
428-
ze_device_handle_t device = NULL;
429428

430429
int ret = init_level_zero();
431430
if (ret != 0) {
@@ -439,36 +438,68 @@ int create_level_zero_params(level_zero_memory_provider_params_t *params) {
439438
return ret;
440439
}
441440

442-
ret = create_context(driver, &context);
441+
ret = create_context(driver, context);
443442
if (ret != 0) {
444443
fprintf(stderr, "Failed to create L0 context!\n");
445444
return ret;
446445
}
447446

448-
ret = find_gpu_device(driver, &device);
449-
if (ret || device == NULL) {
447+
ret = find_gpu_device(driver, device);
448+
if (ret) {
450449
fprintf(stderr, "Cannot find GPU device!\n");
451-
destroy_context(context);
450+
destroy_context(*context);
452451
return ret;
453452
}
454453

455-
params->level_zero_context_handle = context;
456-
params->level_zero_device_handle = device;
457-
params->memory_type = UMF_MEMORY_TYPE_DEVICE;
458-
459454
return ret;
460455
}
461456

462457
UBENCH_EX(ipc, disjoint_pool_with_level_zero_provider) {
463458
const size_t BUFFER_SIZE = 100;
464459
const size_t N_BUFFERS = 1000;
465-
level_zero_memory_provider_params_t level_zero_params = {0};
460+
umf_result_t umf_result;
461+
ze_context_handle_t context = NULL;
462+
ze_device_handle_t device = NULL;
463+
umf_level_zero_memory_provider_params_handle_t level_zero_params = NULL;
466464

467-
int ret = create_level_zero_params(&level_zero_params);
465+
int ret = create_level_zero_params(&context, &device);
468466
if (ret != 0) {
467+
fprintf(stderr, "error: create_level_zero_params() failed\n");
469468
exit(-1);
470469
}
471470

471+
umf_result = umfLevelZeroMemoryProviderParamsCreate(&level_zero_params);
472+
if (umf_result != UMF_RESULT_SUCCESS) {
473+
fprintf(stderr,
474+
"error: umfLevelZeroMemoryProviderParamsCreate() failed\n");
475+
goto err_destroy_context;
476+
}
477+
478+
umf_result =
479+
umfLevelZeroMemoryProviderParamsSetContext(level_zero_params, context);
480+
if (umf_result != UMF_RESULT_SUCCESS) {
481+
fprintf(stderr,
482+
"error: umfLevelZeroMemoryProviderParamsSetContext() failed\n");
483+
goto err_destroy_params;
484+
}
485+
486+
umf_result =
487+
umfLevelZeroMemoryProviderParamsSetDevice(level_zero_params, device);
488+
if (umf_result != UMF_RESULT_SUCCESS) {
489+
fprintf(stderr,
490+
"error: umfLevelZeroMemoryProviderParamsSetDevice() failed\n");
491+
goto err_destroy_params;
492+
}
493+
494+
umf_result = umfLevelZeroMemoryProviderParamsSetMemoryType(
495+
level_zero_params, UMF_MEMORY_TYPE_DEVICE);
496+
if (umf_result != UMF_RESULT_SUCCESS) {
497+
fprintf(
498+
stderr,
499+
"error: umfLevelZeroMemoryProviderParamsSetMemoryType() failed\n");
500+
goto err_destroy_params;
501+
}
502+
472503
alloc_t *allocs = alloc_array(N_BUFFERS);
473504
if (allocs == NULL) {
474505
fprintf(stderr, "error: alloc_array() failed\n");
@@ -481,10 +512,9 @@ UBENCH_EX(ipc, disjoint_pool_with_level_zero_provider) {
481512
goto err_free_allocs;
482513
}
483514

484-
umf_result_t umf_result;
485515
umf_memory_provider_handle_t provider = NULL;
486516
umf_result = umfMemoryProviderCreate(umfLevelZeroMemoryProviderOps(),
487-
&level_zero_params, &provider);
517+
level_zero_params, &provider);
488518
if (umf_result != UMF_RESULT_SUCCESS) {
489519
fprintf(stderr, "error: umfMemoryProviderCreate() failed\n");
490520
goto err_free_ipc_handles;
@@ -570,8 +600,11 @@ UBENCH_EX(ipc, disjoint_pool_with_level_zero_provider) {
570600
err_free_allocs:
571601
free(allocs);
572602

603+
err_destroy_params:
604+
umfLevelZeroMemoryProviderParamsDestroy(level_zero_params);
605+
573606
err_destroy_context:
574-
destroy_context(level_zero_params.level_zero_context_handle);
607+
destroy_context(context);
575608
}
576609
#endif /* (defined UMF_BUILD_LIBUMF_POOL_DISJOINT && defined UMF_BUILD_LEVEL_ZERO_PROVIDER && defined UMF_BUILD_GPU_TESTS) */
577610

examples/ipc_level_zero/ipc_level_zero.c

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,48 @@ int create_level_zero_pool(ze_context_handle_t context,
2020
ze_device_handle_t device,
2121
umf_memory_pool_handle_t *pool) {
2222
// setup params
23-
level_zero_memory_provider_params_t params = {0};
24-
params.level_zero_context_handle = context;
25-
params.level_zero_device_handle = device;
26-
params.memory_type = UMF_MEMORY_TYPE_DEVICE;
23+
umf_level_zero_memory_provider_params_handle_t provider_params = NULL;
24+
25+
umf_result_t umf_result =
26+
umfLevelZeroMemoryProviderParamsCreate(&provider_params);
27+
if (umf_result != UMF_RESULT_SUCCESS) {
28+
fprintf(stderr,
29+
"ERROR: Failed to create Level Zero memory provider params!\n");
30+
return -1;
31+
}
32+
33+
umf_result =
34+
umfLevelZeroMemoryProviderParamsSetContext(provider_params, context);
35+
if (umf_result != UMF_RESULT_SUCCESS) {
36+
fprintf(stderr, "ERROR: Failed to set context in Level Zero memory "
37+
"provider params!\n");
38+
umfLevelZeroMemoryProviderParamsDestroy(provider_params);
39+
return -1;
40+
}
41+
42+
umf_result =
43+
umfLevelZeroMemoryProviderParamsSetDevice(provider_params, device);
44+
if (umf_result != UMF_RESULT_SUCCESS) {
45+
fprintf(stderr, "ERROR: Failed to set device in Level Zero memory "
46+
"provider params!\n");
47+
umfLevelZeroMemoryProviderParamsDestroy(provider_params);
48+
return -1;
49+
}
50+
51+
umf_result = umfLevelZeroMemoryProviderParamsSetMemoryType(
52+
provider_params, UMF_MEMORY_TYPE_DEVICE);
53+
if (umf_result != UMF_RESULT_SUCCESS) {
54+
fprintf(stderr, "ERROR: Failed to set memory type in Level Zero memory "
55+
"provider params!\n");
56+
umfLevelZeroMemoryProviderParamsDestroy(provider_params);
57+
return -1;
58+
}
2759

2860
// create Level Zero provider
2961
umf_memory_provider_handle_t provider = 0;
30-
umf_result_t umf_result = umfMemoryProviderCreate(
31-
umfLevelZeroMemoryProviderOps(), &params, &provider);
62+
umf_result = umfMemoryProviderCreate(umfLevelZeroMemoryProviderOps(),
63+
provider_params, &provider);
64+
umfLevelZeroMemoryProviderParamsDestroy(provider_params);
3265
if (umf_result != UMF_RESULT_SUCCESS) {
3366
fprintf(stderr,
3467
"ERROR: Failed to create Level Zero memory provider!\n");

examples/level_zero_shared_memory/level_zero_shared_memory.c

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,51 @@ int main(void) {
4949

5050
// Setup parameters for the Level Zero memory provider. It will be used for
5151
// allocating memory from Level Zero devices.
52-
level_zero_memory_provider_params_t ze_memory_provider_params = {0};
53-
ze_memory_provider_params.level_zero_context_handle = hContext;
54-
ze_memory_provider_params.level_zero_device_handle = hDevice;
52+
umf_level_zero_memory_provider_params_handle_t ze_memory_provider_params =
53+
NULL;
54+
res = umfLevelZeroMemoryProviderParamsCreate(&ze_memory_provider_params);
55+
if (res != UMF_RESULT_SUCCESS) {
56+
fprintf(stderr, "Failed to create memory provider params!\n");
57+
ret = -1;
58+
goto level_zero_destroy;
59+
}
60+
61+
res = umfLevelZeroMemoryProviderParamsSetContext(ze_memory_provider_params,
62+
hContext);
63+
if (res != UMF_RESULT_SUCCESS) {
64+
fprintf(stderr, "Failed to set context in memory provider params!\n");
65+
ret = -1;
66+
goto provider_params_destroy;
67+
}
68+
69+
res = umfLevelZeroMemoryProviderParamsSetDevice(ze_memory_provider_params,
70+
hDevice);
71+
if (res != UMF_RESULT_SUCCESS) {
72+
fprintf(stderr, "Failed to set device in memory provider params!\n");
73+
ret = -1;
74+
goto provider_params_destroy;
75+
}
76+
5577
// Set the memory type to shared to allow the memory to be accessed on both
5678
// CPU and GPU.
57-
ze_memory_provider_params.memory_type = UMF_MEMORY_TYPE_SHARED;
79+
res = umfLevelZeroMemoryProviderParamsSetMemoryType(
80+
ze_memory_provider_params, UMF_MEMORY_TYPE_SHARED);
81+
if (res != UMF_RESULT_SUCCESS) {
82+
fprintf(stderr,
83+
"Failed to set memory type in memory provider params!\n");
84+
ret = -1;
85+
goto provider_params_destroy;
86+
}
5887

5988
// Create Level Zero memory provider
6089
umf_memory_provider_handle_t ze_memory_provider;
61-
res = umfMemoryProviderCreate(umfLevelZeroMemoryProviderOps(),
62-
&ze_memory_provider_params,
63-
&ze_memory_provider);
90+
res =
91+
umfMemoryProviderCreate(umfLevelZeroMemoryProviderOps(),
92+
ze_memory_provider_params, &ze_memory_provider);
6493
if (res != UMF_RESULT_SUCCESS) {
6594
fprintf(stderr, "Failed to create a memory provider!\n");
6695
ret = -1;
67-
goto level_zero_destroy;
96+
goto provider_params_destroy;
6897
}
6998

7099
printf("Level Zero memory provider created at %p\n",
@@ -154,6 +183,9 @@ int main(void) {
154183
memory_provider_destroy:
155184
umfMemoryProviderDestroy(ze_memory_provider);
156185

186+
provider_params_destroy:
187+
umfLevelZeroMemoryProviderParamsDestroy(ze_memory_provider_params);
188+
157189
level_zero_destroy:
158190
ret = destroy_context(hContext);
159191
return ret;

include/umf/providers/provider_level_zero.h

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,56 @@ extern "C" {
1717
typedef struct _ze_device_handle_t *ze_device_handle_t;
1818
typedef struct _ze_context_handle_t *ze_context_handle_t;
1919

20-
/// @brief Level Zero Memory Provider settings struct
21-
typedef struct level_zero_memory_provider_params_t {
22-
ze_context_handle_t
23-
level_zero_context_handle; ///< Handle to the Level Zero context
24-
ze_device_handle_t
25-
level_zero_device_handle; ///< Handle to the Level Zero device
26-
27-
umf_usm_memory_type_t memory_type; ///< Allocation memory type
28-
29-
ze_device_handle_t *
30-
resident_device_handles; ///< Array of devices for which the memory should be made resident
31-
uint32_t
32-
resident_device_count; ///< Number of devices for which the memory should be made resident
33-
} level_zero_memory_provider_params_t;
20+
struct umf_level_zero_memory_provider_params_t;
21+
22+
/// @brief handle to the parameters of the Level Zero Memory Provider.
23+
typedef struct umf_level_zero_memory_provider_params_t
24+
*umf_level_zero_memory_provider_params_handle_t;
25+
26+
/// @brief Create a struct to store parameters of the Level Zero Memory Provider.
27+
/// @param hParams [out] handle to the newly created parameters struct.
28+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
29+
umf_result_t umfLevelZeroMemoryProviderParamsCreate(
30+
umf_level_zero_memory_provider_params_handle_t *hParams);
31+
32+
/// @brief Destroy parameters struct.
33+
/// @param hParams handle to the parameters of the Level Zero Memory Provider.
34+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
35+
umf_result_t umfLevelZeroMemoryProviderParamsDestroy(
36+
umf_level_zero_memory_provider_params_handle_t hParams);
37+
38+
/// @brief Set the Level Zero context handle in the parameters struct.
39+
/// @param hParams handle to the parameters of the Level Zero Memory Provider.
40+
/// @param hContext handle to the Level Zero context. Cannot be \p NULL.
41+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
42+
umf_result_t umfLevelZeroMemoryProviderParamsSetContext(
43+
umf_level_zero_memory_provider_params_handle_t hParams,
44+
ze_context_handle_t hContext);
45+
46+
/// @brief Set the Level Zero device handle in the parameters struct.
47+
/// @param hParams handle to the parameters of the Level Zero Memory Provider.
48+
/// @param hDevice handle to the Level Zero device. Can be \p NULL if memory type is \p UMF_MEMORY_TYPE_HOST.
49+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
50+
umf_result_t umfLevelZeroMemoryProviderParamsSetDevice(
51+
umf_level_zero_memory_provider_params_handle_t hParams,
52+
ze_device_handle_t hDevice);
53+
54+
/// @brief Set the memory type in the parameters struct.
55+
/// @param hParams handle to the parameters of the Level Zero Memory Provider.
56+
/// @param memoryType memory type.
57+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
58+
umf_result_t umfLevelZeroMemoryProviderParamsSetMemoryType(
59+
umf_level_zero_memory_provider_params_handle_t hParams,
60+
umf_usm_memory_type_t memoryType);
61+
62+
/// @brief Set the resident devices in the parameters struct.
63+
/// @param hParams handle to the parameters of the Level Zero Memory Provider.
64+
/// @param hDevices array of devices for which the memory should be made resident.
65+
/// @param deviceCount number of devices for which the memory should be made resident.
66+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
67+
umf_result_t umfLevelZeroMemoryProviderParamsSetResidentDevices(
68+
umf_level_zero_memory_provider_params_handle_t hParams,
69+
ze_device_handle_t *hDevices, uint32_t deviceCount);
3470

3571
umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void);
3672

src/libumf.def

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ EXPORTS
2828
umfGetIPCHandle
2929
umfGetLastFailedMemoryProvider
3030
umfLevelZeroMemoryProviderOps
31+
umfLevelZeroMemoryProviderParamsCreate
32+
umfLevelZeroMemoryProviderParamsDestroy
33+
umfLevelZeroMemoryProviderParamsSetContext
34+
umfLevelZeroMemoryProviderParamsSetDevice
35+
umfLevelZeroMemoryProviderParamsSetMemoryType
36+
umfLevelZeroMemoryProviderParamsSetResidentDevices
3137
umfMemoryProviderAlloc
3238
umfMemoryProviderAllocationMerge
3339
umfMemoryProviderAllocationSplit

src/libumf.map

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ UMF_1.0 {
2222
umfGetIPCHandle;
2323
umfGetLastFailedMemoryProvider;
2424
umfLevelZeroMemoryProviderOps;
25+
umfLevelZeroMemoryProviderParamsCreate;
26+
umfLevelZeroMemoryProviderParamsDestroy;
27+
umfLevelZeroMemoryProviderParamsSetContext;
28+
umfLevelZeroMemoryProviderParamsSetDevice;
29+
umfLevelZeroMemoryProviderParamsSetMemoryType;
30+
umfLevelZeroMemoryProviderParamsSetResidentDevices;
2531
umfMemoryProviderAlloc;
2632
umfMemoryProviderAllocationMerge;
2733
umfMemoryProviderAllocationSplit;

0 commit comments

Comments
 (0)