5.2. Open MPI 扩展
Open MPI 包含一个用于扩展MPI API的框架,可供应用程序使用。每个扩展通常是一组独立的功能,与其他扩展不同(类似于Open MPI的插件通常彼此无关)。这些扩展提供了MPI应用程序可用的新函数和/或常量。
警告
这些扩展既非标准,也无法移植到其他MPI实现中!
它们是Open MPI开发者社区向用户提供新功能的一种机制,通常在这些功能被MPI论坛标准化之前。
5.2.1. 可用扩展
此版本Open MPI包含以下扩展功能:
shortfloat: 如果对应的语言类型可用,则提供MPI数据类型MPIX_C_FLOAT16、MPIX_SHORT_FLOAT、MPIX_SHORT_FLOAT和MPIX_CXX_SHORT_FLOAT_COMPLEX。详情请参阅ompi/mpiext/shortfloat/README.txt。affinity: 提供OMPI_Affinity_str()API接口,该接口返回一个字符串,表示进程绑定的资源。更多详情请参阅其手册页。cuda: 当该库编译时启用了CUDA感知支持,它将提供两项功能。首先是一个宏定义MPIX_CUDA_AWARE_SUPPORT。其次是函数MPIX_Query_cuda_support(),可用于查询支持情况。example: 一个非功能性扩展;其唯一目的是为如何创建其他扩展提供示例。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应用程序相比,无需特殊标志或步骤。