2012-06-06 37 views
13

当使用mpirunmpiexec启动MPI作业时,我可以理解如何开始每个单独的进程。然而,没有任何编译器的魔力,这些包装器可执行文件如何将安排(MPI通信器)传递给MPI流程?MPI过程如何启动?

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

回答

23

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

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

例如,打开MPI会设置环境变量,并将某个Universe状态写入在同一节点上运行的所有进程都知道的磁盘位置。你可以很容易地看到特殊的变量,它的运行时组件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> ... 

(IPS改变出于安全原因)

一旦孩子进程远程启动并调用MPI_Init()MPI_Init_thread(),ORTE会启动并读取这些环境变量。然后通过“home”mpirun/mpiexec过程连接回指定的网络地址,该过程然后将所有衍生过程协调为建立MPI Universe。

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

+0

优秀的回复,谢谢!我认为环境变量是一种可能性,但无法找到确认。 –