📄 mpi324.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE> ICPSEP Content
</TITLE>
<META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (X11; I; SunOS 5.4 sun4m) [Netscape]">
</HEAD>
<BODY BGCOLOR="#F0F8FF">
<TABLE WIDTH="100%" >
<TR>
<TD align=left><FONT SIZE=+2>3.2.4 阻塞接收</FONT></TD>
<TD align=right><A HREF="mpi323.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi323.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A><A HREF="mpi325.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi325.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>
<P>
<HR WIDTH="100%"></P>
<P>下面给出阻塞接收的语法。</P>
<P>MPI_RECV(buf,count,datatype,source,tag,comm,status) </P>
<UL>
<P>OUT buf 接收缓存的起始地址(选择型) </P>
<P>IN count 接收缓存中元素的个数(整型)</P>
<P>IN datatype 每个接收缓存元素的数据类型(句柄)</P>
<P>IN source 发送操作的进程号(整型) </P>
<P>IN tag 消息的标识(整型)</P>
<P>IN comm 通信组(句柄)</P>
<P>OUT status 状态对象(状态)</P>
</UL>
<P>int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Status *status) </P>
<P>MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR)</P>
<UL>
<P><type>BUF(*) </P>
<P>INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE),
IERROR </P>
</UL>
<P>这个调用的阻塞语义在<A HREF="mpi34.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi34.htm">3.4节</A>描述。 </P>
<P>接收缓存由包含count个类型为datatype的连续元素空间组成, 起始地址为buf。被接收消息的长度必须小于或等于接收缓存的长度。如果数据不适合,没有截断,接收缓存发生溢出错误。
</P>
<P>如果一个短于接收缓存的消息到达,那么只有相应于这个消息的那些地址被修改。
</P>
<UL>
<P><I>给用户的建议</I>. 在<A HREF="mpi38.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi38.htm">3.8节</A>描述的MPI_PROBE函数能被用于接收不知长度的消息。(<I>给用户的建议结束</I>)。
</P>
<P><I>给实现者的建议</I>. 既使MPI没有为错误程序规定特别动作, 溢出情况的推鉴处理在status中返回,
有将要接收信息的source和tag。这个接收操作将返回一个错误代码。一个高质量实现也将保证接收缓存以外的存储空间不被重写。
</P>
<P>在一个消息短于接收缓存时,MPI严格限制, 不准对其他空间修改。一个更宽厚条件的语句允许某些优化,但这个不被允许。既使是个坏地址,实现必须准备完成接收缓存到接收存储器的拷贝。(<I>给实现者的建议结束</I>)。
</P>
</UL>
<P>一个接收操作对消息的选择是由消息的信封值管理的。如果消息的信封与接收操作所指定的值source,tag和comm相匹配,
那么这个接收操作能接收这个消息。接收者可以给source指定一个任意值 MPI_ANY_SOURCE
,和/或给tag一个任意值MPI_ANY_TAG, 表明任何source 和/或tag 是可接收的。不能给comm指定任意值。所以,
如果一个消息被寄给接收进程, 有匹配的通信组, 有匹配的 source ( 如果source
= MPI_ANY_SOURCE不成立), 有匹配的tag( 如果tag = MPI_ANY_TAG 不成立 ),那么这个消息能被这个接收操作接收。
</P>
<P>消息的 tag 是由接收操作的 tag 参数指定的。参数 source 如果不同于MPI_ANY_SOURCE,
那么被指定为同一通信组( 远程进程组, 组间通信组 )的进程组的一个进程号。所以source参数的有效值范围是0,...,n-1
U MPI_ANY_SOURCE,n是这个进程组中进程的个数。 </P>
<P>注意发送和接收操作间的不对称性:一个接收操作可以接收任何发送者的消息,另一方面,一个发送操作必须指明一个单独的接收者。这和“push”通信机制匹配,数据转换是受发送者影响(
而不是“pull”机制,数据转换是受接收者影响)。 </P>
<P>Source = destination 是允许的, 即, 一个进程可以给自己发送一个消息。(
但用上述描述的阻塞发送和接收操作是不安全的, 因为这可能导致死锁。看<A HREF="mpi35.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi35.htm">3.5节</A>
。) </P>
<UL>
<P><I>给实现者的建议</I>. 消息的上下文和其他通信组信息能被作为一个附加的标识域来实现。它不同于规则的消息标识,即这个域上任意匹配不允许,并且这个域值的设定是受通信组处理函数的控制。(<I>给实现者的建议结束</I>)。</P>
</UL>
<P>
<HR WIDTH="100%"></P>
<TABLE WIDTH="100%" >
<TR>
<TD align=left>Copyright: NPACT <BR>
</TD>
<TD align=right><A HREF="mpi323.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi323.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A><A HREF="mpi325.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi325.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -