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 4
是 mpirun
的参数,而不是您的程序的参数。
【讨论】:
谢谢!但是您知道如何在 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 文件中同时使用 OpenMP 和 MPI 的用户:
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 中的处理器数量的主要内容,如果未能解决你的问题,请参考以下文章