2

讲故事的时间!考虑以下场景:

  1. 使用 Hydra,MPICH 产生 2 个不同的进程(模拟器)。叫他们苹果和橙子!
  2. Apple 和 Orange 开始,他们加载一个动态链接库,并使用该库调用 MPI_Init 并进行所有 MPI 通信。(那个 DLM 是我做的)
  3. 稍后我们启动一个检查点
  4. Apple 将所需的所有内容保存到一个文件中,该文件在重新启动时加载
  5. 然而,Orange 会保存整个 Linux 进程状态并在重新启动时将其重新加载。
  6. 现在稍后,我们想从检查点加载模拟以使用不同的参数运行它。
  7. 我们用新参数再次调用 Hydra 来启动 Apple 和 Orange
  8. Apple 出现,加载它的东西,加载我的库,然后调用 MPI_Init (Allgood)
  9. 梨加载整个旧状态备份!很好,除了 MPI 状态变量也作为进程状态的一部分被加载,所以橙色的 MPI 认为它已经被初始化,但它不知道这个新网络,它的变量是用于旧 MPI 网络的从第一次模拟开始。

在此处输入图像描述

所以这是我现在的问题:

我如何告诉 Orange 再次调用 MPI_Init(或任何其他方式,因为我知道不允许重复调用 mpi_init),以便它可以了解新网络?

事实

  1. 我可以随心所欲地编辑我的图书馆。它们是 c++ 库。
  2. 我无法编辑 Apple 和 Orange 模拟器如何保存检查点或重新启动。它们是专有的模拟器,没有可用的源代码。
  3. 模拟运行数天,因此必须先运行通用部分,然后保存检查点作为其他模拟的起点。

我的研究:

  1. 我知道调用 MPI_Init 的重复调用不是一种选择
  2. 我查看了 MPICH 的源代码,它检查它是否已初始化,但我宁愿不修改 MPICH 并拥有自己的新版本!
  3. 我查看了邮件列表、堆栈溢出和谷歌,但在进程状态恢复时如何连接到新的 MPI 网络却没有运气。

潜在答案

当然,我可以让我的库启动一个新进程并在那里做所有事情,但是从模拟器到这个新进程的通信会有很大的性能开销。此外,正确地做是另一罐蠕虫,如果可以的话,我宁愿不打开。

所以......关于如何告诉这个恢复的 Orange 进程状态这是一个新的 MPI 网络并且您现在需要与这个网络交谈的任何想法?

提前致谢 :)

4

0 回答 0