【问题标题】:Communicate between separate MPI-Programs在单独的 MPI 程序之间进行通信
【发布时间】:2011-03-04 23:18:12
【问题描述】:

我有以下问题:

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

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

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

【问题讨论】:

  • 它是否有足够的 RAM 来使用共享内存来存储数据?它只有 10 GB;大型服务器的内存比现在更多。

标签: sockets mpi


【解决方案1】:

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

 mpirun -n 1 big_program : -n 20 little_program

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

【讨论】:

  • 我这样做了,效果很好(使用微软的 msmpi)。您可能希望使用 MPI_APPNUM 变量(在 msmpi 中作为 PMI_APPNUM 的环境变量可访问)来确定谁是谁:在上述情况下 big_program 的 MPI_APPNUM = 0 并且所有 little_programs 的 MPI_APPNUM = 1。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        相关资源
        最近更新 更多