查找MPI

查找消息传递接口 (MPI) 实现。

消息传递接口 (MPI) 是用于编写高性能分布式内存并行应用程序的库,通常部署在集群上。 MPI 是一个标准接口(由 MPI 论坛定义),有许多实现可用。

在 3.10 版本加入: 模块的大修:许多新变量,每种语言的组件,支持更广泛的运行时。

使用 MPI 的变量

该模块公开了组件“C”、“CXX”、“MPICXX”和“Fortran”。其中每一个都控制要搜索的各种 MPI 语言。 CXXMPICXX 之间的区别在于 CXX 指的是可从 C++ 使用的 MPI C API,而 MPICXX 指的是再次被删除的 MPI-2 C++ API在 MPI-3 中。

根据启用的组件,将设置以下变量:

MPI_FOUND

指示已找到所有请求语言的 MPI 设置的变量。如果未指定任何组件,则如果检测到所有已启用语言的 MPI 设置,则为真。请注意,MPICXX 组件不会影响此变量。

MPI_VERSION

在请求的语言中检测到最低版本的 MPI,如果未指定组件,则检测到所有启用的语言。

该模块将为您的项目中的每种语言设置以下变量,其中 <lang> 是 C、CXX 或 Fortran 之一:

MPI_<lang>_FOUND

找到了指示 <lang> 的 MPI 设置的变量,并且简单的 MPI 测试程序使用提供的设置进行编译。

MPI_<lang>_COMPILER

<lang> 的 MPI 编译器(如果存在这样的程序)。

MPI<语言 COMPILE_OPTIONS

<lang> 中 MPI 程序的编译选项,作为 ;-list 给出。

MPI<语言 COMPILE_DEFINITIONS

<lang> 中 MPI 程序的编译定义,作为 ;-list 给出。

MPI_<lang>_INCLUDE_DIRS

包括 MPI 标头的路径。

MPI_<lang>_LINK_FLAGS

MPI 程序的链接器标志。

MPI_<lang>_LIBRARIES

链接 MPI 程序的所有库。

在 3.9 版本加入: 此外,还定义了以下 IMPORTED 目标:

MPI::MPI_<lang>

使用来自 <lang> 的 MPI 的目标。

将定义以下指示存在哪些绑定的变量:

MPI_MPICXX_FOUND

指示 MPI-2 C++ 绑定是否存在的变量(在 MPI-2 中引入,随 MPI-3 一起删除)。

MPI_Fortran_HAVE_F77_HEADER

如果 Fortran 77 标头“mpif.h”可用,则为真。

MPI_Fortran_HAVE_F90_MODULE

如果 Fortran 90 模块“mpi”可用于访问 MPI(仅限 MPI-2 及更高版本),则为真。

MPI_Fortran_HAVE_F08_MODULE

如果 Fortran 2008 mpi_f08 可用于 MPI 程序(仅限 MPI-3 及更高版本),则为真。

如果可能,MPI 版本将由该模块确定。检测 MPI 版本的工具是在 MPI-1.2 中引入的,因此对于旧的 MPI 版本是找不到的。

MPI<lang>_VERSION_ MAJOR

MPI 发行版为 <lang> 实现的 MPI 主要版本。

MPI<lang>_VERSION_ MINOR

MPI 分发版为 <lang> 实现的 MPI 次要版本。

MPI_<lang>_VERSION

MPI 发行版为 <lang> 实现的 MPI 版本。

请注意,对于可通过“mpi.h”访问的 C 绑定,没有变量,因为 MPI 标准始终要求此绑定在 C 和 C++ 代码中工作。

为了运行 MPI 程序,该模块设置了以下变量

MPIEXEC_EXECUTABLE

用于运行 MPI 程序的可执行文件(如果存在)。

MPIEXEC_NUMPROC_FLAG

在给它运行的处理器数量之前传递给 mpiexec 的标志。

MPIEXEC_MAX_NUMPROCS

要使用的 MPI 处理器数。默认为在主机系统上检测到的处理器数。

MPIEXEC_PREFLAGS

在要运行的可执行文件之前直接传递给“mpiexec”的标志。

MPIEXEC_POSTFLAGS

在其他标志之后传递给 mpiexec 的标志。

用于定位 MPI 的变量

该模块对 MPI 实现执行四步搜索:

  1. 搜索“MPIEXEC_EXECUTABLE”,如果找到,则使用其基本目录。

  2. 检查编译器是否内置了 MPI 支持。如果用户将编译器包装器作为 CMAKE_<LANG>_COMPILER 传递,或者他们使用 Cray 系统编译器包装器,就会出现这种情况。

  3. 尝试找到 MPI 编译器包装器并从中确定编译器信息。

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

为了控制“MPIEXEC_EXECUTABLE”步骤,可以设置以下变量:

MPIEXEC_EXECUTABLE

手动指定 mpiexec 的位置。

MPI_HOME

指定 MPI 安装的基本目录。

ENV{MPI_HOME}

用于指定 MPI 安装基目录的环境变量。

ENV{I_MPI_ROOT}

用于指定 MPI 安装基目录的环境变量。

为了控制编译器包装器步骤,可以设置以下变量:

MPI_<lang>_COMPILER

搜索指定的编译器包装器并使用它。

MPI_<lang>_COMPILER_FLAGS

在询问期间传递给 MPI 编译器包装器的标志。如果传递了特定标志,一些编译器包装器支持链接调试或跟踪库,并且可以使用此变量来获取它们。

MPI_COMPILER_FLAGS

如果没有给出特定于语言的标志,则用于初始化“MPI_<lang>_COMPILER_FLAGS”。默认为空。

MPI_EXECUTABLE_SUFFIX

附加到正在查找的所有名称的后缀。例如,您可以将其设置为 .mpich.openmpi 以在 Debian 及其衍生产品上更喜欢其中一个。

为了控制猜测步骤,可以设置以下变量:

MPI_GUESS_LIBRARY_NAME

有效值为“MSMPI”和“MPICH2”。如果设置,将只搜索给定的库。默认情况下,MSMPI 将优先于 MPICH2 如果两者都可用。这还将“MPI_SKIP_COMPILER_WRAPPER”设置为“true”,这可能会被覆盖。

可以使用以下控制变量跳过每个搜索步骤:

MPI_ASSUME_NO_BUILTIN_MPI

如果为真,则模块假定编译器本身不提供 MPI 实现并跳到步骤 2。

MPI_SKIP_COMPILER_WRAPPER

如果为真,则不会搜索编译器包装器。

MPI_SKIP_GUESSING

如果为真,则将跳过猜测步骤。

此外,以下控制变量可用于更改搜索行为:

MPI_CXX_SKIP_MPICXX

添加一些将禁用 MPI-2 C++ 绑定的定义。当前支持的是 MPICH、Open MPI、Platform MPI 及其衍生产品,例如 MVAPICH 或 Intel MPI。

如果变量“MPI_<lang>_WORKS”的查找过程失败,则由模块检测到或传递给模块的设置不起作用,甚至一个简单的 MPI 测试程序也无法编译。

如果所有这些参数都不足以找到正确的 MPI 实现,用户可以通过在 MPI_<lang>_LIBRARIES 中指定库列表和 MPI_ 中的包含目录列表来禁用整个自动检测过程<lang>_ADDITIONAL_INCLUDE_DIRS。除了这两个之外,还可以设置任何其他变量。然后模块将验证 MPI 设置并将设置存储在缓存中。

MPI 的缓存变量

变量 MPI_<lang>_INCLUDE_DIRS 将从以下变量中组装。对于 C 和 CXX:

MPI_<lang>_HEADER_DIR

mpi.h 头文件在磁盘上的位置。

对于 Fortran:

MPI_Fortran_F77_HEADER_DIR

Fortran 77 标头 mpif.h 的位置(如果存在)。

MPI_Fortran_MODULE_DIR

mpimpi_f08 模块的位置(如果可用)。

对于所有语言,还考虑以下变量:

MPI_<lang>_ADDITIONAL_INCLUDE_DIRS

A ;-list 除了正常的包含目录之外还需要的路径。

MPI<include name>INCLUDE DIR

包含由``<include_name>``引用的文件夹的路径变量。

MPI_<lang>_ADDITIONAL_INCLUDE_VARS

A ;-list<include_name> 将被添加到 <lang> 的包含位置。

变量 MPI_<lang>_LIBRARIES 将从以下变量中组装:

MPI_<lib_name>_LIBRARY

用于 MPI 的名为“<lib_name>”的库的位置。

MPI_<lang>_LIB_NAMES

A ;-list of <lib_name> 将添加到 <lang> 的包含位置。

mpiexec的使用

当使用 MPIEXEC_EXECUTABLE 来执行 MPI 应用程序时,您通常应该使用所有的 MPIEXEC_EXECUTABLE 标志,如下所示:

${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS}
  ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS

其中 EXECUTABLE 是 MPI 程序,ARGS 是传递给 MPI 程序的参数。

使用 MPI 的高级变量

该模块可以根据明确请求执行一些高级功能检测。

**重要提示:**如果不*执行* MPI 测试程序,则无法执行以下检查。考虑交叉编译期间 try_run() 行为的特殊注意事项。此外,运行 MPI 程序可能会导致其他问题,例如某些系统上的防火墙通知。如果您绝对需要这些信息,您应该只启用这些检测。

如果以下变量设置为真,将执行相应的搜索:

MPI_DETERMINE_Fortran_CAPABILITIES

为所有可用的 Fortran 绑定确定 MPI_SUBARRAYS_SUPPORTEDMPI_ASYNC_PROTECTS_NONBLOCKING 的值是什么,并使它们的值可用作 MPI_Fortran_<binding>_SUBARRAYSMPI_Fortran_<binding>_ASYNCPROT,其中 ` <binding>`F77_HEADERF90_MODULEF08_MODULE 之一。

MPI_DETERMINE_LIBRARY_VERSION

对于每种语言,找到“MPI_Get_library_version”的输出并将其作为“MPI_<lang>_LIBRARY_VERSION_STRING”提供。此信息通常与 MPI 实现的运行时组件相关联,并且可能因“<lang>”而异。请注意,返回值完全由实现定义。此信息可用于识别 MPI 供应商,例如从多个第三方二进制文件中选择与 MPI 供应商匹配的正确一个。

向后兼容性

自 3.10 版本弃用.

为了与旧版本的 FindMPI 向后兼容,设置了这些变量:

MPI_COMPILER        MPI_LIBRARY        MPI_EXTRA_LIBRARY
MPI_COMPILE_FLAGS   MPI_INCLUDE_PATH   MPI_LINK_FLAGS
MPI_LIBRARIES

在新项目中,请使用 MPI_<lang>_XXX 等价物。此外,以下变量已弃用:

MPI<语言 COMPILE_FLAGS

请改用``MPI<lang>COMPILE_OPTIONS`` 和``MPI<lang>COMPILE_DEFINITIONS``。

MPI<lang>c_INCLUDE_PATH

对于消费,使用``MPI_<lang>_INCLUDE_DIRS``,对于指定文件夹,使用``MPI_<lang>_ADDITIONAL_INCLUDE_DIRS``。

MPIEXEC

请改用``MPIEXEC_EXECUTABLE``。