初始化重复非阻塞通信
MPI_SEND_INIT(buf,count,datatype,dest,tag,comm,request)
INbuf发送缓冲区起始地址(可选数据类型)
INcount发送数据个数(整型)
INdatatype 发送数据的数据类型(句柄)
INdest 目标进程标识(整型)
INtag消息标识(整型)
INcomm 通信域(句柄)
OUT request非阻塞通信对象(句柄)
int MPI_Send_init(void* buf, int count, MPI_Data type,int dest, int tag,
MPI_Comm comm, MPI_Request *request)
MPI_SEND_INIT(BUF,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,
IERROR)
<type> BUF (*)
INTEGER COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR

讲解:

如果一个通信会被重复执行,比如循环结构内的通信调用,MPI提供了特殊的实现方式,对这样的通信进行优化,以降低不必要的通信开销,它将通信参数和MPI的内部对象建立固定的联系,然后通过该对象完成重复通信的任务。这样的通信方式在MPI中都是非阻塞通信。


重复非阻塞通信需要如下步骤:
 1 通信的初始化,比如MPI_SEND_INIT 
 2 启动通信,MPI_START
 3 完成通信,MPI_WAIT
 4 释放查询对象,MPI_REQUEST_FREE  

注意重复通信时,通信的初始化操作并没有启动消息通信,消息真正开始通信是由MPI_START触发的,消息的完成操作并不释放相应的非阻塞通信对象,只是将其状态置为非活动状态,若下面进行重复通信,则再由MPI_START将该对象置为活动状态,并启动通信。当不需要再进行通信时,必须通过显式的语句MPI_REQUEST_FREE将非阻塞通信对象释放掉,这是重复通信和一般的非阻塞通信不同的地方。
MPI_SEND_INIT创建一个标准模式重复非阻塞发送对象,该对象和相应的发送操作的所有参数捆绑到一起。

MPI_BSEND_INIT(buf,count,datatype,dest,tag,comm,request)
INbuf发送缓冲区初始地址(可选数据类型)
INcount发送数据个数(整型)
INdatatype 发送数据的数据类型(句柄)
INdest 目标进程标识(整型)
IN  tag消息标识(整型)
INcomm 通信域(句柄)
OUT request非阻塞通信完成(句柄)
int MPI_Bsend_init(void* buf,int count,MPI_Datatype datatype,int dest, int tag,
MPI_Comm comm,MPI_Request *request)
MPI_BSEND_INIT(BUF,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR)
<type> BUF (*)
INTEGER,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR

讲解:
MPI_BSEND_INIT创建一个缓冲模式重复非阻塞发送对象,该对象和相应的发送操作的所有参数捆绑到一起。

MPI_SSEND_INIT(buf,count,datatype,dest,tag,comm,request)
INbuf发送缓冲区初始地址(可选数据类型)
INcount发送数据的个数(整型)
INdatatype 发送数据的数据类型(句柄)
INdest 目标进程标识(整型)
INtag消息标识(整型)
INcomm 通信域(句柄)
OUT request非阻塞通信对象(句柄)
int MPI_Ssend_init(void* buf,int count,MPI_Datatype datatype,int dest, int tag,
MPI_Comm comm,MPI_Request *request)
MPI_SSEND_INIT(BUF,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR) <type> BUF (*)
INTEGER COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR

讲解:

MPI_SSEND_INIT创建一个同步模式非阻塞重复发送对象,该对象和相应的发送操作的所有参数捆绑到一起。

MPI_RSEND_INIT(buf,count,datatype,dest,tag,comm,request)
INbuf发送缓冲区初始地址(可选数据类型)
INcount发送数据的个数(整型)
INdatatype 发送数据的数据类型(句柄)
INdest 目标进程标识(整型)
INtag消息标识(整型)
INcomm 通信域(句柄)
OUT request非阻塞通信对象(句柄)
int MPI_Rsend_init(void* buf,int count,MPI_Datatype datatype,int dest, int tag,
MPI_Comm comm,MPI_Request *request)
MPI_RSEND_INIT(BUF,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,
IERROR)
<type> BUF (*)
INTEGER COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR

讲解:
MPI_RSEND_INIT创建一个接收就绪模式非阻塞重复发送对象,该对象和相应的发送操作的所有参数捆绑到一起。

MPI_RECV_INIT(buf,count,datatype,source,tag,comm,request)
OUTbuf接收缓冲区初始地址(可选数据类型)
IN count接收数据的最大个数(整型)
IN datatype 接收数据的数据类型(句柄)
IN source 发送进程的标识或任意进程MPI_ANY_SOURCE(整型)
IN tag消息标识或任意标识MPI_ANY_TAG(整型)
IN comm 通信域(句柄)
OUTrequest非阻塞通信对象(句柄)
int MPI_Recv_init(void* buf,int count,MPI_Datatype datatype,int source, int tag,
MPI_Comm comm,MPI_Request *request)
MPI_RECV_INIT(BUF,COUNT,DATATYPE,SOURCE,TAG,COMM,REQUEST,
IERROR)
<type> BUF (*)
INTEGER COUNT,DATATYPE,SOURCE,TAG,COMM,REQUEST,IERROR

讲解:
MPI_RECV_INIT创建一个标准模式非阻塞重复接收对象,该对象和相应的接收操作的所有参数捆绑到一起。参数buf标为OUT是因为用户通过传递该参数给MPI_RECV_INIT给予接收缓冲区写权限。