1.9 其他特性
MPI为大规模并行软件开发和应用提供丰富的函数库。MPI提供一种创新的特性,即为每个MPI函数提供其他的执行方式,从而实现在原有MPI函数中执行特殊代码。若采用PMPI接口,MPI函数存在其他的执行方式,即MPI分析接口。例如,PMPI_Bcast函数是MPI_Bcast函数的另一种执行方式。PMPI提供的函数与MPI中的函数参数和功能一致,区别在于用户通过PMPI可定义自己的MPI函数,如图1-13程序示例所示。若采用图1-13中代码编译程序,当调用MPI_Bcast函数时,将执行用户自定义的MPI_Bcast函数,即统计和打印所有进程执行MPI_Bcast函数前的等待时间。
MPI支持MPI混合编程和线程级并行程序。用户需要明确指定MPI进程和线程间交互关系。MPI提供四种线程交互安全级别,如下所示:
MPI_THREAD_SINGLE:一个进程只能有一个线程。
MPI_THREAD_FUNNELED:一个进程可以拥有多个线程,但只有进行MPI初始化的线程可以调用MPI函数。
MPI_THREAD_SERIALIZED:一个进程可以拥有多个线程,但同时只有一个线程可以调用MPI函数。
MPI_THREAD_MULTIPLE:一个进程可以拥有多个线程,多个线程可以同时调用MPI函数。
用户必须调用MPI_Init_thread函数指定线程安全级别,MPI实现会返回支持的线程安全级别。用户需要负责管理线程安全级别,MPI提供函数的线程安全级别不一定支持高于MPI_THREAD_SINGLE级别,但MPI中标注线程安全的函数支持MPI_THREAD_MULTIPLE级别。用户在编写线程级并行程序时,不要超过MPI函数的线程安全级别,以免引起潜在的程序运行问题。
MPI提供动态创建进程和独立进程间通信功能,例如通过MPI_Comm_spawn或者MPI_Comm_spawn_multiple函数派生子进程,通过MPI_Comm_connect、MPI_Comm_accept或者MPI_Join函数实现独立进程间通信。
MPI提供邻居聚合通信函数,例如MPI_Neighbor_allgather和MPI_Neighbor_alltoall函数等,在笛卡尔拓扑或者图像虚拟处理拓扑中实现邻居进程间聚合通信。邻居聚合通信主要应用于需要邻近进程间通信的程序,以及上千个进程的大规模稀疏通信方式中。
MPI还提供能够揭示MPI内部特性的功能,可为MPI开发提供帮助,例如导出数据类型和利用MPI_Request获取任意非阻塞式操作状态等功能。MPI-3提供新的特性,如MPI_T接口,可访问MPI函数内部变量,从而控制MPI实现方式或者导出性能信息。