FindMPI¶
查找消息传递接口 (MPI) 实现。
消息传递接口 (MPI) 是用于编写高性能分布式内存并行应用程序的库,通常部署在集群上。MPI 是一个标准接口(由 MPI 论坛定义),有许多可用的实现。
在 3.10 版中添加: 模块的主要修改:许多新变量、按语言的组件、支持更广泛的运行库。
使用 MPI 的变量¶
该模块控制 C
、CXX
、MPICXX
和 Fortran
组件。每个组件都控制要搜索的不同 MPI 语言。CXX
和 MPICXX
之间的区别在于,CXX
指的是可从 C++ 使用的 MPI C API,而 MPICXX
指的是在 MPI-3 中再次移除的 MPI-2 C++ API。
根据启用的组件,将设置以下变量
MPI_FOUND
变量指示已找到所有请求语言的 MPI 设置。如果没有指定任何组件,当检测到所有已启用语言的 MPI 设置时,该变量为 true。请注意,
MPICXX
组件不影响此变量。MPI_VERSION
在请求的语言中检测到的 MPI 最小版本,如果没有指定任何组件,则为所有已启用语言的 MPI 最小版本。
此模块将在项目中为每种语言设置以下变量,其中 <lang>
是 C、CXX 或 Fortran 之一
MPI_<lang>_FOUND
变量指示已找到
<lang>
的 MPI 设置,并且使用提供的设置编译的简单 MPI 测试程序。MPI_<lang>_COMPILER
MPI 编译器,如果存在
<lang>
的程序。MPI_<lang>_COMPILE_OPTIONS
在
<lang>
中 MPI 程序的编译选项,给定为 ;-列表。MPI_<lang>_COMPILE_DEFINITIONS
在
<lang>
中 MPI 程序的编译定义,给定为 ;-列表。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
可用,则为 True。MPI_Fortran_HAVE_F90_MODULE
如果可使用 Fortran 90 模块
mpi
访问 MPI,则为 True(仅适用于 MPI-2 及更高版本)。MPI_Fortran_HAVE_F08_MODULE
如果可以使用 Fortran 2008
mpi_f08
来运行 MPI 程序,则为 True(仅适用于 MPI-3 及更高版本)。
如果可能,由该模块确定 MPI 版本。MPI-1.2 版本中引入了检测 MPI 版本的功能,因此无法在较早的 MPI 版本中找到此功能。
MPI_<lang>_VERSION_MAJOR
由 MPI 分布实施的 MPI 的主要版本,适用于
<lang>
MPI_<lang>_VERSION_MINOR
由 MPI 分布实施的 MPI 的次要版本,适用于
<lang>
MPI_<lang>_VERSION
由 MPI 分布实施的 MPI 版本,适用于
<lang>
请注意,无法通过 mpi.h
访问 C 绑定,没有为此设置变量,因为 MPI 标准始终要求此绑定在 C 和 C++ 代码中均能运行。
对于运行 MPI 程序,模块设置以下变量
MPIEXEC_EXECUTABLE
如果存在,用于运行 MPI 程序的可执行文件。
MPIEXEC_NUMPROC_FLAG
传递给
mpiexec
的标志,在提供要在其上运行的处理器数之前传递给mpiexec
MPIEXEC_MAX_NUMPROCS
要使用的 MPI 处理器数。默认为在主机系统上检测到的处理器数。
MPIEXEC_PREFLAGS
在要运行的可执行文件之前直接传递给
mpiexec
的标志。MPIEXEC_POSTFLAGS
在其他标志之后传递给
mpiexec
的标志。
用于定位 MPI 的变量¶
该模块对 MPI 实现执行四步搜索
搜索
MPIEXEC_EXECUTABLE
,如果找到,则使用它的基础目录。检查编译器是否具有内置的 MPI 支持。如果用户将编译器包装器作为
CMAKE_<LANG>_COMPILER
传递,或如果他们使用 Cray 系统编译器包装器,则这种情况适用。尝试查找 MPI 编译器包装器,并从中确定编译器信息。
尝试查找未随附此类包装器的 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
如果为 true,则该模块假定编译器本身不提供 MPI 实现,并跳到步骤 2。
MPI_SKIP_COMPILER_WRAPPER
如果为 true,则不会搜索任何编译器包装器。
MPI_SKIP_GUESSING
如果为 true,则将跳过猜测步骤。
此外,可以使用以下控制变量来更改搜索行为
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
mpi
或mpi_f08
模块(如可用)的位置。
对于所有语言,还会考虑以下变量
MPI_<lang>_ADDITIONAL_INCLUDE_DIRS
除了常规包含目录之外,所需的路径的 ;-list。
MPI_<include_name>_INCLUDE_DIR
<include_name>
引用包含的文件夹的路径变量。MPI_<lang>_ADDITIONAL_INCLUDE_VARS
将添加到
<lang>
的包含位置的<include_name>
的 ;-list。
变量 MPI_<lang>_LIBRARIES
将从以下变量进行组合
MPI_<lib_name>_LIBRARY
供 MPI 使用名为
<lib_name>
的库的位置。MPI_<lang>_LIB_NAMES
将添加到
<lang>
的包含位置的<lib_name>
的 ;-list。
使用 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 程序可能会造成其他问题,例如某些系统上的防火墙通知。只有在您绝对需要这些信息时,才应启用这些检测。
如果将以下变量设置为 true,将执行相应的搜索
MPI_DETERMINE_Fortran_CAPABILITIES
确定对于所有可用的 Fortran 绑定
MPI_SUBARRAYS_SUPPORTED
和MPI_ASYNC_PROTECTS_NONBLOCKING
的值是什么,并使其值作为MPI_Fortran_<binding>_SUBARRAYS
和MPI_Fortran_<binding>_ASYNCPROT
提供,其中<binding>
是F77_HEADER
、F90_MODULE
和F08_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_<lang>_COMPILE_FLAGS
改为使用
MPI_<lang>_COMPILE_OPTIONS
和MPI_<lang>_COMPILE_DEFINITIONS
。MPI_<lang>_INCLUDE_PATH
对于消耗,请使用
MPI_<lang>_INCLUDE_DIRS
,对于指定文件夹,请改为使用MPI_<lang>_ADDITIONAL_INCLUDE_DIRS
。MPIEXEC
改为使用
MPIEXEC_EXECUTABLE
。