Skip to content

Commit ac1e76b

Browse files
author
Damian Duy
committed
Add test for multiple NUMA nodes
1 parent e4b8a75 commit ac1e76b

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

test/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ if(UMF_BUILD_OS_MEMORY_PROVIDER AND LINUX) # OS-specific functions are implement
102102
add_umf_test(NAME provider_os_memory
103103
SRCS provider_os_memory.cpp
104104
LIBS umf_utils)
105+
add_umf_test(NAME provider_os_memory_multiple_NUMA_nodes
106+
SRCS provider_os_memory_multiple_NUMA_nodes.cpp
107+
LIBS umf_utils)
105108
add_umf_test(NAME memspace_numa
106109
SRCS memspace_numa.cpp
107110
LIBS numa)

test/provider_os_memory.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include "cpp_helpers.hpp"
88
#include "provider_os_memory_internal.h"
99
#include "umf/providers/provider_os_memory.h"
10+
#include <numa.h>
11+
#include <numaif.h>
1012
#include <umf/memory_provider.h>
1113

1214
using umf_test::test;
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// Copyright (C) 2024 Intel Corporation
2+
// Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
3+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
5+
#include "base.hpp"
6+
7+
#include "cpp_helpers.hpp"
8+
#include "provider_os_memory_internal.h"
9+
#include "umf/providers/provider_os_memory.h"
10+
#include <numa.h>
11+
#include <numaif.h>
12+
#include <umf/memory_provider.h>
13+
14+
using umf_test::test;
15+
16+
static umf_os_memory_provider_params_t UMF_OS_MEMORY_PROVIDER_PARAMS_TEST = {
17+
/* .protection = */ UMF_PROTECTION_READ | UMF_PROTECTION_WRITE,
18+
/* .visibility = */ UMF_VISIBILITY_PRIVATE,
19+
20+
// NUMA config
21+
/* .nodemask = */ NULL,
22+
/* .maxnode = */ 0,
23+
/* .numa_mode = */ UMF_NUMA_MODE_BIND,
24+
/* .numa_flags = */ 0,
25+
26+
// others
27+
/* .traces = */ 1,
28+
};
29+
30+
std::vector<std::tuple<int, int>> get_available_NUMA_nodes_numbers() {
31+
int max_node = numa_max_node() + 1;
32+
std::vector<std::tuple<int, int>> available_NUMA_nodes(max_node);
33+
34+
// Get all available NUMA nodes numbers
35+
for (int i = 0; i <= max_node; ++i) {
36+
available_NUMA_nodes.emplace_back(
37+
i, numa_bitmask_isbitset(numa_all_nodes_ptr, i));
38+
}
39+
40+
return available_NUMA_nodes;
41+
}
42+
43+
std::tuple<int, int> get_numa_node(void *addr) {
44+
int max_node = numa_max_node() + 1;
45+
int numa_node;
46+
int ret = get_mempolicy(&numa_node, NULL, max_node, addr,
47+
MPOL_F_NODE | MPOL_F_ADDR);
48+
49+
return {ret, numa_node};
50+
}
51+
52+
class testNUMAnodes : public testing::TestWithParam<std::tuple<int, int>> {};
53+
54+
INSTANTIATE_TEST_SUITE_P(
55+
testNUMAnodesAllocations, testNUMAnodes,
56+
::testing::ValuesIn(get_available_NUMA_nodes_numbers()));
57+
58+
// Tests for allocations on numa nodes
59+
TEST_P(testNUMAnodes, checkNUMAnodesAllocations) {
60+
if (numa_available() == -1 || numa_num_task_nodes() <= 1) {
61+
GTEST_SKIP();
62+
}
63+
64+
size_t alloc_size = 1024;
65+
auto [i, is_bit_set] = GetParam();
66+
int max_node = numa_max_node() + 1;
67+
68+
umf_result_t umf_result;
69+
umf_memory_provider_handle_t os_memory_provider = nullptr;
70+
umf_os_memory_provider_params_t os_memory_provider_params =
71+
UMF_OS_MEMORY_PROVIDER_PARAMS_TEST;
72+
os_memory_provider_params.maxnode = max_node;
73+
74+
bitmask *nodemask = numa_allocate_nodemask();
75+
ASSERT_NE(nodemask, nullptr);
76+
77+
if (is_bit_set == 1) {
78+
numa_bitmask_setbit(nodemask, i);
79+
os_memory_provider_params.nodemask = nodemask->maskp;
80+
umf_result = umfMemoryProviderCreate(&UMF_OS_MEMORY_PROVIDER_OPS,
81+
&os_memory_provider_params,
82+
&os_memory_provider);
83+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
84+
ASSERT_NE(os_memory_provider, nullptr);
85+
86+
void *ptr = nullptr;
87+
umf_result =
88+
umfMemoryProviderAlloc(os_memory_provider, alloc_size, 0, &ptr);
89+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
90+
ASSERT_NE(ptr, nullptr);
91+
92+
auto [ret, numa_node] = get_numa_node(ptr);
93+
ASSERT_EQ(ret, 0);
94+
ASSERT_EQ(numa_node, i);
95+
96+
memset(ptr, 0xFF, alloc_size);
97+
umf_result = umfMemoryProviderFree(os_memory_provider, ptr, alloc_size);
98+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
99+
100+
umfMemoryProviderDestroy(os_memory_provider);
101+
102+
numa_bitmask_clearall(nodemask);
103+
numa_free_nodemask(nodemask);
104+
}
105+
}

0 commit comments

Comments
 (0)