节点如何在OpenMPI中通信

问题描述

我能够在ssh下的多个节点中运行OpenMPI作业。一切看起来都不错,但是我发现我对真正发生的事情并不了解。那么,节点如何在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,Component v2.1.1)
                 MCA btl: tcp (MCA v2.1.0,Component v2.1.1)
                 MCA btl: vader (MCA v2.1.0,Component v2.1.1)
                 MCA btl: self (MCA v2.1.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,Component v2.1.1)

此处列出的不同组件是:

  • openib -使用InfiniBand动词在InfiniBand网络和当今其他支持RDMA的网络(例如iWARP或RoCE)上,这种网络是当今群集中最广泛的高性能通信结构之一。
  • sm-使用共享内存在同一节点上进行通信
  • tcp-使用TCP / IP通过任何提供套接字接口的网络进行通信
  • vader-与sm类似,在同一节点上提供共享内存通信
  • self-提供有效的自我沟通
  • psm-使用PSM库通过从PathScale的InfiniBand变体派生的网络进行通信,例如Intel Omni-Path(r.i.p。)
  • ofi-使用OpenFabrics接口(OFI)代替动词的替代InfiniBand传输

hostA上的等级A第一次要与hostB上的等级B通话,Open MPI将遍历模块列表。 self仅提供自我交流,将被排除在外。 smvader将被排除在外,因为它们仅在同一节点上提供通信。如果您的群集未配备高性能网络,则最可能保留的候选者是tcp,因为实际上没有群集节点没有某种以太网连接。

tcp组件将探测所有已启动的网络接口并记录其网络地址。它会在所有端口上打开侦听TCP端口,并将此信息发布在中央存储库中(通常由用于启动MPI程序的mpiexec进程进行管理)。当等级A中的MPI_Send呼叫请求tcp的服务以便将消息发送到等级B时,组件将查找等级B发布的信息,并选择位于以下任意一个中的所有IP地址hostA所属的网络。然后,它尝试创建一个或多个TCP连接,并在消息成功后开始流传。

在大多数情况下,您不需要配置任何内容,也不需要配置tcp组件Just Works™。尽管有时可能需要一些其他配置。例如,默认的TCP端口范围可能被防火墙阻止,您可能需要告诉它使用其他端口。或者,它可以选择具有相同网络范围但不提供物理连接的网络接口-典型情况是各种虚拟机管理程序或容器服务使用的虚拟接口。在这种情况下,您必须告诉tcp排除那些接口。

通过将MCA参数与--mca param_name param_value的{​​{1}}命令行参数一起传入,可以完成各种MCA组件的配置。您可以使用mpiexec查询给定MCA组件具有的列表或参数及其默认值。例如:

ompi_info --param framework component

参数具有不同的级别,默认情况下,$ ompi_info --param btl tcp MCA btl: tcp (MCA v2.1.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",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.,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",type: int) 仅显示级别1的参数(用户/基本参数)。可以使用ompi_info参数更改此参数,以显示最高级别--level N的参数。级别一直上升到9,只有在非常高级的情况下(例如,微调库或调试问题)才需要更高级别的级别。例如,Nbtl_tcp_port_min_v4一起用于指定TCP连接的端口范围,它们是级别2(用户/详细信息)的参数。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...