MPI编程以实现从多个工人处收集的大型数据

MPI编程以实现从多个工人处收集的大型数据,mpi,distributed-computing,Mpi,Distributed Computing,现在,我有一个应用程序,它由一个主程序和多个工人组成。应用程序的要求非常简单:工人完成一些工作并将数据发送给master,master将这些数据分别存储到文件中。我可以简单地在工作端使用MPI_发送将数据发送到主服务器。但master不知道数据发送顺序。有些工人走得快,有些人走得慢。更具体地说,假设有5个工作者,那么数据发送序列可以是1,3,4,5,2或2,5,4,1,3。如果我只是在主端用MPI_Recv编写一个for循环,比如for(I=1到5)来获取数据,那么主节点和一些更快的工作节点必须

现在,我有一个应用程序,它由一个主程序和多个工人组成。应用程序的要求非常简单:工人完成一些工作并将数据发送给master,master将这些数据分别存储到文件中。我可以简单地在工作端使用MPI_发送将数据发送到主服务器。但master不知道数据发送顺序。有些工人走得快,有些人走得慢。更具体地说,假设有5个工作者,那么数据发送序列可以是1,3,4,5,2或2,5,4,1,3。如果我只是在主端用MPI_Recv编写一个for循环,比如for(I=1到5)来获取数据,那么主节点和一些更快的工作节点必须等待很长时间。我知道MPI_Gather可以实现这一点。但我不确定MPI_Gather是并行工作还是只是MPI_Recv的一些连续调用?另一个问题是我的数据非常大,需要将超过1GB的数据发送到master。如果我将数据划分为主干,可能会使其更加复杂。我认为MPI_Gather不起作用。我还试着考虑原始套接字编程,但我认为这不是一个好的实践。你能给我一些建议吗?

工人们能把文件写出来,而不是把数据发回给船长吗?当一个工人完成时,它可以向主人发送一条“我完成了”的消息。然后,主人可以将下一块工作发送给该工人。当没有剩余工作要交时,让主控台向工作人员发送“不再工作”消息,然后工作人员可以调用MPI Finalize。

如果我正确理解您的问题,您希望在主控台接收数据,但由于每个任务需要不同的时间来完成,您不希望按顺序在所有处理器上循环,以便进程5的接收(如果已完成)不会等待进程3的接收(仍在运行)


如果希望接收无序,可以使用
mpi\u recv
mpi\u ANY\u SOURCE
常量作为发送消息的处理器的秩。然后,您应该能够检查返回的状态,以确定哪个处理器发送了消息以发送更多工作。不要在所有处理器上循环,只需在工作循环中使用一条接收语句。

+1对于
MPI\u ANY\u SOURCE
,这是最简单的解决方案。或者,您可以在主端使用五个异步接收(
MPI\u Irecv
),偶尔轮询它们以查看它们是否完成,但实际上,请坚持使用
MPI\u ANY\u SOURCE
。您是对的-异步接收的另一个问题是它模糊了您的意图。你真正关心的是从某个地方收到一条消息,并且
mpi\u any\u source
强调了这一点。嗨,蒂姆,谢谢你的回答。几天来,我一直在努力使用MPI_Waitany。现在,我认为将MPI_Recv与MPI_ANY_源一起使用也非常简单。