【问题标题】:How to choose MPI vendor/distribution with CMake?如何使用 CMake 选择 MPI 供应商/发行版?
【发布时间】:2022-01-26 20:50:33
【问题描述】:

我有一个程序,我想用 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)

【问题讨论】:

    标签: c++ linux cmake mpi


    【解决方案1】:

    设置 -DMPI_ROOT=-DMPI_HOME= 对我不起作用。它仍然使用我系统中的默认值 (OpenMPI)。

    有效的是设置-DMPI_EXECUTABLE_SUFFIX=.mpich,我在文档末尾附近找到的选项:https://cmake.org/cmake/help/latest/module/FindMPI.html

    【讨论】:

      【解决方案2】:

      基于cmake documents,你应该可以通过设置MPI_GUESS_LIBRARY_NAME的值来选择一个。

      更新:根据同一文件:

      尝试通过猜测设置来找到不提供此类包装器的 MPI 实现。目前,仅支持 Windows 上的 Microsoft MPI 和 MPICH2。

      【讨论】:

      • 根据文档,它可疑地与字符串 MPICH2 和 MSMPI 一起使用。特别是-DMPI_GUESS_LIBRARY_NAME=MPICH2 对我不起作用。也许它适用于不同的设置。
      • @alfC 我的错误。似乎猜测库仅适用于 Windows。更新的答案。您可以通过手动设置MPIEXEC_EXECUTABLE 来做到这一点,但不确定。
      • 是的,或者实际上每个编译器包装器也是如此。 mpiexec 只是等式的一部分,这是执行支持 mpi 的程序的程序。
      • 构建系统到底需要如何“支持”第 3 方产品?在生成文件中,您将使用包含/链接路径和编译器名称设置一些变量并完成。这很愚蠢。我可以从源代码下载和编译 MPI。构建系统如何先发制人地处理这个问题?抱歉,我只是在发泄一下 cmake。
      • @VictorEijkhout 我同意,一些 CMake 程序的逻辑“甚至没有错”:我什至不知道从哪里开始批评它们。另一方面,CMake 的观点是我们必须感谢 CMake 至少附带了一个 FindMPI 模块。在 CMake 完美世界中,MPI 库(发行版?)应该随其相应的 CMake 模块一起提供。现在,由于 MPI 首先是一个标准,也许这会迫使所有发行版就兼容的 CMake 模块达成一致,这可能永远不会发生。 CMake 模型自然而然地分解为“标准”:BLAS 支持也非常复杂。
      猜你喜欢
      • 2021-09-09
      • 2015-05-18
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多