2013-02-13 166 views
1

我有一个网络,进程向其邻居发送一个随机消息,同时接收来自其邻居的消息。 我可以使用套接字和线程来完成它。一个线程接收消息,另一个线程向随机选择的邻居发送消息。使用MPI_SEND和MPI_RECV可以实现吗?使用MPI同步发送和接收

+0

你的意思是发送和接收的非阻塞版本? – arunmoezhi 2013-02-13 17:25:34

+0

没关系。其实,我很难理解你的问题来回答它。 – nhahtdh 2013-02-13 17:29:50

+0

我试过使用它,但我需要把发送放在一个随机发送消息的循环中。在执行循环期间,排名应该会收到任何发送给它的消息 – arunmoezhi 2013-02-13 17:32:15

回答

1

您可以在多线程环境中使用MPI调用。检查MPI_Init_thread功能和本白皮书的手册:http://www.mcs.anl.gov/~thakur/papers/mpi-threads.pdf。请注意,MPI-1标准不要求实现是线程安全的,只有MPI-2(但您使用的实现最可能是MPI-2)。

+0

谢谢。多线程是唯一的选择,还是理论上可以使用非阻塞发送和接收来实现这一点? – arunmoezhi 2013-02-13 17:48:56

+0

如果不详细了解你的代码正在做什么,很难说,也许有可能以某种方式重新排列算法,然后使用非阻塞调用。另一方面,过去我遇到过非常类似的问题 - 我正在进行并行排序,并且需要同时发送和接收消息;我发现的唯一解决方案是使用两个线程和套接字(当时MPI-2尚不存在,所有可用的MPI-1实现都不是线程安全的)。 – miy 2013-02-13 18:10:47

0

你对“同时”的定义是什么?

在任何情况下,你可以在MPI_Sendrecv感兴趣:

发送 - 接收操作的语义是,如果主叫方分叉两个并发线程,一个执行送什么会获得,和一个执行接收,然后加入这两个线程。

+0

谢谢。假设我有3个等级,每个等级需要向其他等级发送2个消息。例如,Rank1向Rank1发送2条消息,向Rank1发送2条消息。总共每个等级发送4条消息。但每次发送之间的时间间隔是随机的。我不想在每个sendrecv之间放置一个同步块。 – arunmoezhi 2013-02-13 20:29:21