Skip to content

Commit 7698d75

Browse files
committed
add example how to use filterById
1 parent 5d270d2 commit 7698d75

File tree

1 file changed

+105
-28
lines changed

1 file changed

+105
-28
lines changed

examples/memspace_numa/memspace_numa.c

Lines changed: 105 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
#include "utils_examples.h"
1919

2020
// 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) {
2324
int ret = 0;
2425
umf_result_t result;
2526
umf_memspace_handle_t hMemspace = NULL;
@@ -29,63 +30,99 @@ int createMemoryProvider(umf_memory_provider_handle_t *hProvider,
2930
// In this example, we create a memspace that contains single numa node;
3031
result = umfMemspaceCreateFromNumaArray(&numa, 1, &hMemspace);
3132
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;
3535
}
3636

3737
// Create a mempolicy - mempolicy defines how we want to use memory from memspace.
3838
// In this example, we want to bind memory to the specified numa node.
3939
result = umfMempolicyCreate(UMF_MEMPOLICY_BIND, &hPolicy);
4040
if (result != UMF_RESULT_SUCCESS) {
4141
ret = -1;
42-
fprintf(stderr, "umfMempolicyCreate failed.\n");
43-
goto error_mempolicy;
42+
fprintf(stderr, "umfMempolicyCreate failed().\n");
43+
goto error_memspace;
4444
}
4545

4646
// Create a memory provider using the memory space and memory policy
4747
result = umfMemoryProviderCreateFromMemspace(hMemspace, hPolicy, hProvider);
4848
if (result != UMF_RESULT_SUCCESS) {
4949
ret = -1;
50-
fprintf(stderr, "umfMemoryProviderCreateFromMemspace failed.\n");
51-
goto error_provider;
50+
fprintf(stderr, "umfMemoryProviderCreateFromMemspace failed().\n");
51+
goto error_mempolicy;
5252
}
5353

5454
// After creating the memory provider, we can destroy the memspace and mempolicy
55-
error_provider:
56-
umfMempolicyDestroy(hPolicy);
5755
error_mempolicy:
58-
umfMemspaceDestroy(hMemspace);
56+
umfMempolicyDestroy(hPolicy);
5957
error_memspace:
58+
umfMemspaceDestroy(hMemspace);
6059
return ret;
6160
}
6261

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;
6670

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;
7175
}
7276

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");
7781
return -1;
7882
}
7983

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) {
80117
// Allocate memory from the memory provider
81118
void *ptr = NULL;
82119
size_t size = 1024;
83120
size_t alignment = 64;
84121

85-
ret = umfMemoryProviderAlloc(hProvider, size, alignment, &ptr);
122+
umf_result_t ret = umfMemoryProviderAlloc(hProvider, size, alignment, &ptr);
86123
if (ret != UMF_RESULT_SUCCESS) {
87124
fprintf(stderr, "umfMemoryProviderAlloc failed.\n");
88-
goto error_alloc;
125+
return 1;
89126
}
90127

91128
// Use the allocated memory (ptr) here
@@ -95,14 +132,54 @@ int main(void) {
95132
int nodeId;
96133
int retm = get_mempolicy(&nodeId, NULL, 0, ptr, MPOL_F_ADDR | MPOL_F_NODE);
97134
if (retm != 0) {
135+
umfMemoryProviderFree(hProvider, ptr, size);
98136
fprintf(stderr, "get_mempolicy failed.\n");
99-
goto error_alloc;
137+
return 1;
100138
}
101139
printf("Allocated memory at %p from numa_node %d\n", ptr, nodeId);
102140
// Free the allocated memory
103141
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:
105182
umfMemoryProviderDestroy(hProvider);
106183

107-
return ret == UMF_RESULT_SUCCESS ? 0 : 1;
184+
return 1;
108185
}

0 commit comments

Comments
 (0)