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

5
我有以下问题:
程序1有大量数据,比如10GB。所涉及的数据包括大整数和双精度数组。 程序2有1到n个MPI进程,它们使用这些数据块来计算结果。
如何将数据从程序1发送到MPI进程?
使用文件IO是不可行的,计算节点具有足够的RAM。

它是否有足够的RAM来使用共享内存来存储数据?只有10GB;现在大型服务器的内存比这还要多。 - Jonathan Leffler
4个回答

5

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

 mpirun -n 1 big_program : -n 20 little_program

您应该能够使用MPI_COMM_WORLD访问两个程序。从那里,您就可以使用通常的MPI函数将数据从大程序传递到小程序。


3
我这样做,使用微软的msmpi效果非常好。你可能想利用MPI_APPNUM变量(在msmpi中作为环境变量PMI_APPNUM可访问),以确定每个程序的身份:在上述情况下,big_program将具有MPI_APPNUM = 0,而所有little_programs都将具有MPI_APPNUM = 1。 - David Glaubman

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

1
根据您的描述,“程序1”不是MPI应用程序,“程序2”是MPI应用程序。最简单的解决方案可能是在两个程序之间打开套接字并通过该方式发送数据。这不需要修改“程序1”成为MPI程序。我建议从“程序1”和“程序2:Rank 0”之间的套接字开始,Rank 0将数据分发给其余的排名。
到目前为止,有几个建议涉及启动异构可执行文件作为一种可能的解决方案。单个MPI作业中的所有排名都必须是相同的可执行文件没有要求。这要求两个可执行文件都是“MPI程序”(例如包括至少MPI_Init和MPI_Finalize调用)。修改“程序1”的程度以及无法在MPI环境之外运行它可能会使此选项不太吸引人。
我建议您避免“动态进程”方法,除非您使用提供支持的商业实现。在MPI的开源实现中,connect / accept的支持往往不稳定。它可能“只是工作”,但如果不起作用,则获取技术帮助可能是一个无限期的问题。

0

混合使用套接字和MPI并不是一个好主意。最简单的方法是将进程1和进程2都移动到单个MPI应用程序中。

实现这一点的最佳方法是使用称为MPMD或Multi-Program Multi-Data的编程模型。正如名称所示,您的MPI应用程序将在多个数据上运行多个程序。即使程序1不是MPI应用程序,您也不需要进行太多更改。只需调用MPI_Init并添加用于发送/接收数据的例程即可。您可以将其视为一种类似于Master-Slave模型的模式,其中Prg1是主程序,其他程序是从程序,从主程序获取要处理的数据片段。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接