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 );
5755error_mempolicy :
58- umfMemspaceDestroy ( hMemspace );
56+ umfMempolicyDestroy ( hPolicy );
5957error_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