【网络】Unified Communication X (UCX)|统一多通信后端

      最后更新:2022-06-10 14:43:00 手机定位技术交流文章

      UCX 的意义

      随着DPU的扩散和各种DSA芯片的广泛使用,如何抽象统一存储访问语义和统一通信方法的确是一个非常有趣的和有价值的课题。

      UCX通信接口

      UCX的正式名称是United Communication X。正如其名称所暗示的,UCX旨在提供一种统一的抽象通信接口,可以适应任何通信设备,并支持各种应用程序的需求。

      以下是正式的UCX架构:

      正如你可以看到,UCX分为两层:上层UCP接口和下层UCT接口。

      UCT的底部适应了广泛的通信设备:从单台计算机共享内存到通用的TCP接口,数据中心通用RDMA协议,甚至在新兴的GPU上通信,都得到了良好的支持。

      最高级的UCP基于不同的UCT设备,并包含更抽象的通信接口以方便应用。 具体而言,有以下类别:

      • 主动消息:最底端的接口,提供类似RPC的语义。
      • RMA/Atomic(英语:RMA/Atomic)是远程直接存储访问(RDMA)的抽象概念。通信的两个方面都可以直接读写远程存储,但需要额外的存储登记过程。
      • 标签匹配:在高性能计算MPI程序中常用。 每个消息将伴随64位整数作为标签,每次接收者可以指定接收的标签消息。
      • 流: 向TCP抽象.

      一般来说,最符合基本通信设备模型的接口具有最高性能,其他不匹配的接口将有一个软件转换过程。另一方面,同一 UCP 接口也可以使用不同的 UCT 方法发送不同大小的讯息。例如,RDMA网络中,由于存储器的注册成本低,那么,这个小消息,复制到预注册缓冲器的性能更高。这些战略是默认由UCX本身决定的,用户也可以通过设置环境变量来手动修改。

      在我们的系统中,使用UCP标签接口, 实现了轻型RPC.在RPC场景中,标签可以用于区分消息与不同的上下文:每个链接将最初生成一个标签作为请求的标识符。每个请求都会随机生成一个标签,作为响应标识符。此外,标签接口也支持IO向量,将有许多不一致的内存分段合并到发送的讯息中。该功能可以用于将用户提供的数据缓冲器与RPC请求结合起来,在某种程度上避免数据复制。

      UCX编程模型

      UCX采用基于非同步IO的编程模型,由UCP层定义了四个核心对象:

      • 上下文:管理所有通信设备的全球资源的上下文。
      • 工人: 任务管理和调度中心,以查询为基础执行任务。 一般来说,每个线程创建一个,映射到网络卡上的队列。
      • 收听器:与TCP收听器类似,它用于创建工人之间的连接。
      • 端点:表示已建立的连接。 上面提供了各种类型的通信接口。

      它们之间的关系如下图所示:

      建立连接

      UCX的双方必须首先建立连接,然后在获得一个端点后才能通信。 建立连接通常是通过听器进行的,并且过程类似于TCP:

      A/B通讯员首先确定各自的上下文和工人,其中一个创建一个听众听从连接请求在工人上,收听器地址被绑定到主机上的端口.用户需要以某种方式把这个地址传递给另一方B。B接收地址,并在工人上启动连接操作,此时,A将收到一个新的连接请求,它可以选择接受或拒绝。如接受,接受工人的请求,把它转换为末点。B收到A的答复后,连接操作完成,返回一个终点。双方可以通过这个端点进行通信。

      内存注册

      对于传统的通信接口,用户可以在端点上直接启动请求。但对于RMA(远程存储访问)操作,需要访问的党派首先在自己的上下文中注册记忆,同时指定访问权限,获取一个备忘录手柄。然后将这个本地手柄转换为其他节点可访问的 टोक符串,它被称为远程键(rkey)。最后, 尝试把 rkey 传递到远程.远程保持此rkey用于远程存储访问操作.

      非同步任务处理(重点)

      为了达到最高表现,整个UCX通信接口全同步。所谓的非同步意味着IO操作的执行不会阻碍当前线程,操作的启动和完成是两个单独的步骤。因此CPU可以同时启动许多IO请求,在实施这些方案的过程中,还可以做其他的事情。

      问题是: 程序如何知道一个异步任务是否完成?有两种共同做法:积极调查,被动通知。前者仍然需要占用CPU资源,因此, 一般 采用 通知 机制 。在C语言中,传统的编程语言,非同步完成的通知通常通过回调函数实现:每次启动非同步操作,用户需要通过函数指针作为参数.当任务完成时,后端运行时框架将调用此函数通知用户。UCX中的异步接收器接口定义如下:

      该接口的语义是:启动异步标签匹配接收操作,并立即返回。当你收到标签匹配的消息时,UCX后端将处理此消息,把它放在用户提供的缓冲区里,用户最后收到的回调,通知用户执行任务的结果。

      这里有一个重要的问题:上面提到的后端处理是什么时候实际执行的?答案是UCX不创建后端线程来执行它们自己,所有后续和调用异步任务都在worker.progress()函数中,这由用户在对工人的主动查询中完成。这个功能的含义是:“看看你用手做什么,有哪些是能做的?尽力去推动一下,做完的通知我。” 换句话说,工人由一个状态机器组成,用于处理所有任务.进化函数的作用是通过新的事件推动整个状态机器的进化。后面我们会看到,对异步的Rust世界作出回应,所有非同步IO任务构成最基本的未来,工人与运行时间,进度及其调制功能发挥了反应器的作用.

      回到传统的C语言,在这里,异步IO的最大困难是编程的复杂性:在同一线程上执行多个同时任务,你只能用回调函数来描述下一步该做什么。这使得原始的连续执行逻辑被分散到多个调制函数中。可维持本地变量的状态,这需要在多个模块函数之间传递额外的结构。随着异步操作的增加,维护代码的难度将迅速增加。下面的伪码说明如何通过非同步调制函数在UCX中实现最简单的回声服务:

      相反,如果UCX提供同步接口,那么同样的逻辑仅够几行:

      面对传统的非同步编程,它带来了“回归地狱”,主流编程语言已经被不断探索了几十年,终于殊途同归,控制非同步步骤的最终解决方案是非同步等待编码。其致命之处在于它允许开发者编写非同步逻辑风格。我们包装后,同样的逻辑可以在Rust的非同步编码中写成如下:

      (参考:Async Rust encapsulated UCX communications library https://zhuanlan.Zhihu.com/p/397199431 )

      mellonx文件统一通讯X(UCX): https://www.hpcadvisorycouncil.com/events/2019/APAC-AI-HPC/uploads/2018/07/UCX_Accelerate_HPC_Application.pdf

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/26994.html

          热门文章

          文章分类