Skip to content

Commit 03c29bd

Browse files
[bugfix] add cmake option to bypass NUMA binding (#368)
fix open BUILD NUMA
1 parent 1f8242c commit 03c29bd

File tree

10 files changed

+154
-110
lines changed

10 files changed

+154
-110
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
99
option(BUILD_UCM_STORE "build ucm store module." ON)
1010
option(BUILD_UCM_SPARSE "build ucm sparse module." ON)
1111
option(BUILD_UNIT_TESTS "build all unit test suits." OFF)
12+
option(BUILD_NUMA "build numactl library" OFF)
1213
set(RUNTIME_ENVIRONMENT "simu" CACHE STRING "runtime: simu, ascend, musa or cuda.")
1314

1415
execute_process(COMMAND git rev-parse HEAD OUTPUT_VARIABLE UCM_COMMIT_ID OUTPUT_STRIP_TRAILING_WHITESPACE)

ucm/sparse/esa/CMakeLists.txt

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
1-
set(NUMA_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/numa_install)
2-
FetchContent_Declare(
3-
numactl
4-
URL https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
5-
TLS_VERIFY OFF
6-
)
7-
FetchContent_MakeAvailable(numactl)
8-
if(NOT EXISTS "${NUMA_INSTALL_DIR}/lib/libnuma.so")
9-
message(STATUS "Configuring numactl...")
10-
execute_process(
11-
COMMAND ./configure --prefix=${NUMA_INSTALL_DIR}
12-
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
13-
RESULT_VARIABLE numa_configure_result
14-
OUTPUT_VARIABLE numa_configure_output
15-
ERROR_VARIABLE numa_configure_error
16-
)
17-
if(NOT numa_configure_result EQUAL 0)
18-
message(FATAL_ERROR "Failed to configure numactl. \n"
19-
"Result: ${numa_configure_result}\n"
20-
"STDOUT: ${numa_configure_output}\n"
21-
"STDERR: ${numa_configure_error}\n")
22-
endif()
1+
if(BUILD_NUMA)
2+
message(STATUS "Building numactl library...")
233

24-
message(STATUS "Building and installing numactl...")
25-
execute_process(
26-
COMMAND make install -j8
27-
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
28-
RESULT_VARIABLE numa_install_result
29-
OUTPUT_VARIABLE numa_install_output
30-
ERROR_VARIABLE numa_install_error
4+
set(NUMA_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/numa_install)
5+
FetchContent_Declare(
6+
numactl
7+
URL https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
8+
TLS_VERIFY OFF
319
)
32-
if(NOT numa_install_result EQUAL 0)
33-
message(FATAL_ERROR "Failed to build and install numactl. \n"
34-
"Result: ${numa_install_result}\n"
35-
"STDOUT: ${numa_install_output}\n"
36-
"STDERR: ${numa_install_error}\n")
10+
FetchContent_MakeAvailable(numactl)
11+
if(NOT EXISTS "${NUMA_INSTALL_DIR}/lib/libnuma.so")
12+
message(STATUS "Configuring numactl...")
13+
execute_process(
14+
COMMAND ./configure --prefix=${NUMA_INSTALL_DIR}
15+
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
16+
RESULT_VARIABLE numa_configure_result
17+
OUTPUT_VARIABLE numa_configure_output
18+
ERROR_VARIABLE numa_configure_error
19+
)
20+
if(NOT numa_configure_result EQUAL 0)
21+
message(FATAL_ERROR "Failed to configure numactl. \n"
22+
"Result: ${numa_configure_result}\n"
23+
"STDOUT: ${numa_configure_output}\n"
24+
"STDERR: ${numa_configure_error}\n")
25+
endif()
26+
27+
message(STATUS "Building and installing numactl...")
28+
execute_process(
29+
COMMAND make install -j8
30+
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
31+
RESULT_VARIABLE numa_install_result
32+
OUTPUT_VARIABLE numa_install_output
33+
ERROR_VARIABLE numa_install_error
34+
)
35+
if(NOT numa_install_result EQUAL 0)
36+
message(FATAL_ERROR "Failed to build and install numactl. \n"
37+
"Result: ${numa_install_result}\n"
38+
"STDOUT: ${numa_install_output}\n"
39+
"STDERR: ${numa_install_error}\n")
40+
endif()
41+
else()
42+
message(STATUS "Found already built libnuma. Skipping build.")
3743
endif()
44+
45+
add_definitions(-DNUMA_ENABLED)
3846
else()
39-
message(STATUS "Found already built libnuma. Skipping build.")
47+
message(STATUS "Skipping numactl build...")
4048
endif()
4149

4250
add_subdirectory(retrieval)

ucm/sparse/esa/retrieval/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ target_include_directories(retrieval_backend PUBLIC
1212

1313
# 链接所需的库
1414
target_link_libraries(retrieval_backend PUBLIC
15-
${NUMA_INSTALL_DIR}/lib/libnuma.so
15+
$<$<BOOL:${BUILD_NUMA}>:${NUMA_INSTALL_DIR}/lib/libnuma.so>
1616
${Torch_LIBRARIES}
1717
)

ucm/sparse/esa/retrieval/cpy/retrieval_backend.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
#include <vector>
1212
#include <algorithm>
1313
#include <random>
14+
#ifdef NUMA_ENABLED
1415
#include <numaif.h>
16+
#endif
1517
#include <iostream>
1618

1719
namespace py = pybind11;
@@ -29,7 +31,6 @@ class RetrievalWorkerBackend {
2931

3032
// Start worker threads
3133
for (auto cpu_idx : cpu_idx_tbl) {
32-
int numaId = cpu_idx.first.cast<int>();
3334
py::list core_ids = cpu_idx.second.cast<py::list>();
3435

3536
for (size_t i = 0; i < core_ids.size(); ++i) {
@@ -49,12 +50,17 @@ class RetrievalWorkerBackend {
4950
std::cerr << "Error binding thread " << i << " to CPU core " << core_id << std::endl;
5051
}
5152

53+
#ifdef NUMA_ENABLED
54+
int numaId = cpu_idx.first.cast<int>();
5255
// 设置内存亲和性
5356
unsigned long nodeMask = 1UL << numaId;
5457
rc = set_mempolicy(MPOL_BIND, &nodeMask, sizeof(nodeMask) * 8);
5558
if (rc != 0) {
5659
std::cerr << "Error binding memory to NUMA node " << numaId << std::endl;
5760
}
61+
#else
62+
std::cerr << "NUMA support is disabled." << std::endl;
63+
#endif
5864
}
5965

6066
}

ucm/sparse/kvcomp/CMakeLists.txt

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
1-
set(NUMA_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/numa_install)
2-
FetchContent_Declare(
3-
numactl
4-
URL https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
5-
TLS_VERIFY OFF
6-
)
7-
FetchContent_MakeAvailable(numactl)
8-
if(NOT EXISTS "${NUMA_INSTALL_DIR}/lib/libnuma.so")
9-
message(STATUS "Configuring numactl...")
10-
execute_process(
11-
COMMAND ./configure --prefix=${NUMA_INSTALL_DIR}
12-
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
13-
RESULT_VARIABLE numa_configure_result
14-
OUTPUT_VARIABLE numa_configure_output
15-
ERROR_VARIABLE numa_configure_error
16-
)
17-
if(NOT numa_configure_result EQUAL 0)
18-
message(FATAL_ERROR "Failed to configure numactl. \n"
19-
"Result: ${numa_configure_result}\n"
20-
"STDOUT: ${numa_configure_output}\n"
21-
"STDERR: ${numa_configure_error}\n")
22-
endif()
1+
if(BUILD_NUMA)
2+
message(STATUS "Building numactl library...")
233

24-
message(STATUS "Building and installing numactl...")
25-
execute_process(
26-
COMMAND make install -j8
27-
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
28-
RESULT_VARIABLE numa_install_result
29-
OUTPUT_VARIABLE numa_install_output
30-
ERROR_VARIABLE numa_install_error
4+
set(NUMA_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/numa_install)
5+
FetchContent_Declare(
6+
numactl
7+
URL https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
8+
TLS_VERIFY OFF
319
)
32-
if(NOT numa_install_result EQUAL 0)
33-
message(FATAL_ERROR "Failed to build and install numactl. \n"
34-
"Result: ${numa_install_result}\n"
35-
"STDOUT: ${numa_install_output}\n"
36-
"STDERR: ${numa_install_error}\n")
10+
FetchContent_MakeAvailable(numactl)
11+
if(NOT EXISTS "${NUMA_INSTALL_DIR}/lib/libnuma.so")
12+
message(STATUS "Configuring numactl...")
13+
execute_process(
14+
COMMAND ./configure --prefix=${NUMA_INSTALL_DIR}
15+
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
16+
RESULT_VARIABLE numa_configure_result
17+
OUTPUT_VARIABLE numa_configure_output
18+
ERROR_VARIABLE numa_configure_error
19+
)
20+
if(NOT numa_configure_result EQUAL 0)
21+
message(FATAL_ERROR "Failed to configure numactl. \n"
22+
"Result: ${numa_configure_result}\n"
23+
"STDOUT: ${numa_configure_output}\n"
24+
"STDERR: ${numa_configure_error}\n")
25+
endif()
26+
27+
message(STATUS "Building and installing numactl...")
28+
execute_process(
29+
COMMAND make install -j8
30+
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
31+
RESULT_VARIABLE numa_install_result
32+
OUTPUT_VARIABLE numa_install_output
33+
ERROR_VARIABLE numa_install_error
34+
)
35+
if(NOT numa_install_result EQUAL 0)
36+
message(FATAL_ERROR "Failed to build and install numactl. \n"
37+
"Result: ${numa_install_result}\n"
38+
"STDOUT: ${numa_install_output}\n"
39+
"STDERR: ${numa_install_error}\n")
40+
endif()
41+
else()
42+
message(STATUS "Found already built libnuma. Skipping build.")
3743
endif()
44+
45+
add_definitions(-DNUMA_ENABLED)
3846
else()
39-
message(STATUS "Found already built libnuma. Skipping build.")
47+
message(STATUS "Skipping numactl build...")
4048
endif()
4149

4250
add_subdirectory(hash_retrieval)

ucm/sparse/kvcomp/hash_retrieval/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ target_include_directories(hash_retrieval_backend PUBLIC
1212

1313
# 链接所需的库
1414
target_link_libraries(hash_retrieval_backend PUBLIC
15-
${NUMA_INSTALL_DIR}/lib/libnuma.so
15+
$<$<BOOL:${BUILD_NUMA}>:${NUMA_INSTALL_DIR}/lib/libnuma.so>
1616
${Torch_LIBRARIES}
1717
)

ucm/sparse/kvcomp/hash_retrieval/cpy/hash_retrieval_backend.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
#include <random>
1717
#include <climits> // 用于UINT16_MAX
1818
#include <omp.h>
19+
#ifdef NUMA_ENABLED
1920
#include <numaif.h>
21+
#endif
2022
#ifdef __ARM_NEON
2123
#include <arm_neon.h> // ARM NEON SIMD 指令集头文件
2224
#elif defined(__x86_64__) || defined(_M_X64)
@@ -43,7 +45,6 @@ class HashRetrievalWorkerBackend {
4345

4446
// Start worker threads
4547
for (auto cpu_idx : cpu_idx_tbl) {
46-
int numaId = cpu_idx.first.cast<int>();
4748
py::list core_ids = cpu_idx.second.cast<py::list>();
4849

4950
for (size_t i = 0; i < core_ids.size(); ++i) {
@@ -63,12 +64,18 @@ class HashRetrievalWorkerBackend {
6364
std::cerr << "Error binding thread " << i << " to CPU core " << core_id << std::endl;
6465
}
6566

67+
#ifdef NUMA_ENABLED
68+
int numaId = cpu_idx.first.cast<int>();
6669
// 设置内存亲和性
6770
unsigned long nodeMask = 1UL << numaId;
6871
rc = set_mempolicy(MPOL_BIND, &nodeMask, sizeof(nodeMask) * 8);
6972
if (rc != 0) {
7073
std::cerr << "Error binding memory to NUMA node " << numaId << std::endl;
7174
}
75+
#else
76+
std::cerr << "NUMA support is disabled." << std::endl;
77+
#endif
78+
7279
}
7380

7481
}

ucm/sparse/kvstar/retrieve/CMakeLists.txt

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -54,45 +54,53 @@ set(Torch_DIR ${PYTORCH_PATH}/share/cmake/Torch/)
5454
find_package(Torch REQUIRED)
5555
include_directories(${TORCH_INCLUDE_DIRS})
5656

57-
set(NUMA_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/numa_install)
58-
FetchContent_Declare(
59-
numactl
60-
URL https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
61-
TLS_VERIFY OFF
62-
)
63-
FetchContent_MakeAvailable(numactl)
64-
if(NOT EXISTS "${NUMA_INSTALL_DIR}/lib/libnuma.so")
65-
message(STATUS "Configuring numactl...")
66-
execute_process(
67-
COMMAND ./configure --prefix=${NUMA_INSTALL_DIR}
68-
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
69-
RESULT_VARIABLE numa_configure_result
70-
OUTPUT_VARIABLE numa_configure_output
71-
ERROR_VARIABLE numa_configure_error
72-
)
73-
if(NOT numa_configure_result EQUAL 0)
74-
message(FATAL_ERROR "Failed to configure numactl. \n"
75-
"Result: ${numa_configure_result}\n"
76-
"STDOUT: ${numa_configure_output}\n"
77-
"STDERR: ${numa_configure_error}\n")
78-
endif()
57+
if(BUILD_NUMA)
58+
message(STATUS "Building numactl library...")
7959

80-
message(STATUS "Building and installing numactl...")
81-
execute_process(
82-
COMMAND make install -j8
83-
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
84-
RESULT_VARIABLE numa_install_result
85-
OUTPUT_VARIABLE numa_install_output
86-
ERROR_VARIABLE numa_install_error
60+
set(NUMA_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/numa_install)
61+
FetchContent_Declare(
62+
numactl
63+
URL https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
64+
TLS_VERIFY OFF
8765
)
88-
if(NOT numa_install_result EQUAL 0)
89-
message(FATAL_ERROR "Failed to build and install numactl. \n"
90-
"Result: ${numa_install_result}\n"
91-
"STDOUT: ${numa_install_output}\n"
92-
"STDERR: ${numa_install_error}\n")
66+
FetchContent_MakeAvailable(numactl)
67+
if(NOT EXISTS "${NUMA_INSTALL_DIR}/lib/libnuma.so")
68+
message(STATUS "Configuring numactl...")
69+
execute_process(
70+
COMMAND ./configure --prefix=${NUMA_INSTALL_DIR}
71+
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
72+
RESULT_VARIABLE numa_configure_result
73+
OUTPUT_VARIABLE numa_configure_output
74+
ERROR_VARIABLE numa_configure_error
75+
)
76+
if(NOT numa_configure_result EQUAL 0)
77+
message(FATAL_ERROR "Failed to configure numactl. \n"
78+
"Result: ${numa_configure_result}\n"
79+
"STDOUT: ${numa_configure_output}\n"
80+
"STDERR: ${numa_configure_error}\n")
81+
endif()
82+
83+
message(STATUS "Building and installing numactl...")
84+
execute_process(
85+
COMMAND make install -j8
86+
WORKING_DIRECTORY ${numactl_SOURCE_DIR}
87+
RESULT_VARIABLE numa_install_result
88+
OUTPUT_VARIABLE numa_install_output
89+
ERROR_VARIABLE numa_install_error
90+
)
91+
if(NOT numa_install_result EQUAL 0)
92+
message(FATAL_ERROR "Failed to build and install numactl. \n"
93+
"Result: ${numa_install_result}\n"
94+
"STDOUT: ${numa_install_output}\n"
95+
"STDERR: ${numa_install_error}\n")
96+
endif()
97+
else()
98+
message(STATUS "Found already built libnuma. Skipping build.")
9399
endif()
100+
101+
add_definitions(-DNUMA_ENABLED)
94102
else()
95-
message(STATUS "Found already built libnuma. Skipping build.")
103+
message(STATUS "Skipping numactl build...")
96104
endif()
97105

98106
add_subdirectory(core)

ucm/sparse/kvstar/retrieve/core/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ target_include_directories(kvstar_retrieve.core PUBLIC
1111
target_link_libraries(kvstar_retrieve.core PUBLIC
1212
spdlog::spdlog
1313
fmt::fmt
14-
${NUMA_INSTALL_DIR}/lib/libnuma.so
14+
$<$<BOOL:${BUILD_NUMA}>:${NUMA_INSTALL_DIR}/lib/libnuma.so>
1515
${Torch_LIBRARIES}
1616
)

ucm/sparse/kvstar/retrieve/core/domain/retrieve_task/retrieve_task_queue.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
#ifdef NUMA_ENABLED
12
#include <numaif.h>
3+
#endif
24
#include "retrieve_task_queue.h"
35
#include "retrieve_task_runner.h"
46

@@ -27,13 +29,17 @@ void RetrieveTaskQueue::Worker(const int numaId, const int bindCoreId, std::prom
2729
return;
2830
}
2931

32+
#ifdef NUMA_ENABLED
3033
unsigned long nodemask = 1UL << numaId;
3134
rc = set_mempolicy(MPOL_BIND, &nodemask, sizeof(nodemask) * 8);
3235
if (rc != 0) {
3336
perror("set_mempolicy");
3437
started.set_value(Status::OsApiError());
3538
return;
3639
}
40+
#else
41+
KVSTAR_DEBUG("NUMA support is disabled.");
42+
#endif
3743

3844
KVSTAR_DEBUG("Bind current thread {} to numa {} core {} and set memory affinity success.", thread, numaId, bindCoreId);
3945
RetrieveTaskRunner runner;

0 commit comments

Comments
 (0)