c++ - 如何将 OpenMP 和 MPI 导入大型 CLion CMake 项目?

标签 c++ cmake mpi openmp clion

我是 OpenMP 和 MPI 新手,我想将 OpenMP 和 MPI 导入到我现有的 CMake 项目中。因此——

首先,我创建了一个非常简单的 MPI 项目。

main.cpp:

#include "mpi.h"
#include "iostream"

int main(int argc, char** argv){
    MPI_Init(NULL, NULL);

    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    printf("Hello world from processor %s, rank %d out of %d processors\n",processor_name, world_rank, world_size);

    MPI_Finalize();
}

我可以使用以下命令成功编译并运行该项目:

$ mpicxx main.cpp -o main.out
$ mpirun -np 2 main.out

然后我使用 CLion 创建并配置了一个 CMake 项目。我也可以使用 CLion 成功编译并运行它,但它只使用一个处理器。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(Test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

find_package(MPI)
include_directories(${MPI_INCLUDE_PATH})

SET(CMAKE_CXX_COMPILER mpicxx)
SET(CMAKE_C_COMPILER  mpicc)

set(SOURCE_FILES main.cpp)
add_executable(Test ${SOURCE_FILES})

因此我的第一个问题是如何通过 CLion 使用多个处理器?

其次,我创建了一个简单的 OpenMP 项目并成功运行。

但是我的第二个问题是如何同时包含MPI和OpenMP?看来我不能只合并MPI项目和OpenMP项目的两个CMakeLists.txt 。因为我收到有关 -fopenmp 标志的错误:

clang: error: unsupported option '-fopenmp'

CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project(OpenMP_MPI)

set(CMAKE_CXX_STANDARD 14)

OPTION (USE_OpenMP "Use OpenMP to enamble <omp.h>" ON)

if(APPLE)
    set(CMAKE_C_COMPILER "/usr/local/Cellar/llvm/9.0.0_1/bin/clang")
    set(CMAKE_CXX_COMPILER "/usr/local/Cellar/llvm/9.0.0_1/bin/clang++")
    set(OPENMP_LIBRARIES "/usr/local/Cellar/llvm/9.0.0_1/lib")
    set(OPENMP_INCLUDES "/usr/local/Cellar/llvm/9.0.0_1/include")
    if(CMAKE_C_COMPILER_ID MATCHES "Clang")
        set(OpenMP_C "${CMAKE_C_COMPILER}")
        set(OpenMP_C_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
        set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
        set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES})
        set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES})
        set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES})
    endif()
    if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
        set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
        set(OpenMP_CXX_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
        set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
        set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
        set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
        set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
    endif()
endif()

find_package(OpenMP REQUIRED)
if (OPENMP_FOUND)
    if(APPLE)
        include_directories("${OPENMP_INCLUDES}")
        link_directories("${OPENMP_LIBRARIES}")
    endif()
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    # set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif(OPENMP_FOUND)

find_package(MPI REQUIRED)
include_directories(${MPI_INCLUDE_PATH})

SET(CMAKE_CXX_COMPILER mpicxx)
SET(CMAKE_C_COMPILER  mpicc)

add_executable(OpenMP_MPI main.cpp)

最佳答案

Thus my first question is how can I use multiple processors, just like using "mpirun -np 4 xxxx" from terminal?

当您编译 MPI 程序时,进程数不会影响您的编译选项。因此,您的示例代码将在您自己提到的多个进程上运行:

$ mpirun -np 4 xxxx

要在 CLion 中执行此操作,请转到运行/调试配置,然后添加 mpirun 作为可执行文件,添加 -np 4 xxxx 作为程序参数,如 here 所示。

But there will be some errors about -fopenmp flag:

我知道在 Mac 上使用 clang 编译 openmp 程序并不是那么简单。您可以查看 this answer 以获取更多信息。

关于c++ - 如何将 OpenMP 和 MPI 导入大型 CLion CMake 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59713236/

相关文章:

cmake - cmake 与 ccache 交叉编译时 ar 和 strip 不正确

cmake - 某处是否有可用的 cmake 解析器/词法分析器(在 bison/flex 中)?

c++ - C++中不同大小 vector 的迭代映射

C++ 在 "if-else"之外声明类变量

linux - Flutter 找不到所需的包 flutter_secure_storage/linux/CMakeLists.txt :14

parallel-processing - OpenMPI:简单的 2 节点设置

c - MPI_Probe() 挂起

visual-studio - 从 Visual Studio 2013 运行 MPI 应用程序

c++ - boost::serialization: 重载 load_construct_data: 根本没有可访问的构造函数

c++ - C++ 的任何命令行解析库是否允许带有 N 个参数的选项