2

我有一个使用 mpiexec 运行的程序 A。该程序通常并行运行,但在其中一种执行模式中,它可能会调用也启用了 MPI 的外部程序 B。当然,如果 B 作为串行调用,则 A 的每个实例最终都会调用 B 的一个实例。如果并行调用,A 的每个实例都将调用并行 B。

一种可能的解决方案是让 A 的主节点调用并行 B,让其他 A 的进程空闲,但当然我需要从 A 的用户命令行调用中继承 mpiexec 选项(包括任何怪癖,例如 PBS 交互)到内部 B 调用。据我所知,这不是微不足道的,也不能很好地处理不同的 MPI 实现(例如 MPICH 与 Open MPI)。

有没有人有这种问题的经验?

4

2 回答 2

0

如果不使用 MPI 2 及更高版本的动态进程管理,这是不可能的。您应该使用 MPI_COMM_SPAWN 或 MPI_COMM_SPAWN_MULTIPLE 之类的 MPI 调用来创建新的 MPI 进程。如果您使用 fork 和 exec 或类似函数来启动新的 mpiexec 命令,您的新进程将不会启用 MPI,并且对 MPI_Init 的任何调用都将失败。我在一个项目中有这样的经历。

于 2013-07-25T09:52:16.067 回答
-2

是否可能并不重要——这是一个糟糕的主意。如其他人所述,使用 MPI_Comm_spawn(_multiple)。

而且我相信至少有一些网络无法使用这种用法,因此它是不可移植的。

于 2014-09-15T23:18:49.440 回答