首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将OpenMP和MPI导入到大型CLion CMake项目?

如何将OpenMP和MPI导入到大型CLion CMake项目?
EN

Stack Overflow用户
提问于 2020-01-13 08:54:23
回答 2查看 1.3K关注 0票数 5

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

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

main.cpp:

代码语言:javascript
运行
复制
#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();
}

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

代码语言:javascript
运行
复制
$ mpicxx main.cpp -o main.out
$ mpirun -np 2 main.out

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

CMakeLists.txt:

代码语言:javascript
运行
复制
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项目并成功运行。

但我的第二个问题是,我如何同时包含OpenMP和MPI?似乎不能仅仅合并MPI项目和OpenMP项目的两个CMakeLists.txt。因为我得到了一个关于-fopenmp标志的错误:

代码语言:javascript
运行
复制
clang: error: unsupported option '-fopenmp'

CMakeLists.txt:

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-07 08:11:10

CMakeLists.txt不应该这么复杂。应该是这样的:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.12)
project(OpenMP_MPI)

set(CMAKE_CXX_STANDARD 14)

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

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")

add_executable(OpenMP_MPI main.cpp)

target_link_libraries(OpenMP_MPI ${MPI_C_LIBRARIES})

对于linux,您应该使用下面的命令来构建和运行。

代码语言:javascript
运行
复制
mkdir build && cd build && cmake .. && make && mpirun -n 2 ./OpenMP_MPI

对于MacOS,只需将命令更改为

代码语言:javascript
运行
复制
mkdir build && cd build && cmake -DCMAKE_CXX_COMPILER=g++-9 .. && make && mpirun -n 2 ./OpenMP_MPI

应该管用的。(您可以转到/usr/local/bin检查编译器是否为g++-9。)

票数 1
EN

Stack Overflow用户

发布于 2020-01-13 09:21:31

因此,我的第一个问题是如何使用多个处理器,就像在终端上使用"mpirun -np 4 xxxx“一样?

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

代码语言:javascript
运行
复制
$ mpirun -np 4 xxxx

要在CLion中这样做,可以运行/调试配置,添加mpirun作为可执行文件,添加-np 4 xxxx作为程序参数,如这里所示。

但是,-fopenmp标志会出现一些错误:

我知道使用clang在Mac上编译openmp程序并不那么简单。您可以查看这个答案获得更多信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59713236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档