MPI中非集体式通信器创建的研究与实践
1. 引言
MPI(Message Passing Interface)通信器为点对点和集体操作提供了通信上下文,使程序员能够通过将通信隔离在不同的通信器中,有效区分应用程序模块之间的通信。这一功能推动了由独立开发的模块和库组成的大型应用程序的发展。此外,通信器还能形成MPI进程组,并在这些组内进行通信,特别是集体通信,这使得程序员可以在MPI应用程序中表达多级并行性,随着计算系统规模的增大,该能力愈发重要。
在MPI实现层面,通信器的关键要素是上下文ID(context id)。参与通信操作的所有进程使用上下文ID来识别通信器,通常为一个整数。上下文ID本质上是除用户提供的通信标签外的另一个标签,用于匹配通信操作。因此,为了正确匹配通信操作,需要在上下文ID上达成共识。
传统上,MPI支持集体式创建通信器,即父通信器中的所有进程都参与子通信器的创建。然而,随着对千万亿次及更高计算系统的追求,新的应用架构和编程模型用例不断涌现,凸显了在新进程组的上下文中构建MPI通信器的能力的重要性。例如,在某些应用中,一小部分进程动态协作完成工作组件时,可能希望在不与系统中其他进程同步的情况下创建通信器;当某个进程发生故障时,应能够在不涉及故障进程的情况下重新创建通信器。但目前的MPI通信器创建操作,如 MPI_Comm_dup
、 MPI_Comm_split
和 MPI_Comm_create
,并不具备这样的灵活性。
本文提出了一种新的通信器创建算法,该算法仅在将成为新通信器成员的进程组上集体构建通信器。此算法具有可移植性,仅使用当前MPI