如何使用cmake编译包含c程序的MPI

use*_*765 5 c cmake mpi

我正在尝试将openmp和mpi技术应用于开源C程序,该程序需要构建"cmake.&& make".我已经找到了如何在CMake的try_compile函数中为OpenMP设置链接器标志如何包含-fopenmp标志但仍然对mpi感到困惑.我该怎么办?

nik*_*sfi 17

OpenMP的

这是关于OpenMP的问题吗?然后你所要做的就是编译-fopenmp,你可以通过附加它来做CMAKE_C_FLAGS,例如:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp)
Run Code Online (Sandbox Code Playgroud)

MPI

对于MPI,你必须先找到mpi

find_package(MPI) #make it REQUIRED, if you want
Run Code Online (Sandbox Code Playgroud)

然后将它的头文件添加到您的搜索路径

include_directories(SYSTEM ${MPI_INCLUDE_PATH})
Run Code Online (Sandbox Code Playgroud)

最后链接你的程序(my_mpi_target在我的情况下)

 target_link_libraries(my_mpi_target ${MPI_C_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

  • 这够了吗?那么`MPI_ <lang> _COMPILE_FLAGS`和`MPI_ <lang> _LINK_FLAGS`怎么样? (3认同)

Liu*_*eng 10

在基于目标的现代CMake 3.X中,CMakeLists.txt应如下所示:

cmake_minimum_required(VERSION 3.0)

project(main)

find_package(MPI REQUIRED)
# add this line only when you are using openmpi which has a different c++ bindings
add_definitions(-DOMPI_SKIP_MPICXX)

# Use imported targets would make things much eazier. Thanks Levi for pointing it out.
add_executable(main main.cpp)
target_link_libraries(main
  PRIVATE
  MPI_C)

# Old way.
#target_link_libraries(main
# PRIVATE
# ${MPI_C_LIBRARIES})

#target_include_directories(main
# PRIVATE
# ${MPI_C_INCLUDE_PATH}) 
Run Code Online (Sandbox Code Playgroud)

  • 在CMake 3.9及更高版本中,您可以改用:target_link_libraries(main PRIVATE MPI :: MPI_C)。使用导入的目标要好得多。 (2认同)

Haw*_*ike 8

OpenMP 和 MPI 结合在一起

对于那些想要在单个 CMake 文件中同时使用OpenMPMPI的人:

cmake_minimum_required(VERSION 3.9.1)
project(parallel_task)

set(CMAKE_CXX_STANDARD 14)
set(GCC_COVERAGE_COMPILE_FLAGS "-Wall -pedantic -lm -O3 -funroll-loops")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")

add_executable(parallel_task example.cpp example.h)

# OpenMP
find_package(OpenMP)
if(OpenMP_CXX_FOUND)
    target_link_libraries(parallel_task PUBLIC OpenMP::OpenMP_CXX)
endif()

# MPI
find_package(MPI REQUIRED)
target_link_libraries(parallel_task PUBLIC MPI::MPI_CXX)
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

cmake_minimum_required(VERSION 3.9.1)
project(parallel_task)

set(CMAKE_CXX_STANDARD 14)

# -fopenmp flag (enables OpenMP)
set(GCC_COVERAGE_COMPILE_FLAGS "-Wall -pedantic -lm -O3 -funroll-loops -fopenmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")

add_executable(parallel_task example.cpp example.h)

# MPI
find_package(MPI REQUIRED)
target_link_libraries(parallel_task PUBLIC MPI::MPI_CXX)
Run Code Online (Sandbox Code Playgroud)

如果您想直接从 CLion 运行程序(具有指定数量的进程),请另请检查此答案:https ://stackoverflow.com/a/66992251/9723204