6

我试图弄清楚实际的进程通信是如何在 MPI 通信器内部发生的。我有 8 个节点,每个节点有 12 个核心(运行 96 个实例)。每个进程都分配了唯一的等级,并且进程能够相互通信。那么进程如何获得唯一的排名并设法发送实际消息呢?根据一些幻灯片,有开放运行时环境 (ORTE),它“位于在该单元上启动进程的机器上。(例如,集群的前端)。负责在单元上启动进程。监控单元健康(节点、进程)。将单元状态报告给宇宙的其余部分。在单元之间路由通信。” 我还没有找到任何 MPI 实现的开发人员文档和/或架构论文。任何人都知道如何实现 MPI 进程之间的实际通信,即他们如何设法找到自己并获得分配的等级?是否有一个中央或多个中央 MPI 内部流程用于路由(例如,每个节点)?

谢谢,大卫

4

1 回答 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 使用sshrsh或者它可以使用不同资源管理系统(例如PBS/Torque、SLURM、Grid Engine、LSF...)提供的机制。一旦进程启动并且它们的 IP 地址和端口号被记录并在 Universe 中广播,这些进程就可以在其他(更快的)网络(例如 InfiniBand)上找到彼此,并在它们上建立通信路由。

路由消息通常不由 MPI 本身完成,而是留给底层通信网络。MPI 只负责构建消息,然后将它们传递到网络以传递到它们的目的地。对于驻留在同一节点上的进程之间的通信,通常使用共享内存。

如果您对技术细节感兴趣,我建议您阅读 Open MPI 的源代码。您可以在项目的WEB 站点上找到它。

于 2012-05-10T21:47:44.997 回答