如何使用 CMake 选择 MPI vendor/distribution?
How to choose MPI vendor/distribution with CMake?
我有一个程序,我想用 CMake + make 编译,但使用两个不同的 MPI 发行版,OpenMPI 和 MPICH。
在Ubuntu中,我都安装了;这些是我安装的所有编译器包装器:
mpic++ mpicxx mpif77.mpich mpijavac
mpicc mpicxx.mpich mpif77.openmpi mpijavac.pl
mpiCC mpicxx.openmpi mpif90 mpirun
mpicc.mpich mpiexec mpif90.mpich mpirun.mpich
mpicc.openmpi mpiexec.hydra mpif90.openmpi mpirun.openmpi
mpiCC.openmpi mpiexec.mpich mpifort mpivars
mpichversion mpiexec.openmpi mpifort.mpich
mpic++.openmpi mpif77 mpifort.openmpi
(OpenMPI 是默认的,即当没有指定分发扩展时。我没有使用模块。)
如何强制 CMake 选择 MPICH 而不是 OpenMPI?
我尝试设置 -DMPI_ROOT=/usr/lib/x86_64-linux-gnu/mpich
但是
我收到此错误:
-- Could NOT find MPI_CXX (missing: MPI_CXX_WORKS)
CMake Error at /usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
Could NOT find MPI (missing: MPI_CXX_FOUND)
Reason given by package: MPI component 'C' was requested, but language C is not enabled. MPI component 'Fortran' was requested, but language Fortran is not enabled.
Call Stack (most recent call first):
/usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.18/Modules/FindMPI.cmake:1721 (find_package_handle_standard_args)
CMakeLists.txt:11 (find_package)
它仍然使用 OpenMPI。
这是我的 CMakeLists.txt
的样子:
cmake_minimum_required(VERSION 3.12.0)
project(myproject VERSION 0.1 LANGUAGES CXX)
#enable_language(C) #uncommenting these doesn't help
#enable_language(Fortran)
enable_testing()
include(CTest)
find_package(MPI REQUIRED)
设置 -DMPI_ROOT=
或 -DMPI_HOME=
对我不起作用。它仍然使用我系统中的默认设置 (OpenMPI)。
有效的是设置 -DMPI_EXECUTABLE_SUFFIX=.mpich
,我在文档末尾找到的选项:https://cmake.org/cmake/help/latest/module/FindMPI.html.
基于 cmake documents,您应该可以通过设置 MPI_GUESS_LIBRARY_NAME
.
的值 select 一个
更新:根据同一文档:
Try to find an MPI implementation that does not ship such a wrapper by guessing settings. Currently, only Microsoft MPI and MPICH2 on Windows are supported.
我有一个程序,我想用 CMake + make 编译,但使用两个不同的 MPI 发行版,OpenMPI 和 MPICH。
在Ubuntu中,我都安装了;这些是我安装的所有编译器包装器:
mpic++ mpicxx mpif77.mpich mpijavac
mpicc mpicxx.mpich mpif77.openmpi mpijavac.pl
mpiCC mpicxx.openmpi mpif90 mpirun
mpicc.mpich mpiexec mpif90.mpich mpirun.mpich
mpicc.openmpi mpiexec.hydra mpif90.openmpi mpirun.openmpi
mpiCC.openmpi mpiexec.mpich mpifort mpivars
mpichversion mpiexec.openmpi mpifort.mpich
mpic++.openmpi mpif77 mpifort.openmpi
(OpenMPI 是默认的,即当没有指定分发扩展时。我没有使用模块。)
如何强制 CMake 选择 MPICH 而不是 OpenMPI?
我尝试设置 -DMPI_ROOT=/usr/lib/x86_64-linux-gnu/mpich
但是
我收到此错误:
-- Could NOT find MPI_CXX (missing: MPI_CXX_WORKS)
CMake Error at /usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
Could NOT find MPI (missing: MPI_CXX_FOUND)
Reason given by package: MPI component 'C' was requested, but language C is not enabled. MPI component 'Fortran' was requested, but language Fortran is not enabled.
Call Stack (most recent call first):
/usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.18/Modules/FindMPI.cmake:1721 (find_package_handle_standard_args)
CMakeLists.txt:11 (find_package)
它仍然使用 OpenMPI。
这是我的 CMakeLists.txt
的样子:
cmake_minimum_required(VERSION 3.12.0)
project(myproject VERSION 0.1 LANGUAGES CXX)
#enable_language(C) #uncommenting these doesn't help
#enable_language(Fortran)
enable_testing()
include(CTest)
find_package(MPI REQUIRED)
设置 -DMPI_ROOT=
或 -DMPI_HOME=
对我不起作用。它仍然使用我系统中的默认设置 (OpenMPI)。
有效的是设置 -DMPI_EXECUTABLE_SUFFIX=.mpich
,我在文档末尾找到的选项:https://cmake.org/cmake/help/latest/module/FindMPI.html.
基于 cmake documents,您应该可以通过设置 MPI_GUESS_LIBRARY_NAME
.
更新:根据同一文档:
Try to find an MPI implementation that does not ship such a wrapper by guessing settings. Currently, only Microsoft MPI and MPICH2 on Windows are supported.