|
初始化重复非阻塞通信 MPI_SEND_INIT(buf,count,datatype,dest,tag,comm,request)
INbuf发送缓冲区起始地址(可选数据类型) INcount发送数据个数(整型) INdatatype
发送数据的数据类型(句柄) INdest 目标进程标识(整型) INtag消息标识(整型) INcomm
通信域(句柄) 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)
INbuf发送缓冲区初始地址(可选数据类型) INcount发送数据个数(整型) INdatatype
发送数据的数据类型(句柄) INdest 目标进程标识(整型) IN tag消息标识(整型) INcomm
通信域(句柄) 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)
INbuf发送缓冲区初始地址(可选数据类型) INcount发送数据的个数(整型) INdatatype
发送数据的数据类型(句柄) INdest 目标进程标识(整型) INtag消息标识(整型) INcomm
通信域(句柄) 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)
INbuf发送缓冲区初始地址(可选数据类型) INcount发送数据的个数(整型) INdatatype
发送数据的数据类型(句柄) INdest 目标进程标识(整型) INtag消息标识(整型) INcomm
通信域(句柄) 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)
OUTbuf接收缓冲区初始地址(可选数据类型) IN count接收数据的最大个数(整型) IN datatype
接收数据的数据类型(句柄) IN source 发送进程的标识或任意进程MPI_ANY_SOURCE(整型) IN tag消息标识或任意标识MPI_ANY_TAG(整型)
IN comm 通信域(句柄) OUTrequest非阻塞通信对象(句柄) 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给予接收缓冲区写权限。 | |