组通信的通信功能
对于组通信,按通信的方向的不同,可以分为以下三种:一对多通信,多对一通信和多对多通信。
 
图12-1 一对多通信

 
图12-2 多对一通信

 
图12-3 多对多通信

对于一对多通信,其中一个进程向其它所有的进程发送消息,一般地,把这样的进程称为ROOT,在一对多的组通信中,调用的某些参数只对ROOT有意义,对其它的进程只是满足语法的要求。广播是最常见的一对多通信的例子。同样对于多对一通信,一个进程从其它所有的进程接收消息,这样的进程也称为ROOT,收集是最常见的多对一通信的例子。
对于多对多通信,其中每一个进程都向其它所有的进程发送消息,或者每个进程都从其它所有的进程接收消息,或者每个进程都同时向所有其它的进程发送和从其它所有的进程接收消息。
一个进程完成了它自身的组通信调用返回后,就可以释放数据缓冲区或使用缓冲区中的数据,但是一个进程组通信的完成并不表示其它所有进程的组通信都已完成,即组通信并不一定意味着同步的发生(当然同步组通信调用除外)。

组通信的计算功能

图12-4 MPI组通信的计算功能

组通信除了能够完成通信和同步的功能外,还可以进行计算,完成计算的功能。从效果上,可以认为,MPI组通信的计算功能是分三步实现的,首先是通信的功能,即消息根据要求发送到目的进程,目的进程也已经接收到了各自所需要的消息,然后是对消息的处理,即计算部分,MPI组通信有计算功能的调用都指定了计算操作,用给定的计算操作对接收到的数据进行处理;最后一步是将处理结果放入指定的接收缓冲区。

组通信的同步功能

MPI同步调用

同步是许多应用中必须提供的功能,组通信的还提供专门的调用以完成各个进程之间的同步,从而协调各个进程的进度和步伐。
如图所示,所有的进程并行执行,但是,不同的进程执行的进度是不同的,在本例中,进程0首先执行到同步调用,执行同步操作,但是,由于其它的进程还没有到达同步调用点,因此进程0只好等待;接下来是其它的进程(如进程N-1)陆续到达同步调用点,但是,只要有一个进程未到达同步调用点,则所有其它已到达同步调用点的进程都必须得等待;当最后到达同步调用点的进程--进程1到达同步调用点后,它也执行了同步调用操作,这时,由于所有的进程都执行了这一操作,因此,它们此时才可以从同步调用返回,继续并行执行下面的操作。
同步的作用是当进程完成同步调用后,可以保证所有的进程都已执行了同步点前面的操作。

MPI_BARRIER(comm)
IN comm 通信域(句柄)
int MPI_Barrier(MPI_Comm comm)
MPI_BARRIER(COMM, IERROR)
INTEGER COMM, IERROR

MPI_BARRIER阻塞所有的调用者直到所有的组成员都调用了它,各个进程中这个调用才可以返回。