2011-09-07 134 views
2

我想知道是否有可能同时接收来自一个发送者的消息,并以其他方式并发发送给一个接收者。如果是的话,它会如何表现?从一个发送者/接收者并发地接收/发送

为了更明确的问题,让我们想象一下,我们有4个线程,他们每一位都是从同一来源

MPI_Recv(buf, count, type, THE_SAME_SOURCE, tag, status) 

所有这些线程是同一MPI过程中监听消息,所以他们所拥有的相同的MPI等级。并从其他MPI进程或相同但来自不同线程的人员,调用MPI_Send。每个接收者是否收到相同的消息,或者只是其中的一个,或者引发了一些异常(发生错误)?

换句话说,如果4个线程(在相同的MPI进程中或不在相同的MPI进程中)发送消息给可能也在相同的MPI进程中的一个接收器。它是否收到所有的消息?

我对MPI没有太大的经验,对上述问题的回答可能对我有很大的帮助。

谢谢

回答

3

接收按它们注册的顺序进行处理。从来没有一个“同时”的情况,因为它们是同步的。

Description of Point-To-Point Communication Semantics

所以,在你的第一个情况下,这意味着一个发送到那时四个线程正在等待接收将被发送到第一线,以已登记领取,其他人将继续等待后续消息。

在你的第二种情况下,再次没有“在同一时间”。发送消息的第一个线程将是接收线程收到的线程。其他发送将不会有接收者注册。

+0

这是一个很好的答案。链接为+1。 –

+0

这与链接对多线程执行所说的内容是否相反?它指出:“[...]同样,如果两个逻辑并发的接收操作接收到两个连续发送的消息,则这两个消息可以按任意顺序匹配两个接收。”我读它的方式我们无法知道哪个线索的收到将“赢”。我错了吗?编辑:另外我的报价确实说,两个接收操作确实可以是逻辑并发的(即“同时”)。 – Quantumboredom

+1

@Quantumboredom:我可以看到这个链接如何表达可能会让人困惑。引用和周围的段落指出,当你有两个没有任何外部顺序点的线程时,那么你没有任何定义的发送和接收的顺序。有时你运行,一个会击败另一个,并且其他时间可能是另一种方式。我的观点是他们实际上是在幕后同步的,所以他们绝不会“同时”发生。换句话说,我的观点是总是会有第一个,行为是由这个顺序定义的。 – ex0du5