Skip to content

Commit 92db71d

Browse files
committed
a
1 parent e32fcc7 commit 92db71d

16 files changed

+517
-247
lines changed

benchmark/ubench.c

Lines changed: 168 additions & 225 deletions
Large diffs are not rendered by default.

docs/config/api.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ memory as well as functions that create, destroy and operate on the pool.
2828
.. doxygenfile:: memory_pool.h
2929
:sections: define enum typedef func var
3030

31+
TODO
32+
------------------------------------------
33+
34+
TODO
35+
36+
.. doxygenfile:: memory_props.h
37+
:sections: define enum typedef func var
38+
3139
Disjoint Pool
3240
------------------------------------------
3341

include/umf/memory_props.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
*
3+
* Copyright (C) 2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMORY_PROPS_H
11+
#define UMF_MEMORY_PROPS_H 1
12+
13+
#include <umf/base.h>
14+
#include <umf/memory_pool.h>
15+
16+
#ifdef __cplusplus
17+
extern "C" {
18+
#endif
19+
20+
/// @brief TODO
21+
// write about experimental api
22+
typedef enum umf_memory_property_id_t {
23+
UMF_MEMORY_PROPERTY_INVALID = -1, ///< TODO
24+
25+
// UMF specyfic
26+
UMF_MEMORY_PROVIDER_HANDLE,
27+
UMF_MEMORY_PROVIDER_OPS, // == type?
28+
UMF_MEMORY_POOL_HANDLE,
29+
UMF_MEMORY_POOL_OPS, // == type?
30+
31+
// generic pointer properties
32+
UMF_MEMORY_PROPERTY_POINTER_TYPE, // unreg host, reg host ??, dev, managed or umf_usm_memory_type_t?
33+
UMF_MEMORY_PROPERTY_BASE_ADDRESS, // base address
34+
UMF_MEMORY_PROPERTY_BASE_SIZE, // base size
35+
36+
// GPU specyfic
37+
UMF_MEMORY_PROPERTY_DEVICE, // handle (ze) or id (cuda)
38+
UMF_MEMORY_PROPERTY_BUFFER_ID, // unique id NOTE: this id is unique across all UMF allocs and != L0 or CUDA ID
39+
UMF_MEMORY_PROPERTY_DEVICE_ATTRIBUTES, // ze_memory_allocation_properties_t ?
40+
41+
// all cuda + l0
42+
// next other providers?
43+
// todo return type?
44+
45+
/// @cond
46+
UMF_MEMORY_PROPERTY_MAX_RESERVED = 0x1000, ///< Maximum reserved value
47+
/// @endcond
48+
49+
} umf_memory_property_id_t;
50+
51+
typedef struct umf_memory_properties_t *umf_memory_properties_handle_t;
52+
53+
/// @brief TODO
54+
umf_result_t
55+
umfGetMemoryPropertiesHandle(void *ptr,
56+
umf_memory_properties_handle_t *props_handle);
57+
58+
/// @brief TODO
59+
umf_result_t umfGetMemoryProperty(umf_memory_properties_handle_t props_handle,
60+
umf_memory_property_id_t memory_property_id,
61+
void *value);
62+
63+
#ifdef __cplusplus
64+
}
65+
#endif
66+
67+
#endif /* UMF_MEMORY_PROPS_H */

include/umf/providers/provider_level_zero.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#ifndef UMF_PROVIDER_LEVEL_ZERO_H
99
#define UMF_PROVIDER_LEVEL_ZERO_H
1010

11+
#include <umf/memory_props.h>
1112
#include <umf/memory_provider_gpu.h>
1213

1314
#ifdef __cplusplus
@@ -91,6 +92,11 @@ umf_result_t umfLevelZeroMemoryProviderParamsSetDeviceOrdinal(
9192
umf_level_zero_memory_provider_params_handle_t hParams,
9293
uint32_t deviceOrdinal);
9394

95+
/// TODO
96+
umf_result_t umfLevelZeroMemoryProviderGetMemoryProperty(
97+
umf_memory_properties_handle_t props_handle,
98+
umf_memory_property_id_t memory_property_id, void *value);
99+
94100
const umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void);
95101

96102
#ifdef __cplusplus

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ set(UMF_SOURCES
6666
ipc.c
6767
ipc_cache.c
6868
memory_pool.c
69+
memory_props.c
6970
memory_provider.c
7071
memory_provider_get_last_failed.c
7172
memtarget.c

src/ipc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
6565
return ret;
6666
}
6767

68-
ret = umfPoolGetIPCHandleSize(allocInfo.pool, &ipcHandleSize);
68+
ret = umfPoolGetIPCHandleSize(allocInfo.props->pool, &ipcHandleSize);
6969
if (ret != UMF_RESULT_SUCCESS) {
7070
LOG_ERR("cannot get IPC handle size.");
7171
return ret;
@@ -79,7 +79,7 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
7979

8080
// We cannot use umfPoolGetMemoryProvider function because it returns
8181
// upstream provider but we need tracking one
82-
umf_memory_provider_handle_t provider = allocInfo.pool->provider;
82+
umf_memory_provider_handle_t provider = allocInfo.props->pool->provider;
8383
assert(provider);
8484

8585
ret = umfMemoryProviderGetIPCHandle(provider, allocInfo.base,

src/libumf.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ EXPORTS
139139
umfCtlExec
140140
umfCtlGet
141141
umfCtlSet
142+
umfGetMemoryPropertiesHandle
143+
umfGetMemoryProperty
142144
umfJemallocPoolParamsCreate
143145
umfJemallocPoolParamsDestroy
144146
umfJemallocPoolParamsSetNumArenas

src/libumf.map

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ UMF_0.12 {
139139
umfCtlExec;
140140
umfCtlGet;
141141
umfCtlSet;
142+
umfGetMemoryPropertiesHandle;
143+
umfGetMemoryProperty;
142144
umfJemallocPoolParamsCreate;
143145
umfJemallocPoolParamsDestroy;
144146
umfJemallocPoolParamsSetNumArenas;

src/memory_props.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
*
3+
* Copyright (C) 2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#include <umf/memory_props.h>
11+
#include <umf/providers/provider_cuda.h>
12+
#include <umf/providers/provider_level_zero.h>
13+
14+
#include "memory_props_internal.h"
15+
#include "memory_provider_internal.h"
16+
#include "provider/provider_tracking.h"
17+
18+
umf_result_t
19+
umfGetMemoryPropertiesHandle(void *ptr,
20+
umf_memory_properties_handle_t *props_handle) {
21+
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
22+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
23+
if (ret != UMF_RESULT_SUCCESS) {
24+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
25+
}
26+
27+
*props_handle = allocInfo.props;
28+
return UMF_RESULT_SUCCESS;
29+
}
30+
31+
umf_result_t umfGetMemoryProperty(umf_memory_properties_handle_t props_handle,
32+
umf_memory_property_id_t memory_property_id,
33+
void *value) {
34+
if ((value == NULL) ||
35+
(memory_property_id == UMF_MEMORY_PROPERTY_INVALID) ||
36+
(memory_property_id >= UMF_MEMORY_PROPERTY_MAX_RESERVED) ||
37+
props_handle == NULL) {
38+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
39+
}
40+
41+
switch (memory_property_id) {
42+
case UMF_MEMORY_POOL_HANDLE:
43+
*(umf_memory_pool_handle_t *)value = props_handle->pool;
44+
return UMF_RESULT_SUCCESS;
45+
46+
case UMF_MEMORY_PROPERTY_BUFFER_ID:
47+
*(uint64_t *)value = props_handle->id;
48+
return UMF_RESULT_SUCCESS;
49+
50+
default:
51+
break;
52+
}
53+
54+
// properties that are related to the memory provider
55+
umf_memory_provider_t *provider = NULL;
56+
umfPoolGetMemoryProvider(props_handle->pool, &provider);
57+
assert(provider != NULL);
58+
59+
switch (memory_property_id) {
60+
// GPU Memory Provider specyfic properties
61+
case UMF_MEMORY_PROPERTY_POINTER_TYPE:
62+
case UMF_MEMORY_PROPERTY_DEVICE:
63+
case UMF_MEMORY_PROPERTY_DEVICE_ATTRIBUTES:
64+
if (provider->ops.get_name(provider) ==
65+
umfLevelZeroMemoryProviderOps()->get_name(provider)) {
66+
return umfLevelZeroMemoryProviderGetMemoryProperty(
67+
props_handle, memory_property_id, value);
68+
} else if (provider->ops.get_name(provider) ==
69+
umfCUDAMemoryProviderOps()->get_name(provider)) {
70+
// TODO
71+
assert(0);
72+
return UMF_RESULT_SUCCESS;
73+
}
74+
// no provider found
75+
return UMF_RESULT_ERROR_UNKNOWN;
76+
77+
default:
78+
break;
79+
}
80+
81+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
82+
}

src/memory_props_internal.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
*
3+
* Copyright (C) 2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_MEMORY_PROPS_INTERNAL_H
11+
#define UMF_MEMORY_PROPS_INTERNAL_H 1
12+
13+
#include <stdbool.h>
14+
15+
#include <umf/base.h>
16+
#include <umf/memory_props.h>
17+
18+
#if UMF_BUILD_LEVEL_ZERO_PROVIDER
19+
#include "ze_api.h"
20+
#endif
21+
22+
#ifdef __cplusplus
23+
extern "C" {
24+
#endif
25+
26+
typedef struct umf_memory_properties_t {
27+
void *ptr;
28+
umf_memory_pool_handle_t pool;
29+
uint64_t id;
30+
31+
// TODO
32+
bool gpu_properties_initialized;
33+
union {
34+
#if UMF_BUILD_LEVEL_ZERO_PROVIDER
35+
ze_memory_allocation_properties_t ze_properties;
36+
#endif
37+
int unused; // in case of no GPU support
38+
} gpu;
39+
} umf_memory_properties_t;
40+
41+
#ifdef __cplusplus
42+
}
43+
#endif
44+
45+
#endif // UMF_MEMORY_PROPS_INTERNAL_H

src/memory_provider.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
#include <stdio.h>
1313
#include <stdlib.h>
1414

15+
#include <umf/base.h>
1516
#include <umf/memory_provider.h>
1617

1718
#include "base_alloc.h"
1819
#include "base_alloc_global.h"
1920
#include "libumf.h"
2021
#include "memory_provider_internal.h"
21-
#include "umf/base.h"
2222
#include "utils_assert.h"
2323

2424
static int CTL_SUBTREE_HANDLER(by_handle_provider)(

src/provider/provider_level_zero.c

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
#include <string.h>
1212

1313
#include <umf.h>
14+
#include <umf/memory_props.h>
1415
#include <umf/memory_provider_ops.h>
1516
#include <umf/providers/provider_level_zero.h>
1617

17-
#include "provider_level_zero_internal.h"
18+
#include "memory_props_internal.h"
19+
#include "memory_provider_internal.h"
20+
#include "provider/provider_level_zero_internal.h"
1821
#include "utils_load_library.h"
1922
#include "utils_log.h"
2023

@@ -31,6 +34,7 @@ void fini_ze_global_state(void) {
3134

3235
#include "base_alloc_global.h"
3336
#include "libumf.h"
37+
#include "provider_level_zero_internal.h"
3438
#include "utils_assert.h"
3539
#include "utils_common.h"
3640
#include "utils_concurrency.h"
@@ -61,7 +65,7 @@ typedef struct umf_level_zero_memory_provider_params_t {
6165
typedef struct ze_memory_provider_t {
6266
ze_context_handle_t context;
6367
ze_device_handle_t device;
64-
ze_memory_type_t memory_type;
68+
umf_usm_memory_type_t memory_type;
6569

6670
ze_device_handle_t *resident_device_handles;
6771
uint32_t resident_device_count;
@@ -502,7 +506,7 @@ static umf_result_t ze_memory_provider_initialize(const void *params,
502506

503507
ze_provider->context = ze_params->level_zero_context_handle;
504508
ze_provider->device = ze_params->level_zero_device_handle;
505-
ze_provider->memory_type = (ze_memory_type_t)ze_params->memory_type;
509+
ze_provider->memory_type = ze_params->memory_type;
506510
ze_provider->freePolicyFlags =
507511
umfFreePolicyToZePolicy(ze_params->freePolicy);
508512
ze_provider->min_page_size = 0;
@@ -760,6 +764,50 @@ ze_memory_provider_close_ipc_handle(void *provider, void *ptr, size_t size) {
760764
return UMF_RESULT_SUCCESS;
761765
}
762766

767+
umf_result_t umfLevelZeroMemoryProviderGetMemoryProperty(
768+
umf_memory_properties_handle_t props_handle,
769+
umf_memory_property_id_t memory_property_id, void *value) {
770+
771+
umf_memory_provider_t *provider = NULL;
772+
umfPoolGetMemoryProvider(props_handle->pool, &provider);
773+
assert(provider != NULL);
774+
assert(provider->ops.get_name(provider) ==
775+
umfLevelZeroMemoryProviderOps()->get_name(provider));
776+
777+
ze_memory_provider_t *ze_provider =
778+
(ze_memory_provider_t *)provider->provider_priv;
779+
780+
switch (memory_property_id) {
781+
case UMF_MEMORY_PROPERTY_POINTER_TYPE:
782+
*(umf_usm_memory_type_t *)value = ze_provider->memory_type;
783+
return UMF_RESULT_SUCCESS;
784+
785+
case UMF_MEMORY_PROPERTY_DEVICE:
786+
*(ze_device_handle_t *)value = ze_provider->device;
787+
return UMF_RESULT_SUCCESS;
788+
789+
case UMF_MEMORY_PROPERTY_DEVICE_ATTRIBUTES:
790+
// TODO comment
791+
if (props_handle->gpu_properties_initialized == false) {
792+
props_handle->gpu.ze_properties.stype =
793+
ZE_STRUCTURE_TYPE_MEMORY_ALLOCATION_PROPERTIES;
794+
g_ze_ops.zeMemGetAllocProperties(
795+
ze_provider->context, props_handle->ptr,
796+
&props_handle->gpu.ze_properties, NULL);
797+
props_handle->gpu_properties_initialized = true;
798+
}
799+
ze_memory_allocation_properties_t *ze_properties =
800+
&props_handle->gpu.ze_properties;
801+
*(ze_memory_allocation_properties_t **)value = ze_properties;
802+
return UMF_RESULT_SUCCESS;
803+
804+
default:
805+
break;
806+
}
807+
808+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
809+
}
810+
763811
static umf_memory_provider_ops_t UMF_LEVEL_ZERO_MEMORY_PROVIDER_OPS = {
764812
.version = UMF_PROVIDER_OPS_VERSION_CURRENT,
765813
.initialize = ze_memory_provider_initialize,
@@ -867,4 +915,13 @@ const umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) {
867915
return NULL;
868916
}
869917

918+
umf_result_t umfLevelZeroMemoryProviderGetMemoryProperty(
919+
umf_memory_properties_handle_t props_handle,
920+
umf_memory_property_id_t memory_property_id, void *value) {
921+
(void)props_handle;
922+
(void)memory_property_id;
923+
(void)value;
924+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
925+
}
926+
870927
#endif // !UMF_BUILD_LEVEL_ZERO_PROVIDER

0 commit comments

Comments
 (0)