18
18
#include "utils_examples.h"
19
19
20
20
// Function to create a memory provider which allocates memory from the specified NUMA node
21
- int createMemoryProvider (umf_memory_provider_handle_t * hProvider ,
22
- unsigned numa ) {
21
+ // by using umfMemspaceCreateFromNumaArray
22
+ int createMemoryProviderFromArray (umf_memory_provider_handle_t * hProvider ,
23
+ unsigned numa ) {
23
24
int ret = 0 ;
24
25
umf_result_t result ;
25
26
umf_memspace_handle_t hMemspace = NULL ;
@@ -29,63 +30,99 @@ int createMemoryProvider(umf_memory_provider_handle_t *hProvider,
29
30
// In this example, we create a memspace that contains single numa node;
30
31
result = umfMemspaceCreateFromNumaArray (& numa , 1 , & hMemspace );
31
32
if (result != UMF_RESULT_SUCCESS ) {
32
- ret = -1 ;
33
- fprintf (stderr , "umfMemspaceCreateFromNumaArray failed.\n" );
34
- goto error_memspace ;
33
+ fprintf (stderr , "umfMemspaceCreateFromNumaArray() failed.\n" );
34
+ return -1 ;
35
35
}
36
36
37
37
// Create a mempolicy - mempolicy defines how we want to use memory from memspace.
38
38
// In this example, we want to bind memory to the specified numa node.
39
39
result = umfMempolicyCreate (UMF_MEMPOLICY_BIND , & hPolicy );
40
40
if (result != UMF_RESULT_SUCCESS ) {
41
41
ret = -1 ;
42
- fprintf (stderr , "umfMempolicyCreate failed.\n" );
43
- goto error_mempolicy ;
42
+ fprintf (stderr , "umfMempolicyCreate failed() .\n" );
43
+ goto error_memspace ;
44
44
}
45
45
46
46
// Create a memory provider using the memory space and memory policy
47
47
result = umfMemoryProviderCreateFromMemspace (hMemspace , hPolicy , hProvider );
48
48
if (result != UMF_RESULT_SUCCESS ) {
49
49
ret = -1 ;
50
- fprintf (stderr , "umfMemoryProviderCreateFromMemspace failed.\n" );
51
- goto error_provider ;
50
+ fprintf (stderr , "umfMemoryProviderCreateFromMemspace failed() .\n" );
51
+ goto error_mempolicy ;
52
52
}
53
53
54
54
// After creating the memory provider, we can destroy the memspace and mempolicy
55
- error_provider :
56
- umfMempolicyDestroy (hPolicy );
57
55
error_mempolicy :
58
- umfMemspaceDestroy ( hMemspace );
56
+ umfMempolicyDestroy ( hPolicy );
59
57
error_memspace :
58
+ umfMemspaceDestroy (hMemspace );
60
59
return ret ;
61
60
}
62
61
63
- int main (void ) {
64
- umf_memory_provider_handle_t hProvider = NULL ;
65
- umf_result_t ret ;
62
+ // Function to create a memory provider which allocates memory from the specified NUMA node
63
+ // by using filter function.
64
+ int createMemoryProviderByFilter (umf_memory_provider_handle_t * hProvider ,
65
+ unsigned numa ) {
66
+ int ret = 0 ;
67
+ umf_result_t result ;
68
+ umf_memspace_handle_t hMemspace = NULL ;
69
+ umf_mempolicy_handle_t hPolicy = NULL ;
66
70
67
- // Check if NUMA is available
68
- if (numa_available () < 0 ) {
69
- fprintf (stderr , "NUMA is not available on this system. \n" );
70
- return TEST_SKIP_ERROR_CODE ;
71
+ umf_const_memspace_handle_t hostAll = umfMemspaceHostAllGet ();
72
+ if (! hostAll ) {
73
+ fprintf (stderr , "umfMemspaceHostAllGet() failed \n" );
74
+ return -1 ;
71
75
}
72
76
73
- // Create the memory provider that allocates memory from the specified NUMA node
74
- // In this example, we allocate memory from the NUMA node 0
75
- ret = createMemoryProvider ( & hProvider , 0 );
76
- if ( ret != UMF_RESULT_SUCCESS ) {
77
+ // umfMemspaceHostAllGet() return immutable memspace, so we need to create a mutable copy
78
+ result = umfMemspaceClone ( hostAll , & hMemspace );
79
+ if ( result != UMF_RESULT_SUCCESS ) {
80
+ fprintf ( stderr , "umfMempolicyClone() failed.\n" );
77
81
return -1 ;
78
82
}
79
83
84
+ // Filter the memspace to contain only the specified numa node
85
+ result = umfMemspaceFilterById (hMemspace , & numa , 1 );
86
+ if (result != UMF_RESULT_SUCCESS ) {
87
+ ret = -1 ;
88
+ fprintf (stderr , "umfMemspaceFilterById() failed.\n" );
89
+ goto error_memspace ;
90
+ }
91
+
92
+ // Create a mempolicy - mempolicy defines how we want to use memory from memspace.
93
+ // In this example, we want to bind memory to the specified numa node.
94
+ result = umfMempolicyCreate (UMF_MEMPOLICY_BIND , & hPolicy );
95
+ if (result != UMF_RESULT_SUCCESS ) {
96
+ ret = -1 ;
97
+ fprintf (stderr , "umfMempolicyCreate() failed.\n" );
98
+ goto error_memspace ;
99
+ }
100
+ // Create a memory provider using the memory space and memory policy
101
+ result = umfMemoryProviderCreateFromMemspace (hMemspace , hPolicy , hProvider );
102
+ if (result != UMF_RESULT_SUCCESS ) {
103
+ ret = -1 ;
104
+ fprintf (stderr , "umfMemoryProviderCreateFromMemspace() failed.\n" );
105
+ goto error_mempolicy ;
106
+ }
107
+
108
+ // After creating the memory provider, we can destroy the memspace and mempolicy
109
+ error_mempolicy :
110
+ umfMempolicyDestroy (hPolicy );
111
+ error_memspace :
112
+ umfMemspaceDestroy (hMemspace );
113
+ return ret ;
114
+ }
115
+
116
+ int use_memory_provider (umf_memory_provider_handle_t hProvider ) {
80
117
// Allocate memory from the memory provider
81
118
void * ptr = NULL ;
82
119
size_t size = 1024 ;
83
120
size_t alignment = 64 ;
84
121
85
- ret = umfMemoryProviderAlloc (hProvider , size , alignment , & ptr );
122
+ umf_result_t ret = umfMemoryProviderAlloc (hProvider , size , alignment , & ptr );
86
123
if (ret != UMF_RESULT_SUCCESS ) {
87
124
fprintf (stderr , "umfMemoryProviderAlloc failed.\n" );
88
- goto error_alloc ;
125
+ return 1 ;
89
126
}
90
127
91
128
// Use the allocated memory (ptr) here
@@ -95,14 +132,54 @@ int main(void) {
95
132
int nodeId ;
96
133
int retm = get_mempolicy (& nodeId , NULL , 0 , ptr , MPOL_F_ADDR | MPOL_F_NODE );
97
134
if (retm != 0 ) {
135
+ umfMemoryProviderFree (hProvider , ptr , size );
98
136
fprintf (stderr , "get_mempolicy failed.\n" );
99
- goto error_alloc ;
137
+ return 1 ;
100
138
}
101
139
printf ("Allocated memory at %p from numa_node %d\n" , ptr , nodeId );
102
140
// Free the allocated memory
103
141
umfMemoryProviderFree (hProvider , ptr , size );
104
- error_alloc :
142
+
143
+ return 0 ;
144
+ }
145
+
146
+ int main (void ) {
147
+ umf_memory_provider_handle_t hProvider = NULL ;
148
+ umf_result_t ret ;
149
+
150
+ // Check if NUMA is available
151
+ if (numa_available () < 0 ) {
152
+ fprintf (stderr , "NUMA is not available on this system.\n" );
153
+ return TEST_SKIP_ERROR_CODE ;
154
+ }
155
+
156
+ // Create the memory provider that allocates memory from the specified NUMA node
157
+ // In this example, we allocate memory from the NUMA node 0
158
+ ret = createMemoryProviderFromArray (& hProvider , 0 );
159
+ if (ret != UMF_RESULT_SUCCESS ) {
160
+ return -1 ;
161
+ }
162
+
163
+ if (use_memory_provider (hProvider )) {
164
+ goto error ;
165
+ }
166
+
167
+ umfMemoryProviderDestroy (hProvider );
168
+
169
+ // We can achieve the same result by using filter functions
170
+ ret = createMemoryProviderByFilter (& hProvider , 0 );
171
+ if (ret != UMF_RESULT_SUCCESS ) {
172
+ return -1 ;
173
+ }
174
+
175
+ if (use_memory_provider (hProvider )) {
176
+ goto error ;
177
+ }
178
+
179
+ umfMemoryProviderDestroy (hProvider );
180
+ return 0 ;
181
+ error :
105
182
umfMemoryProviderDestroy (hProvider );
106
183
107
- return ret == UMF_RESULT_SUCCESS ? 0 : 1 ;
184
+ return 1 ;
108
185
}
0 commit comments