发送到MPI中的不同进程并从中接收

时间:2016-09-12 21:30:27

标签: c mpi

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

我尝试过:

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

这会将球发送到下一个随机进程,但在运行时,阻塞的MPI_Send会阻止代码。我刚刚开始并行编程,所以我对此没有足够的把握。如何发送到随机过程,然后他们进一步将其发送到任何随机过程?

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

2 个答案:

答案 0 :(得分:1)

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

  • 如果您先在根上发布接收,那么它将会阻止,因为它永远不会进入发送呼叫(正如@Gregor上面指出的那样);
  • 但是,如果您首先在根上发送发送,则无法保证它将进入接收呼叫,因为MPI_Send()保证是异步的(即它可能是实现为同步发送,将永远等待匹配接收)。

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

答案 1 :(得分:0)

您可以MPI_Recv使用MPI_ANY_SOURCE作为来源(请参阅francis的评论)。

请确保首先在除根目录之外的所有进程中调用MPI_Recv