MPI内部:进程间通信实现

6
我正试图弄清楚MPI通信器内部的实际进程通信过程。我有8个节点,每个节点有12个核心(共96个实例运行)。每个进程都有唯一的等级分配,并且进程之间能够相互通信。那么进程如何获得唯一的等级并成功传递消息呢?根据一些幻灯片所述,存在开放运行时环境(ORTE),它“驻留在从该单元格上启动进程的机器上(例如集群前端)。负责在单元格上启动进程。监视单元格健康状况(节点、进程)。向其他 Universe 报告单元格状态。路由单元格之间的通信。”我没有找到任何MPI实现的开发者文档和/或架构论文。是否有中央或多个中央MPI内部进程用于路由(例如,每个节点)?

你可能会发现这个视频很有帮助。 - falconepl
1个回答

20
您所讨论的机制严格依赖于实现。MPI 是一个中间层标准,位于硬件和操作系统所提供的通信机制之上。
ORTE 是 Open MPI 的一部分 - 今天广泛使用的通用 MPI 实现之一。还有 MPICH 和 MPICH2 及其变体(例如 Intel MPI)。大多数超级计算机供应商都提供自己的 MPI 实现(例如,IBM 为 Blue Gene/Q 提供了修改后的 MPICH2)。
Open MPI 的工作方式是将其划分为多个层,并由众多动态加载的模块提供每个层的功能。有一个评分机制,可以在特定条件下选择最佳模块。
所有 MPI 实现都提供一种称为 SPMD 启动的机制。实质上,MPI 应用程序是一种特殊的 SPMD(单程序多数据) - 运行许多副本的单个可执行文件,并使用消息传递作为通信和协调机制。正是 SPMD 启动器获取执行节点列表,远程启动进程并建立它们之间的关联和通信方案(在 Open MPI 中称为 MPI Universe)。它创建全局 MPI 通信器 MPI_COMM_WORLD,并分配初始秩分配,并且可能提供选项,如将进程绑定到 CPU 核心(对 NUMA 系统非常重要)。进程一旦启动,就可以利用某些标识机制(例如秩和 IP 地址 / TCP 端口之间的映射)或者可能采用其他寻址方案。例如,Open MPI 使用 ssh、rsh 远程启动进程,或者可以使用不同资源管理系统提供的机制(例如 PBS/Torque、SLURM、Grid Engine、LSF...)。一旦进程运行并记录了它们的 IP 地址和端口号,并在 Universe 中广播它们,进程就可以在其他(更快速)的网络上找到彼此,并在其上建立通信路由,例如 InfiniBand。
通常情况下,消息路由不是由 MPI 本身完成,而是留给底层通信网络完成。MPI 只负责构造消息,然后将其传递给网络以便发送到目的地。对于驻留在同一节点上的进程之间的通信,通常使用共享内存。如果您对技术细节感兴趣,我建议您阅读Open MPI源代码。您可以在该项目的网站上找到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接