5.2. Open MPI 扩展

Open MPI 包含一个用于扩展MPI API的框架,可供应用程序使用。每个扩展通常是一组独立的功能,与其他扩展不同(类似于Open MPI的插件通常彼此无关)。这些扩展提供了MPI应用程序可用的新函数和/或常量。

警告

这些扩展既非标准,也无法移植到其他MPI实现中!

它们是Open MPI开发者社区向用户提供新功能的一种机制,通常在这些功能被MPI论坛标准化之前。

5.2.1. 可用扩展

此版本Open MPI包含以下扩展功能:

  1. shortfloat: 如果对应的语言类型可用,则提供MPI数据类型 MPIX_C_FLOAT16MPIX_SHORT_FLOATMPIX_SHORT_FLOATMPIX_CXX_SHORT_FLOAT_COMPLEX。详情请参阅 ompi/mpiext/shortfloat/README.txt

  2. affinity: 提供OMPI_Affinity_str() API接口,该接口返回一个字符串,表示进程绑定的资源。更多详情请参阅其手册页。

  3. cuda: 当该库编译时启用了CUDA感知支持,它将提供两项功能。首先是一个宏定义MPIX_CUDA_AWARE_SUPPORT。其次是函数MPIX_Query_cuda_support(),可用于查询支持情况。

  4. example: 一个非功能性扩展;其唯一目的是为如何创建其他扩展提供示例。

  5. ftmpi: 用户级故障缓解(ULFM)提案的一个实现。查看其文档部分获取更多详情。

5.2.2. 编译扩展

Open MPI扩展默认全部启用;可以通过--disable-mpi-ext命令行开关禁用它们。

由于扩展功能仅面向高级用户使用,本文档不具体说明有哪些可用扩展或它们的功能。请查看Open MPI发行版压缩包中的ompi/mpiext目录来了解扩展内容;该目录下的每个子目录都包含一个扩展模块。每个扩展模块都配有README文件来描述其具体功能。

5.2.3. 使用扩展功能

为了强调这些扩展是非标准的,您必须在之后包含一个单独的头文件,以获取函数原型、常量声明等内容。例如:

#include <mpi.h>
#if defined(OPEN_MPI) && OPEN_MPI
#include <mpi-ext.h>
#endif

int main() {
    MPI_Init(NULL, NULL);

#if defined(OPEN_MPI) && OPEN_MPI
    char ompi_bound[OMPI_AFFINITY_STRING_MAX];
    char current_binding[OMPI_AFFINITY_STRING_MAX];
    char exists[OMPI_AFFINITY_STRING_MAX];

    OMPI_Affinity_str(OMPI_AFFINITY_LAYOUT_FMT, ompi_bound,
                      current_bindings, exists);
#endif

    MPI_Finalize();
    return 0;
}

请注意,Open MPI特有的代码被#if语句包围,以确保它仅由Open MPI编译。

Open MPI的包装编译器(mpicc等)会自动插入使用扩展所需的所有相关编译器和链接器标志。与"常规"MPI应用程序相比,无需特殊标志或步骤。