parallel-processing - MPI 内部 : Communication implementation between processes

标签 parallel-processing mpi openmpi

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

谢谢,
大卫

最佳答案

您正在谈论的机制严格依赖于实现。 MPI 是一个中级标准,它位于硬件和操作系统提供的通信机制之上。

ORTE 是 Open MPI 的一部分——当今流行的通用 MPI 实现之一。还有 MPICH 和 MPICH2 及其变体(例如 Intel MPI)。大多数 super 计算机供应商都提供自己的 MPI 实现(例如,IBM 为 Blue Gene/Q 提供了修改后的 MPICH2)。

Open MPI 的运作方式是它被划分为多个层,每一层的功能由大量动态加载的模块提供。有一种评分机制应该在特定条件下选择最佳模块。

所有 MPI 实现都提供了一种机制来执行所谓的 SPMD 启动。本质上,MPI 应用程序是一种特殊的 SPMD(单程序多数据)——运行单个可执行文件的多个副本,并采用消息传递作为通信和协调机制。 SPMD 启动器获取执行节点列表,远程启动进程并建立它们之间的关联和通信方案(在 Open MPI 中,这称为 MPI Universe)。它是创建全局 MPI 通信器 MPI_COMM_WORLD 并分配初始等级分配的一个,它可以提供诸如将进程绑定(bind)到 CPU 内核之类的选项(在 NUMA 系统上非常重要)。一旦进程启动,一些识别机制就可用(例如,等级和 IP 地址/TCP 端口之间的映射)可能会采用其他寻址方案。例如,Open MPI 使用 ssh 启动远程进程, rsh或者它可以使用不同资源管理系统提供的机制(例如 PBS/Torque、SLURM、Grid Engine、LSF...)。一旦进程启动并且它们的 IP 地址和端口号被记录并在 Universe 中广播,这些进程就可以在其他(更快的)网络上找到彼此,例如InfiniBand,并在其上建立通信路由。

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

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

关于parallel-processing - MPI 内部 : Communication implementation between processes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542284/

相关文章:

c - mpi 进程在信号 11 时退出

c - MPI 通信中出现奇怪的 double 值 - 内存问题?

c - OpenMPI - 不同进程上的相同排名

javascript - 如何使用并行子进程在大数组上执行 "work"?

mysql - 在 MySQL 中并发创建索引

scala - akka-http 查询不并行运行

c++ - std::vector 结构的 MPI BCast(广播)

c++ - 从基于线程的流水线转移到基于任务的并行? (C++)

c++ - Boost MPI 的 Autoconf 宏?

bash - 使用mpirun conda环境slurm出错