openmpi:如何在根线程和随机(最快)的其他线程之间接收和发送数据?

时间:2016-02-23 15:48:06

标签: c multithreading mpi openmpi

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

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用finish_response作为源的来源从任意等级接收。要回复的排名可以通过MPI_ANY_SOURCE找到。

从技术上讲,您也可以使用status.MPI_SOURCE检查某个排名是否尝试向根发送内容,或者为每个工作人员发布MPI_Probe并等待MPI_Irecv,直到有人需要更多工作