2016-09-12 30 views
0

因此,我正在编写一个程序以在进程之间反弹“虚拟球”。根过程,即具有等级0的任务初始化游戏,然后将其发送到由rand() % size确定的随机过程(利用由初始等级生成的随机数)。发送到MPI中的不同进程并从其接收

我试着这样做:

int rnk= rand() % size; MPI_Send(&ball,1, MPI_INT, rnk, MPI_COMM_WORLD);

该把球给下一个随机过程,但是一旦运行该代码是通过阻断MPI_SEND举起。我刚刚开始并行编程,因此我对此没有足够的把握。我如何发送到一个随机过程,然后他们进一步发送到任何随机过程?

欢迎任何指针,提示,书籍和教程。

+2

请提供您尝试过的[mcve]。 – Zulan

+1

查看http://stackoverflow.com/questions/4348900/mpi-recv-from-an-unknown-source – francis

+0

好吧,所以麻烦的是,由于竞争条件,其中一个MPI进程被挂起。我解决了这个问题,程序按预期运行。 –

回答

0

您可以使用MPI_RecvMPI_ANY_SOURCE作为源代码(请参见弗朗西斯评论)。

确保您首先在除首先需要发送的根以外的所有进程中调用MPI_Recv

1

如果root最初尝试发送给自己(这可能发生,因为rand()%size可能为零),这里有个问题。

  • 如果您发布接收第一根,然后它会阻止,因为它会永远不会发送调用(如@Gregor指出以上);但是,如果您先发送发送请求到根,那么不能保证它会继续进行接收呼叫,因为MPI_Send()是而不是保证是异步的(即它可以实现为同步发送这将永远等待匹配接收)。

您需要确保发件人永远不会发送给自己,或者使用非阻塞发送(或非阻塞接收)来避免潜在的死锁。