Skip to content

Commit 14707ac

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

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-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: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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(i, numa_bitmask_isbitset(numa_all_nodes_ptr, i));
37+
}
38+
39+
return available_NUMA_nodes;
40+
}
41+
42+
std::tuple<int, int> get_numa_node(void* addr) {
43+
int max_node = numa_max_node() + 1;
44+
int numa_node;
45+
int ret = get_mempolicy(&numa_node, NULL, max_node, addr, MPOL_F_NODE | MPOL_F_ADDR);
46+
47+
return {ret, numa_node};
48+
}
49+
50+
class testNUMAnodes:
51+
public testing::TestWithParam<std::tuple<int, int>> {};
52+
53+
INSTANTIATE_TEST_SUITE_P(testNUMAnodesAllocations, testNUMAnodes,
54+
::testing::ValuesIn(get_available_NUMA_nodes_numbers()));
55+
56+
// Tests for allocations on numa nodes
57+
TEST_P(testNUMAnodes, checkNUMAnodesAllocations) {
58+
if (numa_available() == -1 || numa_num_task_nodes() <= 1) {
59+
GTEST_SKIP();
60+
}
61+
62+
size_t alloc_size = 1024;
63+
auto [i, is_bit_set]= GetParam();
64+
int max_node = numa_max_node() + 1;
65+
66+
umf_result_t umf_result;
67+
umf_memory_provider_handle_t os_memory_provider = nullptr;
68+
umf_os_memory_provider_params_t os_memory_provider_params =
69+
UMF_OS_MEMORY_PROVIDER_PARAMS_TEST;
70+
os_memory_provider_params.maxnode = max_node;
71+
72+
bitmask * nodemask = numa_allocate_nodemask();
73+
ASSERT_NE(nodemask, nullptr);
74+
75+
if (is_bit_set == 1) {
76+
numa_bitmask_setbit(nodemask, i);
77+
os_memory_provider_params.nodemask = nodemask->maskp;
78+
umf_result = umfMemoryProviderCreate(&UMF_OS_MEMORY_PROVIDER_OPS,
79+
&os_memory_provider_params,
80+
&os_memory_provider);
81+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
82+
ASSERT_NE(os_memory_provider, nullptr);
83+
84+
void *ptr = nullptr;
85+
umf_result = umfMemoryProviderAlloc(os_memory_provider, alloc_size, 0, &ptr);
86+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
87+
ASSERT_NE(ptr, nullptr);
88+
89+
auto [ret, numa_node] = get_numa_node(ptr);
90+
ASSERT_EQ(ret, 0);
91+
ASSERT_EQ(numa_node, i);
92+
93+
memset(ptr, 0xFF, alloc_size);
94+
umf_result = umfMemoryProviderFree(os_memory_provider, ptr, alloc_size);
95+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
96+
97+
umfMemoryProviderDestroy(os_memory_provider);
98+
99+
numa_bitmask_clearall(nodemask);
100+
numa_free_nodemask(nodemask);
101+
}
102+
}

0 commit comments

Comments
 (0)