InfiniBand 连接模型

InfiniBand 连接模型

我无法弄清楚 InfiniBand 的“连接”模型是什么?

具体来说,我希望进行 RDMA 传输。最终目标是使用 Immediate 进行 RDMA 写入,但我从 RDMA 传输开始。

如果将其比作 IP 连接,则您启动一个连接,在该连接上发出命令,然后结束该连接。

如果将其比作 HTTP 查询/响应,则您执行一个自包含的请求,就是这样。

它们各自都有截然不同的 API,但我无法在 API 中找到它们的模式。

例如,当我构建 RDMA 传输所需的结构时,我会给它我的地址信息和远程内存的 vaddr/rkey……但我找不到在哪里给它目标主机接口的地址信息。

我见过的几乎每个示例都有一堆糟糕的 C 调用和复杂的结构(OO,各位?),而且,它们要么使用 IBConnectionManager,要么使用套接字传递其他信息,进一步模糊了 API 的基础。似乎没有人清楚地描述执行 RDMA-Write 或 RDMA-Write-With-Immediate 实际需要什么。

所以:我该怎么做呢?

答案1

Infiniband、Mellanox 和 Open Fabrics Enterprise Distribution(OFED)支持类似于 TCP/IP 和 UDP/IP 的连接模型。

有连接协议,例如 TCP/IP:

  • 可靠连接,RC
  • 不可靠连接,UC,已连接,但不能保证可靠

有一个类似UDP的无连接协议:

  • 不可靠数据报,UD

使用 UD 您可以执行许多类似 UDP 的操作,包括广播、多播以及将每个缓冲区写入不同的主机。

要执行远程直接内存访问 (RDMA) 写入,您需要使用其中一种连接协议。RDMA 写入与 TCP/IP 提供的写入不同,尽管许多人通过融合以太网上的 RDMA、RoCE(发音为 Rocky)、iWarp、Soft RoCE 和其他协议在以太网上运行 RDMA。RDMA 写入似乎直接写入远程计算机内存。

RDMA 可以高速写入远程主机、GPU、存储设备,每个连接 100 或 200 Gbits,并且可以组合连接。它们在接收端无需 CPU 操作即可完成此操作。

API(OFED 术语中的动词)非常繁琐。RDMA“Hello World”程序大约有 600 行代码。这种复杂性的部分原因是您正在建立安全性以直接写入另一台计算机上的 RAM,并且这种安全性和内存管理必须与操作系统一起处理。

各侧的总体草图如下:

  • 您创建一个保护域 (PD),并将资源置于其下。
  • 您为缓冲区、队列和资源创建内存区域 (MR)。
  • 您可以创建完成队列 CQ (发音为 Cookies),以便在发生某些事情时有选择地收到通知,例如“我已收到缓冲区”或“缓冲区已发送”或“RDMA 操作已完成”。
  • 您创建队列对 (QP)。在连接协议 (RC 或 UC) 中,这是您通向另一端的隧道。
  • 您通过初始化、准备接收和最终准备发送来转换 QP。
  • 您创建工作队列条目 (WQE)(发音为 Wookies),它指定要传输的缓冲区或放置非 RDMA 传输的接收数据的位置。
  • 现在您可以发送和接收数据。

在每个步骤中都有需要填写的上下文、结构和标志。

当我开始学习如何编写 Infiniband RDMA 代码时,我使用这个网站编写了我的第一个程序Infiniband:简介...

Dotan Barak 的精彩博客名为RDMAmojo。您会在 Linux 上的 Infiniband Verbs 的许多手册页中找到 Dotan 的名字。

已经有很多尝试来简化 Verbs API,包括 Infiniband Verbs、IBV 和 RDMA Verbs。到目前为止,还没有一个真正成功。

至于将目标主机接口的地址信息放在哪里,您必须以某种方式在两个端点之间交换信息。有 Infiniband Verbs 连接管理器 ibv_cm,似乎很少有人使用它。有 RDMA 连接管理器 RDMA_CM,它同样需要支持大量工作。最后,只需打开一个 TCP/IP 套接字,通常使用 IP over Infiniband,IPoIB,然后只需使用您的连接数据写入一条消息,并从另一端读取一条包含连接数据的消息。很多人都使用这个。

相关内容