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_GUIDED和MPI_COMM_TYPE_HW_UNGUIDED的支持。新增了对MPI_Info_create_env()的支持。
为
MPI_COMM_SELF添加了对"未绑定"错误的错误处理。新增了
MPI_F_STATUS_SIZE、MPI_F_SOURCE、MPI_F_TAG和MPI_F_ERROR。使MPI_Comm_get_info()、 MPI_File_get_info()和 MPI_Win_get_info()符合MPI-4.0标准。
Open MPI无法识别的信息键将在通信器、文件和窗口上被静默忽略并丢弃。
已弃用 MPI_Sizeof()。
已弃用在发送请求上使用 MPI_Cancel()。
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_INTEGERMPI_COMBINER_HVECTOR_INTEGERMPI_COMBINER_STRUCT_INTEGERMPI_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:cm,当与以下MTLs一起使用时:ofi(Libfabric)portals4
ob1,当与以下BTLs一起使用时:selfsmsmcudatcpugniusnic
ucx
目前,即使MPI已初始化为支持
MPI_THREAD_MULTIPLE,MPI文件操作仍不具备线程安全性。MPI_REAL16和MPI_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请求。