在使用 mpirun
或 mpiexec
启动MPI作业时,我能理解如何启动每个单独的进程。但是,在没有编译器魔法的情况下,这些包装运行文件如何将排列(MPI通信器)传达给MPI进程呢?
我对细节感兴趣,或者想知道在哪里寻找相关信息。
在使用 mpirun
或 mpiexec
启动MPI作业时,我能理解如何启动每个单独的进程。但是,在没有编译器魔法的情况下,这些包装运行文件如何将排列(MPI通信器)传达给MPI进程呢?
我对细节感兴趣,或者想知道在哪里寻找相关信息。
关于各个进程如何建立MPI宇宙的细节是与具体实现相关的。为了理解其工作原理,您应该查看特定库的源代码。但是有两种几乎普遍存在的方法:
MPI_Init()
调用并提供argc
和argv
来进行初始化的原因-因此库可以访问命令行并提取所有用于它的参数;例如,Open MPI设置环境变量,并将一些宇宙状态写入已知由所有运行在同一节点上的进程共享的磁盘位置。您可以轻松地查看其运行时组件ORTE(OpenMPI Run-Time Environment)使用的特殊变量,方法是执行类似于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将会读取这些环境变量。然后,它会连接回指定的网络地址,并与“主”mpirun
/mpiexec
进程建立联系,该进程随后协调所有生成的进程以建立MPI宇宙。
其他MPI实现方式类似。