5

我有以下问题:

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

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

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

4

4 回答 4

5

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

 mpirun -n 1 big_program : -n 20 little_program

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

于 2010-05-23T15:03:06.833 回答
1

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

于 2010-05-23T15:13:07.043 回答
1

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

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

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

于 2010-05-25T14:02:34.523 回答
0

混合套接字和 MPI 不是一个好主意。实现这一点的最简单方法是将进程 1 和进程 2 移至单个 MPI 应用程序中。

实现这一点的最佳方法是使用称为 MPMD 或 Multi-Program Multi-Data 的编程模型。顾名思义,您的 MPI 应用程序将有多个程序对多个数据进行操作。即使 Program 1 不是 MPI 应用程序,您也无需进行太多更改。只需调用 MPI_Init 并添加发送/接收数据的例程。您可以将其视为一种主从模型,其中 Prg1 是主节点,其余部分是从节点,从主节点获取数据块进行处理。

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

于 2011-03-04T15:18:12.100 回答