MPI:更改 CMakelist 中的处理器数量
MPI: Change number of processors in CMakelists
我正在使用 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 process 0 of 1
您使用的处理器数量与编译过程无关,因此与您的 CMakeLists.txt 无关(除了使用 CTest 时,但那是另一个话题)。
您只需使用 mpicxx
或您现在的方式编译可执行文件,然后 运行 使用
mpirun -np 4 nameOfExe
请注意 -np 4
是 mpirun
的参数,而不是您的程序。
您不能指定要在 CMakeLists.txt 中使用的进程数。进程数是您在使用 mpi运行.
执行程序时指定的参数
为了编译一个 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 默认输出编译文件的位置。
您可以在 "Build, Execution and Deployment" -> "CMake" 中的设置下为编译后的文件指定另一个位置。我只是把它改成了项目文件夹。
接下来我编辑了 运行 配置。 "Run" -> "Edit Configurations" -> 将可执行文件设置为 mpi运行。 (mpi运行 在你机器上的位置)
接下来我将 "Program arguments" 编辑为
-np 4 /home/mitzh/ClionProjects/hellompi/Debug/hellompi
使用 4 个进程执行我的程序。
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...
并作为 可执行文件 设置 mprirun
(可执行文件的位置可以通过在命令行中使用命令 whereis
找到)。
在 程序参数 内设置 -np <number of processes> <some other arguments>
。例如 -np 4 /home/desktop/parallel_task
将使用 4 个进程执行程序。
我正在使用 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 process 0 of 1
您使用的处理器数量与编译过程无关,因此与您的 CMakeLists.txt 无关(除了使用 CTest 时,但那是另一个话题)。
您只需使用 mpicxx
或您现在的方式编译可执行文件,然后 运行 使用
mpirun -np 4 nameOfExe
请注意 -np 4
是 mpirun
的参数,而不是您的程序。
您不能指定要在 CMakeLists.txt 中使用的进程数。进程数是您在使用 mpi运行.
执行程序时指定的参数为了编译一个 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 默认输出编译文件的位置。 您可以在 "Build, Execution and Deployment" -> "CMake" 中的设置下为编译后的文件指定另一个位置。我只是把它改成了项目文件夹。
接下来我编辑了 运行 配置。 "Run" -> "Edit Configurations" -> 将可执行文件设置为 mpi运行。 (mpi运行 在你机器上的位置)
接下来我将 "Program arguments" 编辑为
-np 4 /home/mitzh/ClionProjects/hellompi/Debug/hellompi
使用 4 个进程执行我的程序。
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...
并作为 可执行文件 设置 mprirun
(可执行文件的位置可以通过在命令行中使用命令 whereis
找到)。
在 程序参数 内设置 -np <number of processes> <some other arguments>
。例如 -np 4 /home/desktop/parallel_task
将使用 4 个进程执行程序。