我正在尝试将openmp和mpi技术应用于开源C程序,该程序需要构建“cmake。&& make”。我已经在How to set linker flags for OpenMP in CMake's try_compile function找到了如何包含-fopenmp标志,但仍然对mpi感到困惑。我该怎么办?
答案 0 :(得分:14)
这是关于 OpenMP 的问题吗?然后你所要做的就是使用-fopenmp
进行编译,你可以将其附加到CMAKE_C_FLAGS
,例如:
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp)
对于 MPI ,您必须先找到mpi
find_package(MPI) #make it REQUIRED, if you want
然后将其头文件添加到您的搜索路径
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
最后链接你的程序(在我的情况下是my_mpi_target
)
target_link_libraries(my_mpi_target ${MPI_C_LIBRARIES})
答案 1 :(得分:9)
在基于目标的现代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})
答案 2 :(得分:1)
对于那些希望在单个 CMake 文件中同时使用 OpenMP 和 MPI 的人:
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)
甚至更简单:
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)
如果您想直接从 CLion 运行您的程序(使用指定数量的进程),请同时查看此答案:https://stackoverflow.com/a/66992251/9723204