Fal*_*lin 1 mpi openmpi mpi4py
我能够在ssh. 一切看起来都不错,但我发现我对真正发生的事情知之甚少。那么,节点如何在 OpenMPI 中通信?它在多个节点中,因此不能共享内存。它似乎也不是 TCP 或 UDP,因为我没有配置任何端口。谁能描述在 2 个节点的 2 个进程之间发送和接收消息时发生了什么?谢谢!
Open MPI 构建在称为模块化组件架构 (MCA) 的框架框架之上。有针对不同活动的框架,例如点对点通信、集体通信、并行 I/O、远程进程启动等。每个框架都被实现为一组组件,这些组件提供相同公共接口的不同实现。
每当第一次请求特定框架的服务时,例如,字节传输层 (BTL) 或匹配传输层 (MTL) 的服务,两者都在等级之间传输消息,MCA 枚举各种组件满足要求并尝试实例化它们。某些组件本身具有特定要求,例如,需要存在特定硬件,如果不满足这些要求,则无法实例化。对所有实例化成功的组件进行评分,并选择得分最高的组件来执行请求和其他类似请求。因此,Open MPI 能够适应不同的环境,在用户端只需很少的配置。
对于不同等级之间的通信,BTL 和 MTL 框架提供了多种实现,并且该集合在很大程度上取决于 Open MPI 版本及其构建方式。该ompi_info工具可用于查询库配置。这是我的一台机器的示例:
$ ompi_info | grep 'MCA [mb]tl'
MCA btl: openib (MCA v2.1.0, API v3.0.0, Component v2.1.1)
MCA btl: sm (MCA v2.1.0, API v3.0.0, Component v2.1.1)
MCA btl: tcp (MCA v2.1.0, API v3.0.0, Component v2.1.1)
MCA btl: vader (MCA v2.1.0, API v3.0.0, Component v2.1.1)
MCA btl: self (MCA v2.1.0, API v3.0.0, Component v2.1.1)
MCA mtl: psm (MCA v2.1.0, API v2.0.0, Component v2.1.1)
MCA mtl: ofi (MCA v2.1.0, API v2.0.0, Component v2.1.1)
Run Code Online (Sandbox Code Playgroud)
此处列出的不同组件是:
openib -- 使用 InfiniBand 动词通过 InfiniBand 网络进行通信,InfiniBand 网络是当今最广泛的集群高性能通信结构之一,以及其他支持 RDMA 的网络,如 iWARP 或 RoCEsm -- 使用共享内存在同一个节点上通信tcp -- 使用 TCP/IP 通过任何提供套接字接口的网络进行通信vader-- 类似sm,在同一个节点上提供共享内存通信self -- 提供高效的自我沟通psm -- 使用 PSM 库通过源自 PathScale 的 InfiniBand 变体的网络进行通信,例如 Intel Omni-Path (rip)ofi -- 使用 OpenFabrics 接口 (OFI) 而不是动词的替代 InfiniBand 传输第一次 rank A onhostA想要与 rank B on 交谈时hostB,Open MPI 将遍历模块列表。self仅提供自我沟通,将被排除在外。sm并且vader将被排除在外,因为它们仅在同一节点上提供通信。如果您的集群没有配备高性能网络,最有可能保留的候选者是tcp,因为实际上没有任何集群节点没有某种以太网连接。
该tcp组件会探测所有已启动的网络接口并记录其网络地址。它在所有端口上打开侦听 TCP 端口,并将此信息发布到中央存储库(通常由mpiexec用于启动 MPI 程序的进程管理)。当MPI_Send级别 A 中的调用请求服务tcp以便向级别 B 发送消息时,该组件会查找级别 B 发布的信息并选择属于其中任何网络的所有 IP 地址hostA。然后它尝试创建一个或多个 TCP 连接,成功后消息开始流动。
在大多数情况下,您不需要配置任何东西和tcpJust Works™ 组件。有时虽然它可能需要一些额外的配置。例如,默认 TCP 端口范围可能被防火墙阻止,您可能需要告诉它使用不同的端口范围。或者它可能会选择具有相同网络范围但不提供物理连接的网络接口——典型情况是各种管理程序或容器服务使用的虚拟接口。在这种情况下,您必须告诉tcp排除这些接口。
配置各种 MCA 组件是通过使用--mca param_name param_value命令行参数传入 MCA 参数来完成的mpiexec。您可以使用 查询给定 MCA 组件具有的列表或参数及其默认值ompi_info --param framework component。例如:
$ ompi_info --param btl tcp
MCA btl: tcp (MCA v2.1.0, API v3.0.0, Component v2.1.1)
MCA btl tcp: ---------------------------------------------------
MCA btl tcp: parameter "btl_tcp_if_include" (current value: "",
data source: default, level: 1 user/basic, type:
string)
Comma-delimited list of devices and/or CIDR
notation of networks to use for MPI communication
(e.g., "eth0,192.168.0.0/16"). Mutually exclusive
with btl_tcp_if_exclude.
MCA btl tcp: parameter "btl_tcp_if_exclude" (current value:
"127.0.0.1/8,sppp", data source: default, level: 1
user/basic, type: string)
Comma-delimited list of devices and/or CIDR
notation of networks to NOT use for MPI
communication -- all devices not matching these
specifications will be used (e.g.,
"eth0,192.168.0.0/16"). If set to a non-default
value, it is mutually exclusive with
btl_tcp_if_include.
MCA btl tcp: parameter "btl_tcp_progress_thread" (current value:
"0", data source: default, level: 1 user/basic,
type: int)
Run Code Online (Sandbox Code Playgroud)
参数有不同的级别,默认情况下ompi_info只显示级别 1 的参数(用户/基本参数)。这可以通过--level N参数更改以显示高达 level 的参数N。级别一直上升到 9 级,只有在非常高级的情况下才需要更高级别的级别,例如微调库或调试问题。例如,btl_tcp_port_min_v4和btl_tcp_port_range_v4串联使用以指定 TCP 连接的端口范围,它们是级别 2(用户/详细信息)的参数。