gpt4 book ai didi

java - MIP 中如何建立来回通信?

转载 作者:行者123 更新时间:2023-12-01 17:59:14 26 4
gpt4 key购买 nike

例如,我有一个根进程,它发送一些计算以由工作进程完成。但由于我的进程有限(4),我必须将工作负载分担给所有进程,因此我发送了多次。我发现的解决方法是这样的:


int me = MPI.COMM_WORLD.Rank();

if(me == 0) {
sendToWorkers(); //Sends more than once to workers.
}
else {
while(true) {//wait indefinitely, accept data received from root process and work on it.
MPI.COMM_WORLD.Recv(Buf, 0, Buf.length, MPI.INT, 0, 0);
doTask(Buf);
}
}

现在问题出现了,我想将已完成处理的数据发送回根进程,但我无法再执行一次while(true);。我确信一定有一种更优雅的方法来实现这一点。

编辑1:我想发送到根进程的原因是因为它更干净。但是,我也可以只从工作进程中打印计算出的解决方案,但由于交错,输出全部被破坏。将 print 方法声明为 synchronized 不起作用。

最佳答案

一个简单的解决方案是在任务分配结束时,master 必须发送一个“FINISH/STOP/END”(任何自定义消息来指示任务已结束)给所有 worker 的消息。收到完成消息的工作进程退出循环并将结果发送回主进程。 Master 可以启动一个包含总任务的循环并等待这些结果。

从您显示的示例来看,这是一个典型的主工作模型用例。这里,当您使用 MPI_Send() 向工作进程发送任务时,您的工作进程中会有一个相应的 MPI_Recv()。收到任务后,执行doTask(Buf)。然后你再次进入循环。因此,就您的情况而言,总而言之,只有在计算了之前收到的该排名任务后,您才会收到新任务,对吗?在这种情况下,主进程还可以等待任何已完成任务的回复,并可以基于此发送新任务。也许你可以考虑这种方法。如果您的 doTask 使用线程,那么这会变得复杂。然后每个工作节点必须跟踪其任务,所有任务完成后,主节点应启动一个循环并等待结果。

或者你可以使用多线程实现。您可以在 master 中使用单独的线程进行发送和接收。

关于java - MIP 中如何建立来回通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60664126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com