您正在谈论的机制严格依赖于实现。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 的源代码。您可以在项目的WEB 站点上找到它。