MPI:更改 CMakelists 中的处理器数量

Posted

技术标签:

【中文标题】MPI:更改 CMakelists 中的处理器数量【英文标题】:MPI: Change number of processors in CMakelists 【发布时间】:2015-09-25 04:07:00 【问题描述】:

我正在使用 CLion。我的 CMakeLists.txt 看起来像这样:

cmake_minimum_required(VERSION 3.2)

project(MPI)

add_executable(MPI main.cpp)

# Require MPI for this project:
find_package(MPI REQUIRED)

set(CMAKE_CXX_COMPILE_FLAGS $CMAKE_CXX_COMPILE_FLAGS $MPI_COMPILE_FLAGS)
set(CMAKE_CXX_LINK_FLAGS $CMAKE_CXX_LINK_FLAGS $MPI_LINK_FLAGS)

include_directories(MPI_INCLUDE_PATH)
target_link_libraries(MPI $MPI_LIBRARIES)

MPI - Hello World 运行良好。 但是如何更改 cmakelists 中的处理器数量?

我已经尝试将 -np 4 和 -n 4 添加到 CLion 中的程序参数中。但我还是得到了

Hello World 进程 0 of 1

【问题讨论】:

【参考方案1】:

您无法在 CMakeLists.txt 中指定要使用的进程数。进程数是您在使用 mpirun 执行程序时指定的参数。

要编译 mpi C 项目,我使用以下 CMakeLists.txt

cmake_minimum_required(VERSION 3.3)
project(hellompi)

find_package(MPI REQUIRED)
include_directories($MPI_INCLUDE_PATH)

SET(CMAKE_C_COMPILER mpicc)
SET(CMAKE_CXX_COMPILER mpicxx)

set(SOURCE_FILES main.c)
add_executable(hellompi $SOURCE_FILES)

为了从 Clion 执行程序,我首先更改了 Clion 默认将编译文件输出到的 (obscure) 位置。 您可以在“构建、执行和部署”->“CMake”中的设置下为编译文件指定另一个位置。我只是将其更改为项目文件夹。

接下来我编辑了运行配置。 “运行”->“编辑配置”-> 将可执行文件设置为 mpirun。 (你机器上 mpirun 的位置)

接下来我将“程序参数”编辑为

-np 4 /home/mitzh/ClionProjects/hellompi/Debug/hellompi

使用 4 个进程执行我的程序。

【讨论】:

这个答案的诺贝尔奖 终于我找到了一个可行的 CMakeLists!谢谢!【参考方案2】:

您使用的处理器数量与编译过程无关,因此与您的 CMakeLists.txt 无关(使用 CTest 时除外,但这是另一个主题)。

您只需编译可执行文件,使用mpicxx 或您现在的方式,然后运行它

mpirun -np 4 nameOfExe

请注意,-np 4mpirun 的参数,而不是您的程序的参数。

【讨论】:

谢谢!但是您知道如何在 CLion (IDE) 中进行操作吗?我的意思是我试图在程序参数中添加“-np 4”,但没有帮助。 @Joey 我不知道 CLion,但我认为您需要通过 mpi 包装器运行它。将-np 4 传递给nameOfExe 将不起作用。 @luk32 谢谢,但我不知道如何像你提到的那样做:( 但我在这里找到了这个:“set(MPIEXEC_MAX_NUMPROCS "2" CACHE STRING "可运行的最大处理器数MPI 应用程序。")" -> github.com/realstolz/powerlyra/blob/master/cmake/… 那么你可以让它还在 CMakeList 中吗? @Joey 同样,这与编译和 CMake 无关,而是与执行最终二进制文件的方式有关。我不了解 CLion,也不知道它是否可以处理这种启动二进制文件的特殊方式。如果没有,只需在命令行中启动它。 @joey Google "CLion mpirun" 它会产生一些结果如何定义自定义启动器或类似的东西。【参考方案3】:

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 执行程序

要直接从 CLion 运行程序,请单击 Edit Configurations... 并设置为 executable 设置 mprirun(可执行文件的位置可以通过使用命令中的命令 whereis 找到行)。

程序参数中设置-np <number of processes> <some other arguments>。例如-np 4 /home/desktop/parallel_task 将执行具有 4 个进程的程序。

【讨论】:

以上是关于MPI:更改 CMakelists 中的处理器数量的主要内容,如果未能解决你的问题,请参考以下文章

MPI - 平行点积计算

利用MPI实现Cannon算法并行矩阵乘法

利用MPI实现Cannon算法并行矩阵乘法

利用MPI实现Cannon算法并行矩阵乘法

更改 CLion 中的默认 CMakeLists.txt 以包含警告

All to All 广播实现和 MPI