MPI 进程是如何启动的



当使用 mpirunmpiexec启动 MPI 作业时,我可以理解如何启动每个单独的进程。但是,在没有任何编译器魔法的情况下,这些包装器可执行文件如何将安排(MPI 通信器)传达给 MPI 进程?

我对细节感兴趣,或者对在哪里看的指针感兴趣。

有关各个进程如何建立 MPI 域的详细信息是特定于实现的。您应该查看特定库的源代码以了解其工作原理。不过,有两种几乎通用的方法:

  • 命令行参数:MPI 启动器可以将参数传递给生成的进程,指示如何以及在何处连接以建立宇宙。这就是为什么 MPI 必须通过在 C 中调用 argcargv 来初始化 MPI_Init() - 因此库可以访问命令行并提取所有用于它的参数;
  • 环境变量:MPI 启动器可以设置特定的环境变量,其内容可以指示连接的位置和方式。

例如,Open MPI 设置环境变量,并将一些宇宙状态写入同一节点上运行的所有进程已知的磁盘位置。您可以通过执行如下命令轻松查看其运行时组件 ORTE(OpenMPI 运行时环境)使用的特殊变量mpirun -np 1 printenv

$ mpiexec -np 1 printenv | grep OMPI
... <many more> ...
OMPI_MCA_orte_hnp_uri=1660944384.0;tcp://x.y.z.t:43276;tcp://p.q.r.f:43276
OMPI_MCA_orte_local_daemon_uri=1660944384.1;tcp://x.y.z.t:36541
... <many more> ...

(出于安全原因更改了 IP)

远程启动子进程并调用MPI_Init()MPI_Init_thread()后,ORTE 将启动并读取这些环境变量。然后它通过"home"mpirun/mpiexec进程连接回指定的网络地址,然后协调所有生成的进程以建立MPI宇宙。

其他 MPI 实现以类似的方式工作。

最新更新