3.6. MPI功能与特性

3.6.1. MPI标准符合性

在Open MPI v5.0.x系列中,支持所有MPI-3.1功能。部分MPI-4.0功能已获得支持。

因此,MPI_VERSION 设置为3,MPI_SUBVERSION 设置为1。

供历史参考:

MPI标准符合性

在Open MPI版本中引入

MPI-2.0

Open MPI v1.2

MPI-2.1

Open MPI v1.3

MPI-3.0

Open MPI v1.8

MPI-3.1

Open MPI v2.0

3.6.1.1. MPI-4.0 部分兼容性

在Open MPI v5.0.x系列中,仅支持部分MPI-4.0功能。本节列出了该版本新增的特性。

  • 增加了对MPI会话的支持。

  • 新增了使用持久发送和持久接收的分区通信功能。

  • 将持久集合操作添加到MPI_命名空间(之前这些功能是通过MPIX_前缀提供的)。

  • 新增了对MPI_Isendrecv()及其变体的支持。

  • 新增了对MPI_Comm_idup_with_info()的支持。

  • 新增对MPI_Info_get_string()的支持。

  • 新增支持initial_error_handler信息键和MPI_ERRORS_ABORT基础架构。

  • 新增支持mpi_minimum_alignment信息键。

  • 新增对 MPI_COMM_TYPE_HW_GUIDEDMPI_COMM_TYPE_HW_UNGUIDED 的支持。

  • 新增了对MPI_Info_create_env()的支持。

  • MPI_COMM_SELF添加了对"未绑定"错误的错误处理。

  • 新增了MPI_F_STATUS_SIZEMPI_F_SOURCEMPI_F_TAGMPI_F_ERROR

  • 使MPI_Comm_get_info()MPI_File_get_info()MPI_Win_get_info()符合MPI-4.0标准。

  • Open MPI无法识别的信息键将在通信器、文件和窗口上被静默忽略并丢弃。

  • 已弃用 MPI_Sizeof()

  • 已弃用在发送请求上使用 MPI_Cancel()

  • 已弃用 MPI_Info_get()MPI_Info_get_valuelen()

3.6.2. 已移除的MPI API

请注意,从Open MPI v4.0.0开始,默认情况下mpi.h中不再提供几个在MPI-3.0规范中删除的遗留MPI-1符号的原型。具体来说,几个MPI-1符号在1996年发布的MPI-2.0规范中已被弃用。这些被弃用的符号最终在2012年的MPI-3.0规范中被移除。

在Open MPI的mpi.h中默认不再显示的符号有:

  • MPI_Address (已被 MPI_Get_address 取代)

  • MPI_Errhandler_create (已被 MPI_Comm_create_errhandler 取代)

  • MPI_Errhandler_get (已被 MPI_Comm_get_errhandler 取代)

  • MPI_Errhandler_set (已被 MPI_Comm_set_errhandler 取代)

  • MPI_Type_extent (已被 MPI_Type_get_extent 取代)

  • MPI_Type_hindexed (已被 MPI_Type_create_hindexed 取代)

  • MPI_Type_hvector (已被 MPI_Type_create_hvector 取代)

  • MPI_Type_lb (已被 MPI_Type_get_extent 取代)

  • MPI_Type_struct (已被 MPI_Type_create_struct 取代)

  • MPI_Type_ub (已被 MPI_Type_get_extent 取代)

  • MPI_LB (已被 MPI_Type_create_resized 取代)

  • MPI_UB (已被 MPI_Type_create_resized 取代)

  • MPI_COMBINER_HINDEXED_INTEGER

  • MPI_COMBINER_HVECTOR_INTEGER

  • MPI_COMBINER_STRUCT_INTEGER

  • MPI_Handler_function (已被 MPI_Comm_errhandler_function 取代)

尽管这些符号不再在mpi.h中进行原型声明,但它们仍然存在于Open MPI v5.0.x的MPI库中。这使得传统的MPI应用程序能够成功链接并在Open MPI v5.0.x上运行,尽管它们将无法编译通过。

警告

Open MPI v5.0.x系列之后的未来版本可能会完全移除这些符号。

警告

Open MPI团队强烈建议所有MPI应用程序开发者停止使用这些早在20多年前就被弃用的结构,它们最终在MPI-3.0版本(2012年)中从MPI规范里移除了。

重要

“已移除的MPI构造”部分提供了示例,展示如何将使用这些已删除符号的遗留MPI应用程序更新为使用"新"符号。

综上所述,如果您无法立即更新应用程序以停止使用这些遗留的MPI-1符号,可以通过在配置Open MPI时添加--enable-mpi1-compatibility标志来在mpi.h中重新启用它们。

3.6.3. 其他MPI特性

  • 支持使用TreeMatch库进行排名重排序。该功能针对图和dist_graph通信器拓扑结构启用。

  • 当使用MPI已弃用的函数时,某些编译器会发出警告。例如:

    shell$ cat deprecated_example.c
    #include 
    void foo(void) {
        MPI_Datatype type;
        MPI_Type_struct(1, NULL, NULL, NULL, &type);
    }
    shell$ mpicc -c deprecated_example.c
    deprecated_example.c: In function 'foo':
    deprecated_example.c:4: warning: 'MPI_Type_struct' is deprecated (declared at /opt/openmpi/include/mpi.h:1522)
    shell$
    
  • MPI_THREAD_MULTIPLE 支持部分例外情况。

    以下PML支持MPI_THREAD_MULTIPLE:

    1. cm,当与以下MTLs一起使用时:

      1. ofi (Libfabric)

      2. portals4

    2. ob1,当与以下BTLs一起使用时:

      1. self

      2. sm

      3. smcuda

      4. tcp

      5. ugni

      6. usnic

    3. ucx

    目前,即使MPI已初始化为支持MPI_THREAD_MULTIPLE,MPI文件操作仍不具备线程安全性。

  • MPI_REAL16MPI_COMPLEX32 仅在满足以下条件的平台上支持:能够找到与Fortran类型 REAL*16 在大小和位表示上都匹配的可移植C数据类型。

  • "libompitrace"库已捆绑在Open MPI中并默认安装(可通过--disable-libompitrace标志禁用)。该库通过MPI分析接口提供对选定MPI函数调用的简单跟踪。通过(例如使用-lompitrace)将其链接到应用程序时,调用某些MPI函数会自动输出到stderr:

    shell$ cd examples/
    shell$ mpicc hello_c.c -o hello_c -lompitrace
    shell$ mpirun -n 1 hello_c
    MPI_INIT: argc 1
    Hello, world, I am 0 of 1
    MPI_BARRIER[0]: comm MPI_COMM_WORLD
    MPI_FINALIZE[0]
    shell$
    

    请注意,跟踪库的输出将发送到stderr,因此其输出顺序可能与应用程序的stdout略有不同。

    该库作为Open MPI提供的"概念验证"/便利工具。如果有需求,可以轻松扩展它以输出其他MPI函数的printf信息。我们非常欢迎在github.com上提交pull请求。