查找MPI¶
查找消息传递接口 (MPI) 实现。
消息传递接口 (MPI) 是用于编写高性能分布式内存并行应用程序的库,通常部署在集群上。 MPI 是一个标准接口(由 MPI 论坛定义),有许多实现可用。
在 3.10 版本加入: 模块的大修:许多新变量,每种语言的组件,支持更广泛的运行时。
使用 MPI 的变量¶
该模块公开了组件“C”、“CXX”、“MPICXX”和“Fortran”。其中每一个都控制要搜索的各种 MPI 语言。 CXX 和 MPICXX 之间的区别在于 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_FLAGSMPI 程序的链接器标志。
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_ MAJORMPI 发行版为
<lang>实现的 MPI 主要版本。MPI<lang>_VERSION_ MINORMPI 分发版为
<lang>实现的 MPI 次要版本。MPI_<lang>_VERSIONMPI 发行版为
<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 实现执行四步搜索:
搜索“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如果为真,则模块假定编译器本身不提供 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_DIRmpi.h头文件在磁盘上的位置。
对于 Fortran:
MPI_Fortran_F77_HEADER_DIRFortran 77 标头
mpif.h的位置(如果存在)。MPI_Fortran_MODULE_DIRmpi或mpi_f08模块的位置(如果可用)。
对于所有语言,还考虑以下变量:
MPI_<lang>_ADDITIONAL_INCLUDE_DIRSA ;-list 除了正常的包含目录之外还需要的路径。
MPI<include name>INCLUDE DIR包含由``<include_name>``引用的文件夹的路径变量。
MPI_<lang>_ADDITIONAL_INCLUDE_VARSA ;-list 的
<include_name>将被添加到<lang>的包含位置。
变量 MPI_<lang>_LIBRARIES 将从以下变量中组装:
MPI_<lib_name>_LIBRARY用于 MPI 的名为“<lib_name>”的库的位置。
MPI_<lang>_LIB_NAMESA ;-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_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<语言 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``。