【问题标题】:Sending to and receiving from different processes in MPI在 MPI 中向不同进程发送和接收
【发布时间】:2017-01-20 09:49:37
【问题描述】:

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

我已经尝试过:

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

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

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

【问题讨论】:

标签: c mpi


【解决方案1】:

如果根最初尝试发送给自己,这里就会出现问题(这可能会发生,因为 rand()%size 可能为零)。

  • 如果您首先在根上发布接收,那么它将阻塞,因为它永远不会到达发送调用(如上面的@Gregor 所指出的);
  • 但是,如果您先在根目录上发布发送,则无法保证它会继续进行接收调用,因为 MPI_Send()保证是异步的(即它可能是实现为同步发送,它将永远等待匹配的接收)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2013-01-28
      • 2018-07-21
      • 2013-04-15
      • 2018-11-11
      • 2018-03-12
      • 2013-12-20
      • 2016-06-15
      • 2012-03-13
      相关资源
      最近更新 更多