Skip to content

Commit ad09620

Browse files
kswiecickiigchor
authored andcommitted
Add numa memspace tests
1 parent e7b31ed commit ad09620

File tree

3 files changed

+172
-1
lines changed

3 files changed

+172
-1
lines changed

include/umf/memspace.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ umfMemoryProviderCreateFromMemspace(umf_memspace_handle_t hMemspace,
5151
umf_memory_provider_handle_t *hProvider);
5252

5353
///
54-
/// \brief Creates new memory provider from memspace and policy.
54+
/// \brief Destroys memspace.
5555
/// \param hMemspace handle to memspace
5656
///
5757
void umfMemspaceDestroy(umf_memspace_handle_t hMemspace);

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,5 @@ add_umf_test(NAME c_api_disjoint_pool SRCS c_api/disjoint_pool.c)
6262

6363
if(LINUX) # OS-specific functions are implemented only for Linux now
6464
add_umf_test(NAME provider_os_memory SRCS provider_os_memory.cpp LIBS numa)
65+
add_umf_test(NAME memspace_numa SRCS memspace_numa.cpp LIBS numa)
6566
endif()

test/memspace_numa.cpp

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Copyright (C) 2023 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 <umf/memspace.h>
8+
#include <umf/memspaces/memspace_numa.h>
9+
#include <umf/providers/provider_os_memory.h>
10+
11+
#include <numa.h>
12+
13+
#define SIZE_4K (4096)
14+
15+
struct numa_nodes_test : ::umf_test::test {
16+
void SetUp() override {
17+
::umf_test::test::SetUp();
18+
19+
if (numa_available() == -1) {
20+
GTEST_SKIP() << "Failed to initialize libnuma";
21+
}
22+
23+
int numNodes = numa_max_node();
24+
if (numNodes < 0) {
25+
GTEST_SKIP() << "No available numa nodes";
26+
}
27+
28+
for (int i = 0; i <= numNodes; i++) {
29+
nodeIds.emplace_back(i);
30+
}
31+
}
32+
33+
std::vector<size_t> nodeIds;
34+
};
35+
36+
struct numa_memspace_test : ::numa_nodes_test {
37+
void SetUp() override {
38+
::numa_nodes_test::SetUp();
39+
40+
enum umf_result_t ret = umfMemspaceCreateFromNumaArray(
41+
nodeIds.data(), nodeIds.size(), &memspace);
42+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
43+
ASSERT_NE(memspace, nullptr);
44+
}
45+
46+
void TearDown() override {
47+
::numa_nodes_test::TearDown();
48+
49+
umfMemspaceDestroy(memspace);
50+
}
51+
52+
umf_memspace_handle_t memspace = nullptr;
53+
};
54+
55+
struct numa_memspace_provider_test : ::numa_memspace_test {
56+
void SetUp() override {
57+
::numa_memspace_test::SetUp();
58+
59+
umf_result_t ret =
60+
umfMemoryProviderCreateFromMemspace(memspace, nullptr, &provider);
61+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
62+
ASSERT_NE(provider, nullptr);
63+
}
64+
65+
void TearDown() override {
66+
::numa_memspace_test::TearDown();
67+
68+
umfMemoryProviderDestroy(provider);
69+
}
70+
71+
umf_memory_provider_handle_t provider = nullptr;
72+
};
73+
74+
struct numa_memspace_pool_test : ::numa_memspace_test {
75+
void SetUp() override {
76+
::numa_memspace_test::SetUp();
77+
78+
umf_result_t ret = umfPoolCreateFromMemspace(memspace, nullptr, &pool);
79+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
80+
ASSERT_NE(pool, nullptr);
81+
}
82+
83+
void TearDown() override {
84+
::numa_memspace_test::TearDown();
85+
86+
umfPoolDestroy(pool);
87+
}
88+
89+
umf_memory_pool_handle_t pool = nullptr;
90+
};
91+
92+
TEST_F(numa_nodes_test, create_destroy) {
93+
umf_memspace_handle_t hMemspace = nullptr;
94+
enum umf_result_t ret = umfMemspaceCreateFromNumaArray(
95+
nodeIds.data(), nodeIds.size(), &hMemspace);
96+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
97+
ASSERT_NE(hMemspace, nullptr);
98+
99+
umfMemspaceDestroy(hMemspace);
100+
}
101+
102+
TEST_F(numa_nodes_test, create_null_array) {
103+
umf_memspace_handle_t hMemspace = nullptr;
104+
enum umf_result_t ret = umfMemspaceCreateFromNumaArray(NULL, 0, &hMemspace);
105+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
106+
ASSERT_EQ(hMemspace, nullptr);
107+
}
108+
109+
TEST_F(numa_nodes_test, create_zero_size) {
110+
umf_memspace_handle_t hMemspace = nullptr;
111+
enum umf_result_t ret =
112+
umfMemspaceCreateFromNumaArray(nodeIds.data(), 0, &hMemspace);
113+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
114+
ASSERT_EQ(hMemspace, nullptr);
115+
}
116+
117+
TEST_F(numa_nodes_test, create_null_handle) {
118+
enum umf_result_t ret =
119+
umfMemspaceCreateFromNumaArray(nodeIds.data(), nodeIds.size(), nullptr);
120+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
121+
}
122+
123+
TEST_F(numa_memspace_test, provider_from_numa_memspace) {
124+
umf_memory_provider_handle_t provider = nullptr;
125+
enum umf_result_t ret =
126+
umfMemoryProviderCreateFromMemspace(memspace, nullptr, &provider);
127+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
128+
ASSERT_NE(provider, nullptr);
129+
130+
umfMemoryProviderDestroy(provider);
131+
}
132+
133+
TEST_F(numa_memspace_test, pool_from_numa_memspace) {
134+
umf_memory_pool_handle_t pool = nullptr;
135+
enum umf_result_t ret = umfPoolCreateFromMemspace(memspace, nullptr, &pool);
136+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
137+
ASSERT_NE(pool, nullptr);
138+
139+
umfPoolDestroy(pool);
140+
}
141+
142+
TEST_F(numa_memspace_provider_test, alloc_free) {
143+
void *ptr = nullptr;
144+
size_t size = SIZE_4K;
145+
size_t alignment = 0;
146+
147+
enum umf_result_t ret =
148+
umfMemoryProviderAlloc(provider, size, alignment, &ptr);
149+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
150+
ASSERT_NE(ptr, nullptr);
151+
152+
memset(ptr, 0xFF, size);
153+
154+
ret = umfMemoryProviderFree(provider, ptr, size);
155+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
156+
}
157+
158+
TEST_F(numa_memspace_pool_test, alloc_free) {
159+
// TODO: Find out why free fails with UMF_OS_RESULT_ERROR_FREE_FAILED
160+
GTEST_SKIP();
161+
162+
size_t size = SIZE_4K;
163+
void *ptr = umfPoolMalloc(pool, size);
164+
ASSERT_NE(ptr, nullptr);
165+
166+
memset(ptr, 0xFF, size);
167+
168+
enum umf_result_t ret = umfPoolFree(pool, ptr);
169+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
170+
}

0 commit comments

Comments
 (0)