Datenlord | Rust实现RDMA异步编程(二):async Rust 封装 UCX 通信库

发布时间:2022-08-19 11:49

UCX 是一个高性能网络通信库,它作为 MPI 所依赖的通信模块之一在高性能计算领域得到广泛的使用。UCX 使用 C 语言编写,为了在 Rust 项目中使用它,我们需要将它的 C 接口包装成 Rust 库。在这个过程中我们充分利用了 Rust 的杀手级特性—— async-await 协程来包装异步 IO 接口,从而极大降低了应用的编程复杂度。去年我们用 Rust 实现的高性能分布式文件系统 MadFS,底层就使用了我们自己包装过的 UCX 作为通信模块,它在大规模 RDMA 网络上展现出了良好的性能。UCX 官方在得知这一消息后也很开心地宣传了我们这个项目 : )
Datenlord | Rust实现RDMA异步编程(二):async Rust 封装 UCX 通信库_第1张图片

本文首先会介绍一下 UCX 通信库的功能和编程模型,然后介绍我们用 async Rust 封装 UCX 的过程,具体代码可以参考 GitHub 仓库:async-ucx。值得注意的是,这里介绍的 IO 模型和封装异步 IO 的方法是通用的,可以适用到其它 IO 库当中。

UCX 通信接口简介

UCX 的全称是 Unified Communication X。正如它名字所展示的,UCX 旨在提供一个统一的抽象通信接口,能够适配任何通信设备,并支持各种应用的需求。
下图是 UCX 官方提供的架构图:

Datenlord | Rust实现RDMA异步编程(二):async Rust 封装 UCX 通信库_第2张图片

可以看到,UCX 整体分为两层:上层的 UCP 接口和底层的 UCT 接口。

底层的 UCT 适配了各种通信设备:从单机的共享内存,到常用的 TCP Socket,以及数据中心常用的 RDMA 协议,甚至新兴的 GPU 上的通信,都有很好的支持。

上层的 UCP 则是在 UCT 不同设备的基础上,封装了更抽象的通信接口,以方便应用使用。具体来说有以下几类:

  • Active Message:最底层的接口,提供类似 RPC 的语义。每条 Active Message 会触发接收端进行一些操作。
  • RMA / Atomic:是对远程直接内存访问(RDMA)的抽象。通信双方可以直接读写远端的内存,但是需要有额外的内存注册过程。
  • Tag Matching:常用于高性能计算 MPI 程序中。每条消息都会附带一个 64 位整数作为 tag,接收方每次可以指定接收哪种 tag 的消息。
  • Stream:对字节流(TCP)的抽象。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号