如何使用 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.