Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用cmake编译包含MPI的c程序_C_Cmake_Mpi - Fatal编程技术网

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

如何使用cmake编译包含MPI的c程序,c,cmake,mpi,C,Cmake,Mpi,我正在尝试将openmp和mpi技术应用到需要构建“cmake.&make”的开源C程序中。我已经找到了如何包含-fopenmp标志,但仍然对mpi感到困惑。对此我能做些什么?OpenMP 这是关于OpenMP的问题吗?然后,您所要做的就是使用-fopenmp进行编译,您可以将它附加到CMAKE_C_FLAGS中,例如: SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp) MPI 对于MPI,必须首先找到MPI find_package(MPI) #ma

我正在尝试将openmp和mpi技术应用到需要构建“cmake.&make”的开源C程序中。我已经找到了如何包含-fopenmp标志,但仍然对mpi感到困惑。对此我能做些什么?

OpenMP 这是关于OpenMP的问题吗?然后,您所要做的就是使用
-fopenmp
进行编译,您可以将它附加到
CMAKE_C_FLAGS
中,例如:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp)
MPI 对于MPI,必须首先找到MPI

find_package(MPI) #make it REQUIRED, if you want
然后将其头文件添加到搜索路径

include_directories(SYSTEM ${MPI_INCLUDE_PATH})
最后链接您的程序(在我的例子中是
my\u mpi\u target


在基于目标的现代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}) 
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)
或者更简单:

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运行程序(使用指定数量的进程),请检查以下回答:

OpenMP和MPI是两个不同的概念。OpenMP与编译器指令一起工作,而MPI只是一个可链接的库。但是,为了简化链接,在使用MPI编译时,通常会使用编译器包装器。通常称为mpicc等。将CC设置为指向该包装器可能会有所帮助。这足够了吗?关于
MPI\uu编译\u标志
MPI\uu链接\u标志
?对于OpenMP,如果您正在构建库,我也需要添加
target\u链接\u库(target gomp)
关于
MPI\uu编译/链接\u标志
?C++也链接到C库吗?@ DaseSy是的,现代CGube会为你找到这些变量(我在Ubuntu 16.04 +CuS令3.9环境中验证了)。请参阅中的更多变量和详细信息。也就是说,它还取决于您使用的CMake版本。查看官方文档以了解您正在使用的版本的信息。在CMake 3.9及更高版本中,您可以使用以下内容:
target\u link\u库(主私有MPI::MPI\u C)
。使用导入的目标更好。
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)