【问题标题】:openmpi: how to receive and send data between the root thread and a random (the fastest) other thread?openmpi:如何在根线程和随机(最快)其他线程之间接收和发送数据?
【发布时间】:2016-06-05 13:16:58
【问题描述】:

我的基本问题是有多个线程在做某事,其中一些线程需要比其他线程更多的时间(20 倍甚至更多),它们需要的时间仅取决于起始值,但无法从起始值预测单独他们需要多少时间。为了减少更快线程的空闲时间,我想通过指定一个为其他线程分配工作负载的单个线程(根线程)来平衡工作负载(如果一个线程完成了他的工作,我希望它发送一个新的起始值并且要求一个新的)。

理想情况下,应该有一个 MPI 函数,它可以将一个值(下一个起始值)发送给首先抓取它的任何线程(因为我不感兴趣哪个线程计算了哪些起始值)。但是我找不到这样的功能,有吗?

然后我想我可以结合基本的 MPI_Recv 和 MPI_Send 函数,我的想法是让根等待 MPI_Recv 和其他调用 MPI_Send 的线程(目标:根)一旦完成就发送他们的 ID与他们的工作。 在根收到另一个线程的 ID 后,它调用 MPI_Send(目标是调用线程)向它们发送新的起始值。同时另一个线程已经调用了一个 MPI_Recv 来接收新的起始值。然后根线程循环回到 MPI_Recv 并等待下一个完成的线程。 但后来我注意到 MPI_Recv 也需要一个明确的源值!所以根不能只等待 MPI_Recv 而不知道接下来哪个线程将完成!

我能做什么,有没有办法让根线程与到达程序中指定点的第一个线程通信(一些 MPI 函数)?

谢谢。

【问题讨论】:

  • 为了清楚起见:我认为如果你写 thread 你实际上是指 rank。 MPI 使用进程 a.k.a. 来实现并行性,而不是线程。如果我理解正确,这也不应该被标记为多线程。
  • 是的,你是对的,谢谢你的澄清
  • 您想要的是著名的主从并行模式的实现。参考this answer。

标签: c multithreading mpi openmpi


【解决方案1】:

您可以使用MPI_ANY_SOURCE 作为根上的源来接收任意等级。要回复的排名可以通过status.MPI_SOURCE找到。

从技术上讲,您还可以使用MPI_Probe 来检查某个等级是否正在尝试向根发送某些内容,或者为每个工作人员发布一个MPI_Irecv,然后使用MPI_Waitany 等待,直到有人需要更多工作。

【讨论】:

  • 非常感谢,我认为 MPI_ANY_SOURCE 方法是我需要的。编辑:我也可以 MPI_Send 到 MPI_ANY_SOURCE 还是仅用于 MPI_Recv?
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多