Skip to content

Commit 3df801f

Browse files
Add MPI
1 parent 967a6b3 commit 3df801f

1 file changed

Lines changed: 37 additions & 16 deletions

File tree

CMakeLists.txt

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,41 @@ if (MINGW)
1111
elseif (MSVC)
1212
message(STATUS "Detected MSVC — using MSVC settings")
1313
set(USING_MSVC TRUE)
14+
elseif (APPLE)
15+
message(STATUS "Detected macOS — limited MPI support")
16+
set(USING_APPLE TRUE)
17+
elseif (UNIX)
18+
message(STATUS "Detected Linux/UNIX — using standard settings")
19+
set(USING_UNIX TRUE)
1420
endif()
1521

1622
# ============================
1723
# Options
1824
# ============================
1925
option(NEXT_FP32 "Use 32-bit floats (scalar)" OFF)
2026
option(NEXT_FP64 "Use 64-bit floats (scalar)" ON)
27+
option(NEXT_MPI "Enable MPI support" OFF)
2128

22-
# Option: copy final executable to source dir
2329
option(NEXT_COPY_TO_CMAKE_SOURCE_DIR "Copy final executable from build dir to source dir" ON)
2430

2531
# ============================
2632
# Precision modes
2733
# ============================
28-
set(NEXT_MODES
29-
NEXT_FP32
30-
NEXT_FP64
31-
)
34+
set(NEXT_MODES NEXT_FP32 NEXT_FP64)
3235

33-
# Count enabled modes
3436
set(NEXT_MODE_COUNT 0)
3537
foreach(m ${NEXT_MODES})
3638
if(${m})
3739
math(EXPR NEXT_MODE_COUNT "${NEXT_MODE_COUNT} + 1")
3840
endif()
3941
endforeach()
4042

41-
# Enforce exactly one mode
4243
if(NEXT_MODE_COUNT EQUAL 0)
4344
message(FATAL_ERROR "You must enable NEXT_FP64 or NEXT_FP32.")
4445
elseif(NEXT_MODE_COUNT GREATER 1)
4546
message(FATAL_ERROR "Enable only one precision mode.")
4647
endif()
4748

48-
# Apply compile definitions
4949
if(NEXT_FP32)
5050
add_compile_definitions(NEXT_FP32)
5151
elseif(NEXT_FP64)
@@ -62,6 +62,9 @@ file(GLOB ARGPARSE_FILES ${CMAKE_SOURCE_DIR}/argparse/*.cpp)
6262

6363
add_executable(next ${SRC_FILES} ${ARGPARSE_FILES})
6464

65+
# ============================
66+
# Vectorization reports
67+
# ============================
6568
option(ENABLE_VEC_REPORT "Enable compiler vectorization reports" ON)
6669

6770
if(ENABLE_VEC_REPORT)
@@ -74,38 +77,56 @@ if(ENABLE_VEC_REPORT)
7477
endif()
7578
endif()
7679

77-
7880
# ============================
7981
# OpenMP
8082
# ============================
8183
find_package(OpenMP QUIET)
8284
if(OpenMP_CXX_FOUND)
8385
message(STATUS "OpenMP detected — enabling multithreading.")
84-
8586
if(MSVC)
86-
# Force MSVC to use the modern LLVM backend (supports OpenMP 3.0+ and size_t)
87-
# We add it as a compiler option because MSVC's default find_package
88-
# often defaults to the legacy /openmp flag.
8987
target_compile_options(next PRIVATE /openmp:llvm)
9088
else()
9189
target_link_libraries(next PRIVATE OpenMP::OpenMP_CXX)
9290
endif()
93-
9491
else()
9592
message(STATUS "OpenMP not found — building in single-threaded mode.")
9693
endif()
9794

95+
# ============================
96+
# MPI detection
97+
# ============================
98+
if(NEXT_MPI)
99+
if(USING_UNIX)
100+
# Linux: standard OpenMPI
101+
find_package(MPI REQUIRED)
102+
message(STATUS "MPI (OpenMPI) detected — enabling distributed memory parallelism.")
103+
target_compile_definitions(next PRIVATE NEXT_MPI)
104+
target_link_libraries(next PRIVATE MPI::MPI_CXX)
105+
106+
elseif(USING_MSVC OR USING_MINGW)
107+
# Windows: Microsoft MPI
108+
find_package(MPI REQUIRED)
109+
message(STATUS "MPI (MS-MPI) detected — enabling distributed memory parallelism.")
110+
target_compile_definitions(next PRIVATE NEXT_MPI)
111+
target_link_libraries(next PRIVATE MPI::MPI_CXX)
112+
113+
elseif(USING_APPLE)
114+
message(WARNING "MPI requested, but macOS does not ship MPI by default. Please install OpenMPI via Homebrew (brew install open-mpi).")
115+
find_package(MPI REQUIRED)
116+
target_compile_definitions(next PRIVATE NEXT_MPI)
117+
target_link_libraries(next PRIVATE MPI::MPI_CXX)
118+
endif()
119+
endif()
120+
98121
# ============================
99122
# HDF5 detection
100123
# ============================
101-
# MSVC: use vcpkg or prebuilt binaries
102124
if (USING_MSVC AND DEFINED ENV{HDF5_DIR})
103125
set(HDF5_ROOT "$ENV{HDF5_DIR}")
104126
set(CMAKE_PREFIX_PATH "${HDF5_ROOT};${CMAKE_PREFIX_PATH}")
105127
endif()
106128

107129
if (USING_MINGW)
108-
# MSYS2 MinGW installs HDF5 here
109130
set(CMAKE_PREFIX_PATH "C:/tools/msys64/mingw64")
110131
message(STATUS "Using MSYS2 MinGW HDF5 path: ${CMAKE_PREFIX_PATH}")
111132
endif()

0 commit comments

Comments
 (0)