Skip to content

Commit f24c907

Browse files
committed
a
1 parent 0c09d06 commit f24c907

File tree

14 files changed

+474
-292
lines changed

14 files changed

+474
-292
lines changed

benchmark/ubench.c

Lines changed: 170 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: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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_PROPERTIES_HANDLE,
27+
UMF_MEMORY_PROVIDER_HANDLE,
28+
UMF_MEMORY_PROVIDER_OPS, // == type?
29+
UMF_MEMORY_POOL_HANDLE,
30+
UMF_MEMORY_POOL_OPS, // == type?
31+
32+
// generic pointer properties
33+
UMF_MEMORY_PROPERTY_POINTER_TYPE, /// unr host, reg host ??, dev, managed or umf_usm_memory_type_t?
34+
UMF_MEMORY_PROPERTY_BASE_ADDRESS, ///< base address
35+
UMF_MEMORY_PROPERTY_BASE_SIZE, ///< base size
36+
37+
// GPU specyfic
38+
UMF_MEMORY_PROPERTY_DEVICE, ///< handle (ze) or id (cuda)
39+
UMF_MEMORY_PROPERTY_BUFFER_ID, /// unique id NOTE: this id is unique across all UMF allocs and != L0 or CUDA ID
40+
UMF_MEMORY_PROPERTY_DEVICE_ATTRIBUTES, ///< ze_memory_allocation_properties_t ?
41+
42+
// all cuda + l0
43+
// next other providers?
44+
// todo return type?
45+
46+
/// @cond
47+
UMF_MEMORY_PROPERTY_MAX_RESERVED = 0x1000, ///< Maximum reserved value
48+
/// @endcond
49+
50+
} umf_memory_property_id_t;
51+
52+
typedef struct umf_memory_properties_t *umf_memory_properties_handle_t;
53+
54+
/// @brief TODO
55+
umf_result_t
56+
umfGetMemoryProperty(void *ptr, umf_memory_property_id_t memory_property_id,
57+
umf_memory_properties_handle_t props_handle /* optional */,
58+
void *value);
59+
60+
#ifdef __cplusplus
61+
}
62+
#endif
63+
64+
#endif /* UMF_MEMORY_PROPS_H */

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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ EXPORTS
139139
umfCtlExec
140140
umfCtlGet
141141
umfCtlSet
142+
umfGetMemoryProperty
142143
umfJemallocPoolParamsCreate
143144
umfJemallocPoolParamsDestroy
144145
umfJemallocPoolParamsSetNumArenas

src/libumf.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ UMF_0.12 {
139139
umfCtlExec;
140140
umfCtlGet;
141141
umfCtlSet;
142+
umfGetMemoryProperty;
142143
umfJemallocPoolParamsCreate;
143144
umfJemallocPoolParamsDestroy;
144145
umfJemallocPoolParamsSetNumArenas;

src/memory_props.c

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
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_level_zero.h>
12+
13+
#include "memory_props_internal.h"
14+
#include "memory_provider_internal.h"
15+
#include "provider/provider_level_zero_internal.h"
16+
#include "provider/provider_tracking.h"
17+
18+
umf_result_t
19+
umfGetMemoryProperty(void *ptr, umf_memory_property_id_t memory_property_id,
20+
umf_memory_properties_handle_t props_handle /* optional */,
21+
void *value) {
22+
23+
if ((ptr == NULL) || (value == NULL) ||
24+
(memory_property_id == UMF_MEMORY_PROPERTY_INVALID) ||
25+
(memory_property_id >= UMF_MEMORY_PROPERTY_MAX_RESERVED)) {
26+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
27+
}
28+
29+
umf_memory_properties_handle_t props = NULL;
30+
if (props_handle != NULL) {
31+
props = props_handle;
32+
} else {
33+
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
34+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
35+
if (ret != UMF_RESULT_SUCCESS) {
36+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
37+
}
38+
props = allocInfo.props;
39+
}
40+
41+
switch (memory_property_id) {
42+
case UMF_MEMORY_PROPERTIES_HANDLE:
43+
*(umf_memory_properties_handle_t *)value = props;
44+
return UMF_RESULT_SUCCESS;
45+
46+
case UMF_MEMORY_POOL_HANDLE:
47+
*(umf_memory_pool_handle_t *)value = props->pool;
48+
return UMF_RESULT_SUCCESS;
49+
50+
case UMF_MEMORY_PROPERTY_BUFFER_ID:
51+
*(uint64_t *)value = props->id;
52+
return UMF_RESULT_SUCCESS;
53+
54+
default:
55+
break;
56+
}
57+
58+
// properties that are related to the memory provider
59+
umf_memory_provider_t *provider = NULL;
60+
umfPoolGetMemoryProvider(props->pool, &provider);
61+
assert(provider != NULL);
62+
63+
switch (memory_property_id) {
64+
case UMF_MEMORY_PROPERTY_POINTER_TYPE:
65+
if (provider->ops.get_name(provider) ==
66+
umfLevelZeroMemoryProviderOps()->get_name(provider)) {
67+
ze_memory_provider_t *ze_provider =
68+
(ze_memory_provider_t *)provider->provider_priv;
69+
*(umf_usm_memory_type_t *)value = ze_provider->memory_type;
70+
return UMF_RESULT_SUCCESS;
71+
}
72+
break;
73+
74+
case UMF_MEMORY_PROPERTY_DEVICE:
75+
if (provider->ops.get_name(provider) ==
76+
umfLevelZeroMemoryProviderOps()->get_name(provider)) {
77+
ze_memory_provider_t *ze_provider =
78+
(ze_memory_provider_t *)provider->provider_priv;
79+
*(ze_device_handle_t *)value = ze_provider->device;
80+
return UMF_RESULT_SUCCESS;
81+
}
82+
break;
83+
84+
case UMF_MEMORY_PROPERTY_DEVICE_ATTRIBUTES:
85+
if (provider->ops.get_name(provider) ==
86+
umfLevelZeroMemoryProviderOps()->get_name(provider)) {
87+
// TODO comment
88+
if (props->gpu_properties_initialized == false) {
89+
ze_memory_provider_t *ze_provider =
90+
(ze_memory_provider_t *)provider->provider_priv;
91+
props->gpu.ze_properties.stype =
92+
ZE_STRUCTURE_TYPE_MEMORY_ALLOCATION_PROPERTIES;
93+
ze_provider->ze_ops->zeMemGetAllocProperties(
94+
ze_provider->context, ptr, &props->gpu.ze_properties, NULL);
95+
props->gpu_properties_initialized = true;
96+
}
97+
ze_memory_allocation_properties_t *ze_properties =
98+
&props->gpu.ze_properties;
99+
*(ze_memory_allocation_properties_t **)value = ze_properties;
100+
return UMF_RESULT_SUCCESS;
101+
}
102+
break;
103+
104+
default:
105+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
106+
}
107+
108+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
109+
}

src/memory_props_internal.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
#include "ze_api.h"
19+
20+
#ifdef __cplusplus
21+
extern "C" {
22+
#endif
23+
24+
typedef struct umf_memory_properties_t {
25+
umf_memory_pool_handle_t pool;
26+
uint64_t id;
27+
28+
// TODO
29+
bool gpu_properties_initialized;
30+
union {
31+
ze_memory_allocation_properties_t ze_properties;
32+
} gpu;
33+
} umf_memory_properties_t;
34+
35+
#ifdef __cplusplus
36+
}
37+
#endif
38+
39+
#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)(

0 commit comments

Comments
 (0)