openmpi:如何在根线程和随机(最快)的其他线程之间接收和发送数据?
openmpi: how to receive and send data between the root thread and a random (the fastest) other thread?
我的基本问题是有多个线程做事情,其中一些需要比其他线程更多的时间(20 倍甚至更多),他们需要的时间仅取决于起始值,但无法从单单起始值他们需要多少时间。为了减少更快线程的空闲时间,我想通过指定一个线程(根线程)来平衡工作负载,该线程为其他线程分配工作负载(如果一个线程完成了他的工作,我希望它发送一个新的起始值,并且要求一个新的)。
理想情况下,应该有一个 MPI 函数,它可以将一个值(下一个起始值)发送给首先获取它的线程(因为我对哪个线程计算了哪些起始值不感兴趣)。但是我找不到这样的功能,有吗?
然后我想我可以结合基本的 MPI_Recv 和 MPI_Send 函数,我的想法是让根等待 MPI_Recv 而其他线程调用 MPI_Send(目的地:root)在他们完成工作后立即发送他们的 ID。
在根收到另一个线程的 ID 后,它调用 MPI_Send(目标是调用线程)向它们发送新的起始值。同时另一个线程调用了 MPI_Recv 来接收新的起始值。然后根线程循环回到 MPI_Recv 并等待下一个完成的线程。
但后来我注意到 MPI_Recv 也需要一个明确的源值!所以 root 不能只等待 MPI_Recv 而不知道下一个线程将完成!
我能做什么,有没有办法让根线程与第一个到达程序中指定点的线程通信(一些 MPI 函数)?
谢谢。
您可以通过使用 MPI_ANY_SOURCE
作为根上的源来从任意级别接收。可以通过status.MPI_SOURCE
.
找到要回复的排名
从技术上讲,您还可以使用 MPI_Probe
来检查某个级别是否正在尝试向根目录发送内容,或者 post 为每个工作人员发送 MPI_Irecv
并等待 MPI_Waitany
直到有人需要更多的工作。
我的基本问题是有多个线程做事情,其中一些需要比其他线程更多的时间(20 倍甚至更多),他们需要的时间仅取决于起始值,但无法从单单起始值他们需要多少时间。为了减少更快线程的空闲时间,我想通过指定一个线程(根线程)来平衡工作负载,该线程为其他线程分配工作负载(如果一个线程完成了他的工作,我希望它发送一个新的起始值,并且要求一个新的)。
理想情况下,应该有一个 MPI 函数,它可以将一个值(下一个起始值)发送给首先获取它的线程(因为我对哪个线程计算了哪些起始值不感兴趣)。但是我找不到这样的功能,有吗?
然后我想我可以结合基本的 MPI_Recv 和 MPI_Send 函数,我的想法是让根等待 MPI_Recv 而其他线程调用 MPI_Send(目的地:root)在他们完成工作后立即发送他们的 ID。 在根收到另一个线程的 ID 后,它调用 MPI_Send(目标是调用线程)向它们发送新的起始值。同时另一个线程调用了 MPI_Recv 来接收新的起始值。然后根线程循环回到 MPI_Recv 并等待下一个完成的线程。 但后来我注意到 MPI_Recv 也需要一个明确的源值!所以 root 不能只等待 MPI_Recv 而不知道下一个线程将完成!
我能做什么,有没有办法让根线程与第一个到达程序中指定点的线程通信(一些 MPI 函数)?
谢谢。
您可以通过使用 MPI_ANY_SOURCE
作为根上的源来从任意级别接收。可以通过status.MPI_SOURCE
.
从技术上讲,您还可以使用 MPI_Probe
来检查某个级别是否正在尝试向根目录发送内容,或者 post 为每个工作人员发送 MPI_Irecv
并等待 MPI_Waitany
直到有人需要更多的工作。