Skip to content

Commit a548359

Browse files
committed
Use hwloc instead of libnuma for memory binding
1 parent 24782d7 commit a548359

File tree

8 files changed

+270
-164
lines changed

8 files changed

+270
-164
lines changed

include/umf/providers/provider_os_memory.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ typedef enum umf_numa_mode_t {
3434
UMF_NUMA_MODE_DEFAULT,
3535
UMF_NUMA_MODE_BIND,
3636
UMF_NUMA_MODE_INTERLEAVE,
37+
/* TODO: consider removing UMF_NUMA_MODE_PREFERRED and rely only on combination of BIND mode and STRICT flag like hwloc */
3738
UMF_NUMA_MODE_PREFERRED,
3839
UMF_NUMA_MODE_LOCAL,
3940
UMF_NUMA_MODE_STATIC_NODES,

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ if(UMF_BUILD_OS_MEMORY_PROVIDER)
3737
memory_targets/memory_target_numa.c
3838
memspaces/memspace_numa.c)
3939
if(LINUX)
40-
set(UMF_LIBS ${UMF_LIBS} numa)
40+
set(UMF_LIBS ${UMF_LIBS} hwloc)
4141
endif()
4242
endif()
4343

src/memory_targets/memory_target_numa.c

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*/
99

1010
#include <assert.h>
11-
#include <numa.h>
11+
#include <hwloc.h>
1212
#include <stdlib.h>
1313

1414
#include "../memory_pool_internal.h"
@@ -50,37 +50,52 @@ static const umf_os_memory_provider_params_t
5050
// NUMA config
5151
.nodemask = NULL,
5252
.maxnode = 0, // TODO: numa_max_node/GetNumaHighestNodeNumber
53-
.numa_mode = UMF_NUMA_MODE_DEFAULT,
53+
.numa_mode = UMF_NUMA_MODE_BIND,
5454
.numa_flags = UMF_NUMA_FLAGS_STRICT, // TODO: determine default behavior
5555

5656
// Logging
5757
.traces = 0, // TODO: parse env variable for log level?
5858
};
5959

60-
static size_t numa_targets_get_maxnode(struct numa_memory_target_t **targets,
61-
size_t numTargets) {
62-
size_t maxNode = 0;
63-
for (size_t i = 0; i < numTargets; i++) {
64-
maxNode = maxNode > targets[i]->id ? maxNode : targets[i]->id;
65-
}
66-
return maxNode;
67-
}
68-
69-
static struct bitmask *
60+
static umf_result_t
7061
numa_targets_create_nodemask(struct numa_memory_target_t **targets,
71-
size_t numTargets) {
62+
size_t numTargets, unsigned long **mask,
63+
unsigned *maxnode) {
7264
assert(targets);
73-
size_t maxNode = numa_targets_get_maxnode(targets, numTargets);
74-
struct bitmask *mask = numa_bitmask_alloc(maxNode + 1);
75-
if (!mask) {
76-
return NULL;
65+
assert(mask);
66+
assert(maxnode);
67+
68+
hwloc_bitmap_t bitmap = hwloc_bitmap_alloc();
69+
if (!bitmap) {
70+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
7771
}
7872

7973
for (size_t i = 0; i < numTargets; i++) {
80-
numa_bitmask_setbit(mask, targets[i]->id);
74+
if (hwloc_bitmap_set(bitmap, targets[i]->id)) {
75+
hwloc_bitmap_free(bitmap);
76+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
77+
}
78+
}
79+
80+
int nrUlongs = hwloc_bitmap_nr_ulongs(bitmap);
81+
if (nrUlongs == -1) {
82+
hwloc_bitmap_free(bitmap);
83+
return UMF_RESULT_ERROR_UNKNOWN;
8184
}
8285

83-
return mask;
86+
unsigned long *nodemask = malloc(sizeof(unsigned long) * nrUlongs);
87+
int ret = hwloc_bitmap_to_ulongs(bitmap, nrUlongs, nodemask);
88+
hwloc_bitmap_free(bitmap);
89+
90+
if (ret) {
91+
free(nodemask);
92+
return UMF_RESULT_ERROR_UNKNOWN;
93+
}
94+
95+
*mask = nodemask;
96+
*maxnode = nrUlongs * sizeof(unsigned long) * 8;
97+
98+
return UMF_RESULT_SUCCESS;
8499
}
85100

86101
static enum umf_result_t numa_memory_provider_create_from_memspace(
@@ -94,19 +109,24 @@ static enum umf_result_t numa_memory_provider_create_from_memspace(
94109
struct numa_memory_target_t **numaTargets =
95110
(struct numa_memory_target_t **)memTargets;
96111

97-
// Create node mask from IDs
98-
struct bitmask *nodemask =
99-
numa_targets_create_nodemask(numaTargets, numTargets);
112+
unsigned long *nodemask;
113+
unsigned maxnode;
114+
115+
umf_result_t ret = numa_targets_create_nodemask(numaTargets, numTargets,
116+
&nodemask, &maxnode);
117+
if (ret != UMF_RESULT_SUCCESS) {
118+
return ret;
119+
}
100120

101121
umf_os_memory_provider_params_t params =
102122
UMF_OS_MEMORY_PROVIDER_PARAMS_DEFAULT;
103-
params.nodemask = nodemask->maskp;
104-
params.maxnode = nodemask->size;
123+
params.nodemask = nodemask;
124+
params.maxnode = maxnode;
105125

106126
umf_memory_provider_handle_t numaProvider = NULL;
107-
enum umf_result_t ret = umfMemoryProviderCreate(&UMF_OS_MEMORY_PROVIDER_OPS,
108-
&params, &numaProvider);
109-
numa_bitmask_free(nodemask);
127+
ret = umfMemoryProviderCreate(&UMF_OS_MEMORY_PROVIDER_OPS, &params,
128+
&numaProvider);
129+
free(nodemask);
110130
if (ret) {
111131
return ret;
112132
}

0 commit comments

Comments
 (0)