8
8
//
9
9
// ===----------------------------------------------------------------------===//
10
10
11
+ #include " ur/ur.hpp"
11
12
#include " ur_api.h"
12
13
13
14
#include " common.hpp"
15
+ #include " context.hpp"
16
+ #include < cstdlib>
17
+
18
+ namespace native_cpu {
19
+
20
+ static void *malloc_impl (uint32_t alignment, size_t size) {
21
+ void *ptr = nullptr ;
22
+ if (alignment) {
23
+ ptr = std::aligned_alloc (alignment, size);
24
+ } else {
25
+ ptr = malloc (size);
26
+ }
27
+ return ptr;
28
+ }
29
+
30
+ } // namespace native_cpu
14
31
15
32
UR_APIEXPORT ur_result_t UR_APICALL
16
33
urUSMHostAlloc (ur_context_handle_t hContext, const ur_usm_desc_t *pUSMDesc,
17
34
ur_usm_pool_handle_t pool, size_t size, void **ppMem) {
18
- std::ignore = hContext;
19
- std::ignore = pUSMDesc;
20
35
std::ignore = pool;
21
36
37
+ auto alignment = pUSMDesc ? pUSMDesc->align : 0u ;
38
+ UR_ASSERT ((alignment & (alignment - 1 )) == 0 , UR_RESULT_ERROR_INVALID_VALUE);
22
39
UR_ASSERT (ppMem, UR_RESULT_ERROR_INVALID_NULL_POINTER);
23
40
// TODO: Check Max size when UR_DEVICE_INFO_MAX_MEM_ALLOC_SIZE is implemented
24
41
UR_ASSERT (size > 0 , UR_RESULT_ERROR_INVALID_USM_SIZE);
25
42
26
- *ppMem = malloc (size);
43
+ void *ptr = native_cpu::malloc_impl (alignment, size);
44
+ UR_ASSERT (ptr != nullptr , UR_RESULT_ERROR_OUT_OF_HOST_MEMORY);
45
+ hContext->add_alloc_info_entry (ptr, UR_USM_TYPE_HOST, size, nullptr );
46
+ *ppMem = ptr;
27
47
28
48
return UR_RESULT_SUCCESS;
29
49
}
@@ -32,16 +52,19 @@ UR_APIEXPORT ur_result_t UR_APICALL
32
52
urUSMDeviceAlloc (ur_context_handle_t hContext, ur_device_handle_t hDevice,
33
53
const ur_usm_desc_t *pUSMDesc, ur_usm_pool_handle_t pool,
34
54
size_t size, void **ppMem) {
35
- std::ignore = hContext;
36
55
std::ignore = hDevice;
37
- std::ignore = pUSMDesc;
38
56
std::ignore = pool;
39
57
58
+ auto alignment = pUSMDesc ? pUSMDesc->align : 0u ;
59
+ UR_ASSERT ((alignment & (alignment - 1 )) == 0 , UR_RESULT_ERROR_INVALID_VALUE);
40
60
UR_ASSERT (ppMem, UR_RESULT_ERROR_INVALID_NULL_POINTER);
41
61
// TODO: Check Max size when UR_DEVICE_INFO_MAX_MEM_ALLOC_SIZE is implemented
42
62
UR_ASSERT (size > 0 , UR_RESULT_ERROR_INVALID_USM_SIZE);
43
63
44
- *ppMem = malloc (size);
64
+ void *ptr = native_cpu::malloc_impl (alignment, size);
65
+ UR_ASSERT (ptr != nullptr , UR_RESULT_ERROR_OUT_OF_RESOURCES);
66
+ *ppMem = ptr;
67
+ hContext->add_alloc_info_entry (ptr, UR_USM_TYPE_DEVICE, size, nullptr );
45
68
46
69
return UR_RESULT_SUCCESS;
47
70
}
@@ -50,26 +73,29 @@ UR_APIEXPORT ur_result_t UR_APICALL
50
73
urUSMSharedAlloc (ur_context_handle_t hContext, ur_device_handle_t hDevice,
51
74
const ur_usm_desc_t *pUSMDesc, ur_usm_pool_handle_t pool,
52
75
size_t size, void **ppMem) {
53
- std::ignore = hContext;
54
76
std::ignore = hDevice;
55
- std::ignore = pUSMDesc;
56
77
std::ignore = pool;
57
78
79
+ auto alignment = pUSMDesc ? pUSMDesc->align : 0u ;
80
+ UR_ASSERT ((alignment & (alignment - 1 )) == 0 , UR_RESULT_ERROR_INVALID_VALUE);
58
81
UR_ASSERT (ppMem, UR_RESULT_ERROR_INVALID_NULL_POINTER);
59
82
// TODO: Check Max size when UR_DEVICE_INFO_MAX_MEM_ALLOC_SIZE is implemented
60
83
UR_ASSERT (size > 0 , UR_RESULT_ERROR_INVALID_USM_SIZE);
61
84
62
- *ppMem = malloc (size);
85
+ void *ptr = native_cpu::malloc_impl (alignment, size);
86
+ UR_ASSERT (ptr != nullptr , UR_RESULT_ERROR_OUT_OF_HOST_MEMORY);
87
+ *ppMem = ptr;
88
+ hContext->add_alloc_info_entry (ptr, UR_USM_TYPE_SHARED, size, nullptr );
63
89
64
90
return UR_RESULT_SUCCESS;
65
91
}
66
92
67
93
UR_APIEXPORT ur_result_t UR_APICALL urUSMFree (ur_context_handle_t hContext,
68
94
void *pMem) {
69
- std::ignore = hContext;
70
95
71
96
UR_ASSERT (pMem, UR_RESULT_ERROR_INVALID_NULL_POINTER);
72
97
98
+ hContext->remove_alloc_info_entry (pMem);
73
99
free (pMem);
74
100
75
101
return UR_RESULT_SUCCESS;
@@ -79,19 +105,25 @@ UR_APIEXPORT ur_result_t UR_APICALL
79
105
urUSMGetMemAllocInfo (ur_context_handle_t hContext, const void *pMem,
80
106
ur_usm_alloc_info_t propName, size_t propSize,
81
107
void *pPropValue, size_t *pPropSizeRet) {
82
- std::ignore = hContext;
83
- std::ignore = pMem;
84
- std::ignore = propName;
85
- std::ignore = propSize;
86
- std::ignore = pPropValue;
87
- std::ignore = pPropSizeRet;
88
108
109
+ UR_ASSERT (pMem != nullptr , UR_RESULT_ERROR_INVALID_NULL_POINTER);
89
110
UrReturnHelper ReturnValue (propSize, pPropValue, pPropSizeRet);
111
+ if (propName == UR_USM_ALLOC_INFO_BASE_PTR) {
112
+ // TODO: logic to compute base ptr given ptr
113
+ DIE_NO_IMPLEMENTATION;
114
+ }
90
115
116
+ native_cpu::usm_alloc_info alloc_info = hContext->get_alloc_info_entry (pMem);
91
117
switch (propName) {
92
118
case UR_USM_ALLOC_INFO_TYPE:
93
- // Todo implement this in context
94
- return ReturnValue (UR_USM_TYPE_DEVICE);
119
+ return ReturnValue (alloc_info.type );
120
+ case UR_USM_ALLOC_INFO_SIZE:
121
+ return ReturnValue (alloc_info.size );
122
+ case UR_USM_ALLOC_INFO_DEVICE:
123
+ return ReturnValue (alloc_info.device );
124
+ case UR_USM_ALLOC_INFO_POOL:
125
+ return ReturnValue (alloc_info.pool );
126
+ ;
95
127
default :
96
128
DIE_NO_IMPLEMENTATION;
97
129
}
0 commit comments