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

9

我正在使用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

3个回答

20

在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默认输出已编译文件的(晦涩难懂)位置。您可以在“构建、执行和部署”->“CMake”设置下指定另一个位置用于编译后的文件。我只是将其更改为项目文件夹。
接下来,我编辑了运行配置。 "运行"->"编辑配置"->将可执行文件设置为mpirun(在您的机器上的mpirun位置)。
接下来,我编辑了“程序参数”为

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

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


2
这个答案的诺贝尔奖 - Kenenbek Arzymatov
1
终于找到一个可用的 CMakeLists!谢谢! - Maximilian Janisch
谢谢!我花了好几天的时间来尝试让它工作,现在终于成功了。即使多年后,这仍然是相关的。 - user4779

3

你使用的处理器数量与编译过程无关,因此与你的CMakeLists.txt无关(除非使用CTest,但那是另一个话题)。

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

mpirun -np 4 nameOfExe

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

谢谢!但是你知道如何在CLion(IDE)中实现吗?我的意思是,我尝试将“-np 4”添加到程序参数中,但没有帮助。 - Joey
@Joey,我不了解CLion,但我认为你需要通过mpi包装器运行它。将“-np 4”传递给“nameOfExe”是行不通的。 - luk32
@luk32谢谢你,但我不知道如何像你提到的那样做:( 但我在这里找到了这个:“set(MPIEXEC_MAX_NUMPROCS "2" CACHE STRING "Maximum number of processors available to run MPI applications.")”-> https://github.com/realstolz/powerlyra/blob/master/cmake/FindMPICH2.cmake 所以你能把它放在CMakeList里吗? - Joey
@Joey 再说一遍,这与编译和CMake无关,而与您执行最终二进制文件的方式有关。我不知道CLion是否可以处理启动二进制文件的特殊方法。如果不能,请在命令行中启动它。 - Baum mit Augen
@BaummitAugen 你说得对。当然,在终端中它是可以工作的。但如果能在CLion中工作,那就更好了 :P - Joey
2
@joey 谷歌搜索“CLion mpirun”,可以得到一些关于如何定义自定义启动器的结果或类似内容。 - luk32

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运行程序,请单击编辑配置...,并将可执行文件设置为mprirun(可以使用命令whereis从命令行找到可执行文件的位置)。

如何编辑配置

程序参数中设置-np <进程数> <其他参数>。例如,-np 4 /home/desktop/parallel_task将使用4个进程来执行程序。

设置可执行文件和程序参数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接