在单独的MPI程序之间进行通信

时间:2010-05-23 14:50:37

标签: sockets mpi

我有以下问题:

程序1有大量数据,比如10GB。有问题的数据包括大型整数和双数组。 程序2有1..n个MPI进程,使用这些数据的瓦片来计算结果。

如何将程序1中的数据发送到MPI进程?

使用文件I / O是不可能的。计算节点有足够的RAM。

4 个答案:

答案 0 :(得分:5)

根据您的MPI实现,应该可以在同一个MPI作业中运行多个不同的程序。例如,使用OpenMPI可以运行

 mpirun -n 1 big_program : -n 20 little_program

您应该能够使用MPI_COMM_WORLD访问这两个程序。然后,您可以使用通常的MPI函数将数据从大程序传递给小程序。

答案 1 :(得分:1)

一个答案可能是让两个程序驻留在不同的传播者中;单个可执行文件可以通过MPI-2的动态流程管理启动两组应用程序,“生产者”程序通过MPI_COMM_WORLD与“消费者”应用程序进行通信。随后,消费者应用程序的所有IPC都必须在排除生产者部分的子通信器内运行。但这意味着重写以避免直接调用MPI_COMM_WORLD。

答案 2 :(得分:1)

根据您的描述,“程序1”不是MPI应用程序,“程序2”是MPI应用程序。解决方案的最短路径可能是在两个程序之间打开一个套接字并以这种方式发送数据。这不要求将“程序1”修改为MPI程序。我将从“程序1”和“程序2:排名0”之间的套接字开始,其中秩0将数据分配给剩余的排名。

到目前为止,有几项建议涉及启动异构的可执行文件集作为一种可能的解决方案。不要求单个MPI作业中的所有等级都是相同的可执行文件。这要求两个可执行文件都是“MPI程序”(例如,至少包括MPI_Init和MPI_Finalize调用)。 “程序1”所需的修改级别以及无法在MPI环境之外运行它可能会使此选项缺乏吸引力。

除非您使用提供支持的商业实现,否则我建议您避免使用“动态过程”方法。在MPI的开源实现中,对connect / accept的支持往往不稳定。它可能“正常工作”,但如果不能获得技术帮助可能是一个开放式问题。

答案 3 :(得分:0)

混合插座并不是一个好主意。 MPI。实现这一目标的最简单方法是移动流程1和流程1。将2处理到单个MPI应用程序中。

实现此目的的最佳方法是使用名为--MPMD或多程序多数据的编程模型。顾名思义,您的MPI应用程序将有多个程序在多个数据上运行。即使程序1不是MPI应用程序,也不需要进行太多更改。只需致电MPI_Init&添加send / recv数据的例程。您可以将此视为一种主从模型,其中Prg1是主模型,其余是从主服务器获取数据的从属服务器。

另一种方法可以是通过使程序1与程序2相同来实现工作池,并且每个人都读取数据文件的一部分并开始工作。但是你排除了文件IO,所以我假设prog2-n在运行时无权访问该文件。 Master-Slave将最适合您的需求。