Skip to content

Commit 56431dc

Browse files
committed
export MemtarGetCapacity
1 parent dfe16aa commit 56431dc

File tree

9 files changed

+56
-11
lines changed

9 files changed

+56
-11
lines changed

include/umf/memtarget.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef UMF_MEMTARGET_H
1111
#define UMF_MEMTARGET_H 1
1212

13+
#include <stddef.h>
1314
#include <umf/base.h>
1415

1516
#ifdef __cplusplus
@@ -31,6 +32,13 @@ typedef enum umf_memtarget_type_t {
3132
umf_result_t umfMemtargetGetType(umf_const_memtarget_handle_t hMemtarget,
3233
umf_memtarget_type_t *type);
3334

35+
/// \brief Get size of the memory target in bytes.
36+
/// \param hMemtarget handle to the memory target
37+
/// \param capacity [out] capacity of the memory target
38+
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
39+
umf_result_t umfMemtargetGetCapacity(umf_const_memtarget_handle_t hMemtarget,
40+
size_t *capacity);
41+
3442
#ifdef __cplusplus
3543
}
3644
#endif

src/libumf.def.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ EXPORTS
4343
umfMemspaceDestroy
4444
umfMemspaceMemtargetNum
4545
umfMemspaceMemtargetGet
46+
umfMemtargetGetCapacity
4647
umfMemtargetGetType
4748
umfOpenIPCHandle
4849
umfOsMemoryProviderOps

src/libumf.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ UMF_1.0 {
4343
umfMemspaceHighestCapacityGet;
4444
umfMemspaceHostAllGet;
4545
umfMemspaceLowestLatencyGet;
46+
umfMemtargetGetCapacity;
4647
umfMemtargetGetType;
4748
umfOpenIPCHandle;
4849
umfOsMemoryProviderOps;

src/memspace.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,8 @@ static int propertyCmp(const void *a, const void *b) {
173173
}
174174
}
175175

176-
umf_result_t
177-
umfMemspaceSortDesc(umf_memspace_handle_t hMemspace,
178-
umf_result_t (*getProperty)(umf_memtarget_handle_t node,
179-
uint64_t *property)) {
176+
umf_result_t umfMemspaceSortDesc(umf_memspace_handle_t hMemspace,
177+
umfGetPropertyFn getProperty) {
180178
if (!hMemspace || !getProperty) {
181179
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
182180
}

src/memspace_internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ struct umf_memspace_t {
3030
umf_result_t umfMemspaceClone(umf_const_memspace_handle_t hMemspace,
3131
umf_memspace_handle_t *outHandle);
3232

33-
typedef umf_result_t (*umfGetPropertyFn)(umf_memtarget_handle_t, uint64_t *);
33+
typedef umf_result_t (*umfGetPropertyFn)(umf_const_memtarget_handle_t,
34+
uint64_t *);
3435

3536
///
3637
/// \brief Sorts memspace by getProperty() in descending order

src/memtarget.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ umf_result_t umfMemtargetClone(umf_memtarget_handle_t memoryTarget,
7676
return UMF_RESULT_SUCCESS;
7777
}
7878

79-
umf_result_t umfMemtargetGetCapacity(umf_memtarget_handle_t memoryTarget,
79+
umf_result_t umfMemtargetGetCapacity(umf_const_memtarget_handle_t memoryTarget,
8080
size_t *capacity) {
8181
if (!memoryTarget || !capacity) {
8282
return UMF_RESULT_ERROR_INVALID_ARGUMENT;

src/memtarget_internal.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ void umfMemtargetDestroy(umf_memtarget_handle_t memoryTarget);
3030

3131
umf_result_t umfMemtargetClone(umf_memtarget_handle_t memoryTarget,
3232
umf_memtarget_handle_t *outHandle);
33-
umf_result_t umfMemtargetGetCapacity(umf_memtarget_handle_t memoryTarget,
34-
size_t *capacity);
33+
3534
umf_result_t umfMemtargetGetBandwidth(umf_memtarget_handle_t srcMemoryTarget,
3635
umf_memtarget_handle_t dstMemoryTarget,
3736
size_t *bandwidth);

test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ if(LINUX) # OS-specific functions are implemented only for Linux now
218218
add_umf_test(
219219
NAME memtarget
220220
SRCS memspaces/memtarget.cpp
221-
LIBS ${LIBNUMA_LIBRARIES})
221+
LIBS ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
222222
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND UMF_BUILD_FUZZTESTS)
223223
add_subdirectory(fuzz)
224224
endif()

test/memspaces/memtarget.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

5+
#include "memspace_fixtures.hpp"
56
#include "memspace_helpers.hpp"
67

78
#include <umf/base.h>
@@ -13,17 +14,53 @@ using umf_test::test;
1314
TEST_F(test, memTargetNuma) {
1415
auto memspace = umfMemspaceHostAllGet();
1516
ASSERT_NE(memspace, nullptr);
16-
17+
umf_memtarget_type_t type;
1718
for (size_t i = 0; i < umfMemspaceMemtargetNum(memspace); i++) {
1819
auto hTarget = umfMemspaceMemtargetGet(memspace, i);
1920
ASSERT_NE(hTarget, nullptr);
20-
umf_memtarget_type_t type;
2121
auto ret = umfMemtargetGetType(hTarget, &type);
2222
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
2323
EXPECT_EQ(type, UMF_MEMTARGET_TYPE_NUMA);
2424
}
2525
}
2626

27+
TEST_F(numaNodesTest, getCapacity) {
28+
auto memspace = umfMemspaceHostAllGet();
29+
ASSERT_NE(memspace, nullptr);
30+
std::vector<size_t> capacities;
31+
for (auto nodeId : nodeIds) {
32+
capacities.push_back(numa_node_size64(nodeId, nullptr));
33+
}
34+
35+
for (size_t i = 0; i < umfMemspaceMemtargetNum(memspace); i++) {
36+
auto hTarget = umfMemspaceMemtargetGet(memspace, i);
37+
ASSERT_NE(hTarget, nullptr);
38+
size_t capacity;
39+
auto ret = umfMemtargetGetCapacity(hTarget, &capacity);
40+
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
41+
auto it = std::find(capacities.begin(), capacities.end(), capacity);
42+
EXPECT_NE(it, capacities.end());
43+
if (it != capacities.end()) {
44+
capacities.erase(it);
45+
}
46+
}
47+
ASSERT_EQ(capacities.size(), 0);
48+
}
49+
50+
TEST_F(numaNodesTest, getCapacityInvalid) {
51+
auto memspace = umfMemspaceHostAllGet();
52+
ASSERT_NE(memspace, nullptr);
53+
size_t capacity;
54+
auto ret = umfMemtargetGetCapacity(NULL, &capacity);
55+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
56+
ret = umfMemtargetGetCapacity(NULL, NULL);
57+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
58+
auto hTarget = umfMemspaceMemtargetGet(memspace, 0);
59+
ASSERT_NE(hTarget, nullptr);
60+
ret = umfMemtargetGetCapacity(hTarget, NULL);
61+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
62+
}
63+
2764
TEST_F(test, memTargetInvalid) {
2865
auto memspace = umfMemspaceHostAllGet();
2966
ASSERT_NE(memspace, nullptr);

0 commit comments

Comments
 (0)