2010-05-23 24 views
4

我遇到以下问题:单独的MPI程序之间的通信

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

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

使用文件I/O是没有问题的。计算节点具有足够的RAM。

+0

它是否有足够的RAM来使用共享内存来存储数据?它只有10 GB;大型服务器比现在拥有更多的内存。 – 2010-05-23 15:05:55

回答

4

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

mpirun -n 1 big_program : -n 20 little_program 

,你应该能够访问使用MPI_COMM_WORLD两个程序。从那里你可以使用通常的MPI功能将数据从大型程序传递给小型程序。

+2

我这样做,它效果很好(使用微软的msmpi)。 您可能想要使用MPI_APPNUM变量(可在msmpi中作为PMI_APPNUM的环境变量访问)来确定谁是谁:在上述情况下,big_program将具有MPI_APPNUM = 0,并且所有little_programs都具有MPI_APPNUM = 1。 – 2010-05-24 18:36:28

1

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

1

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

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

我会建议您避免使用“动态过程”方法,除非您使用的是提供支持的商业实现。在MPI的开源实现中,对连接/接受的支持往往很少见。它可能“正常工作”,但如果不能成为一个开放式问题,那么获得技术帮助。

0

这是不是一个好主意,混合套接字& MPI。实现这一目标的最简单方法是将进程1进程2移动到单个MPI应用程序。

实现此目的的最佳方法是使用称为MPMD或多程序多数据的编程模型。顾名思义,您的MPI应用程序将拥有多个运行多个数据的程序。即使程序1不是MPI应用程序,也不需要做太多改动。只需调用MPI_Init &即可添加send/recv数据的例程。您可以将其视为一种主从模式,其中Prg1是主设备,其余是从设备从主设备获取要处理的数据片段。

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