目录
MPI是消息传递接口的简称,顾名思义,通信是MPI并行程序中的关键所在。MPI共有四种通信模式:标准通信模式(standard mode)、缓存通信模式(buffered mode)、同步通信模式(synchronous mode)、就绪通信模式(ready mode)。前面章节介绍的程序都属于标准通信模式。这几种通信模式对应于不同的通信需求,MPI为用户提供功能相近的不同通信方式。
这四种通信模式主要是根据以下不同情况来区分的:
1、是否需要对发送的数据进行缓存?
2、是否只有当接收调用执行后才可以执行发送操作?
3、何时发送调用可以正确返回?
4、发送调用正确返回是否意味着发送已完成,即发送缓冲区是否可以被覆盖?
针对这些情况,MPI给出不同的通信模式。
通信模式 | 发送 | 接收 |
标准通信模式 | MPI_SEND | MPI_RECV |
缓存通信模式 | MPI_BSEND | |
同步通信模式 | MPI_SSEND | |
就绪通信模式 | MPI_RSEND |
对于非标准的通信模式,只有发送操作,而没有相应的接收操作。MPI对不同的通信模式,在调用的命名上加以区别,标准通信模式不加特殊字母,而其它三种通信模式提供三个附加的发送函数,用一个字母前缀表示通信模式:B用于缓存通信模式,S用于同步通信模式,R用于就绪通信模式。接下来对其一一进行介绍。
一、标准通信模式
对于标准通信模式,是否对发送的数据进行缓存是由MPI自身决定的,而不是由程序员控制的。如果MPI决定缓存将要发出的数据,发送操作不管接收操作是否执行,都可以进行,而且发送操作可以正确返回而不要求接收操作收到发送的数据。
由于缓存数据需要代价,会延长数据通信时间,而且缓冲区也不并是总可以得到的,这样MPI也可以不缓存将要发送的数据,这样只有当相应的接收调用被执行后,并且发送数据完全到达接收缓冲区后,发送操作才算完成。对于非阻塞通信,发送操作虽然没有完成,但是发送调用可以正确返回,程序可以继续执行其它操作。
二、缓存通信模式
如果需要直接对通信缓冲区进行控制,可采用缓存通信模式。在这种模式下,由用户直接对通信缓冲区进行申请、使用和释放,因此,缓存模式下对通信缓冲区的合理与正确使用是由程序员来保证的。
MPI_BSEND(buf, count, datatype, dest, tag, comm)
IN buf 发送缓冲区的起始地址(可选数据类型)
IN count 发送数据的个数(整型)
IN datatype 发送数据的数据类型(句柄)
IN dest 目标进程标识号(整型)
IN tag 消息标志(整型)
IN comm 通信域(句柄)
//c语言的说明
int MPI_Bsend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
//Fortran语言的说明
MPI_BSEND(BUF, COUNT, DATATYPE, DEST,