DOCA 文档 v2.10.0

DOCA RDMA

本指南概述了 DOCA RDMA API 的配置说明。

注意

此库目前仅在 Beta 级别受支持。

DOCA RDMA 允许直接访问远程计算机的内存,而不会中断其 CPU 或操作系统的处理。避免 CPU 中断减少了 I/O 操作的上下文切换,与传统的网络通信方法相比,降低了延迟并提高了带宽。

DOCA RDMA 库提供了一个 API 来执行各种 RDMA 操作。

本文档适用于希望通过利用 RDMA 操作来改进其应用程序的软件开发人员。

警告

鉴于协议性质的敏感性,RDMA 操作应通过生产部署中的安全通道执行。

此库遵循 DOCA Core Context 的架构,建议在继续之前阅读以下部分

基于 DOCA RDMA 的应用程序可以在主机或 NVIDIA® BlueField® 网络平台(DPU 或 SuperNIC)上运行。

DOCA RDMA 是 DOCA Core 定义的 DOCA 上下文。有关更多信息,请参阅NVIDIA DOCA Core Context

DOCA RDMA 由两个连接侧组成,它们之间传递数据。这包括如果授予的权限允许,一侧访问远程侧内存的选项。

两侧之间的连接可以基于 InfiniBand (IB) 或基于使用 RoCE 的以太网。

DOCA RDMA 利用 Core 架构来公开异步任务/事件,这些任务/事件被卸载到硬件。

使用 DOCA RDMA 在两侧之间执行的受支持操作有

  • 接收

  • 发送

  • 带立即数据发送

  • 写入

  • 带立即数据写入

  • 读取

  • 原子比较和交换

  • 原子获取和添加

  • 获取远程 DOCA 同步事件

  • 设置远程 DOCA 同步事件

  • 添加远程 DOCA 同步事件

对象

设备

RDMA 库需要 DOCA 设备才能运行。此设备用于利用对等方之间在 RDMA 中的连接、访问内存以及执行不同的操作。

注意

在 RDMA 实例被销毁之前,设备必须保持有效。


内存映射

执行任何在对等方之间传递数据的 DOCA RDMA 操作都需要在每一侧创建内存映射 (mmap)。

  • mmap 的权限必须包括相关的 RDMA 权限,根据所需的 RDMA 操作。如果权限不足,任务将失败。

    信息

    有关更多信息,请参阅“权限”部分。

  • 为了允许对等方执行 RDMA 操作,必须使用 doca_mmap_export_rdma() 导出 mmap,并将其传递给对等方(即,请求 RDMA 操作的一侧),在对等方创建远程 mmap 并用于访问内存。

缓冲区清单和缓冲区

执行任何在对等方之间传递数据的 DOCA RDMA 操作都需要使用缓冲区,因此也需要缓冲区清单。

每个操作都需要使用中的缓冲区的不同设置,这在“任务”部分中明确说明。

要开始使用该库,您需要首先完成DOCA Core Context Configuration Phase中描述的配置阶段

本节介绍如何配置和启动上下文,以允许执行任务和检索事件。

配置

可以配置上下文以匹配应用程序用例。

强制配置

这些配置是强制性的,必须由应用程序在尝试启动上下文之前设置

任务配置

必须至少配置一种任务/事件类型。请参阅任务和/或事件的配置。

权限

不同的任务需要为正在使用的 RDMA 和 mmap 设置不同的权限。

下表总结了每个 RDMA 操作所需的 RDMA 和 mmap 权限

DOCA RDMA 任务类型

最小权限

应导出 MMAP 吗?1

提交任务的一方

对等方

RDMA

MMAP

RDMA

MMAP

读取

获取远程同步事件

本地读写

RDMA 读取

本地读写 | RDMA 读取

写入

带立即数据写入

设置远程同步事件

本地读写

RDMA 写入

本地读写 | RDMA 写入

原子比较和交换

原子获取和添加

添加远程同步事件

本地读写

RDMA 原子

本地读写 | RDMA 原子

发送

带立即数据发送

本地读写

本地读写

接收

取决于接收的任务

本地读写

不相关

  1. 指对等方。仅提交任务的一方永远不需要导出 mmap。    

可选配置

如果未设置这些配置,则使用默认值。

用户可以使用 doca_rdma_set_<property>() 编辑 RDMA 实例的默认属性。用户还可以使用 doca_rdma_cap_get_<property>(struct doca_rdma *, …) 函数查询默认/设置的属性。

信息

可以批量提交的任务数量取决于属性 max_send_buf_list_lensend_queue_size

有关配置库上下文时查询有效属性值的信息,请参阅“库功能”部分。

注意

虽然可以使用 doca_rdma_set_transport_type() 选择“动态连接”(DC) 作为传输类型,但目前对此传输类型的支持仅处于 Alpha 级别。

设备支持

DOCA RDMA 需要设备才能运行。有关选择设备的信息,请参阅DOCA Core Device Discovery

由于设备功能将来可能会发生变化,因此建议使用 doca_rdma_cap_*(struct doca_devinfo *, …) 函数查询每个 doca_devinfo 的与 RDMA 操作相关的功能,并使用 doca_rdma_task_<task_type>_is_supported() 检查设备是否适合所需的 RDMA 任务类型。

支持 BlueField-2 及更高版本的设备

  • 在主机上,支持任何 doca_dev

  • 在 BlueField 平台上,应用程序必须向库提供 SF 作为 doca_dev。请参阅OpenvSwitch 加速 - DOCA 中的 OVSBlueField DPU 可扩展功能,了解如何创建 SF 并将它们连接到适当的端口。

    信息

    此规则的一个例外是在 DPA 数据路径上运行 RDMA,目前仅支持 PF。

缓冲区支持

DOCA RDMA 库使用不同的缓冲区类型,具体取决于任务和缓冲区的用途

  • 本地 mmap 缓冲区

  • 来自 RDMA 导出缓冲区的 Mmap

  • 来自 PCIe 导出缓冲区的 Mmap

    信息

    此类型的缓冲区可以与本地 mmap 缓冲区以等效的方式使用。

  • 链表缓冲区

有关特定于任务的信息,请参阅“任务”部分。

多重连接

可以在对等方之间建立多个并行连接,使 RDMA 实例能够同时连接到不同的对等方。提供唯一的连接对象是为了识别和使用每个已建立的连接。

可以使用 doca_rdma_set_max_num_connections() 配置 RDMA 实例支持的最大连接数。

要终止连接,必须将连接对象作为输入提供给doca_rdma_connection_disconnect().

注意

当上下文停止时,所有已建立的连接都会自动终止

注意

所有连接方法都允许多个连接。但是,提供连接对象的具体方式取决于连接方法。有关更多信息,请参阅“建立 RDMA 连接”部分


建立 RDMA 连接

为了建立对等方之间的通信并允许执行不同的 DOCA RDMA 任务,RDMA 实例必须连接。

注意

这应在调用 doca_ctx_start() 后执行。

信息

有关更多信息,请参阅“状态机”部分。

建立 RDMA 连接的方法有三种,以下小节将详细介绍。

导出和连接 RDMA

可以通过使用以下命令将每个 RDMA 实例导出到远程端的 blob 来完成 RDMA 实例的连接doca_rdma_export(),带外 (OOB) 将 blob 传输到另一侧,并将其作为输入提供给该侧的doca_rdma_connect()函数。

总而言之,配置流程应如下图所示

export-and-connect-rdma-version-1-modificationdate-1736528553287-api-v2.png

警告

导出的数据包含敏感信息。请确保通过安全通道传递此数据!

注意

doca_rdma_export()返回一个唯一的连接对象,用于标识此连接。此对象必须作为输入提供给doca_rdma_connect()(执行连接)或doca_rdma_connection_disconnect()(执行断开连接),以及通过此连接交换的所有任务分配。

信息

RDMA 实例可以使用doca_rdma_connection_disconnect().

注意

执行非对称断开连接过程。未启动断开连接过程的 RDMA 实例不会收到通知。


使用 RDMA CM 连接流程进行连接

RDMA CM(通信管理器)流程使用服务器/客户端方案,其中一个 RDMA 实例充当第二个 RDMA 实例(客户端)的服务器。两个 RDMA 实例的流程都是非阻塞的、事件驱动的,并由进度引擎 (PE) 管理。连接过程通过回调报告给两个实例,回调应使用doca_rdma_set_connection_state_callbacks().

设置。有四个状态回调

  • 连接请求回调 – 此函数由doca_pe_progress()在充当服务器的 RDMA 实例收到连接请求时调用

  • 连接建立回调 – 此函数由doca_pe_progress()在服务器/客户端 RDMA 实例之间成功建立连接时调用

  • 连接失败回调 – 此函数由doca_pe_progress()在服务器/客户端 RDMA 实例之间未能建立连接时调用

  • 连接断开回调 – 此函数由doca_pe_progress()在连接断开服务器/客户端 RDMA 实例时调用

典型的连接流程如下

  1. 在启动连接之前,充当服务器的 RDMA 实例(即 RDMA 服务器)必须开始主动侦听来自远程 RDMA 对等方的连接(使用 RDMA CM)到特定端口,方法是使用doca_rdma_start_listen_to_port()。RDMA 服务器可以使用doca_rdma_stop_listen_to_port().

  2. 停止侦听来自远程 RDMA 对等方(使用 RDMA CM)的连接。充当客户端的 RDMA CM 实例(即 RDMA 客户端)现在可以执行到 RDMA 服务器的 RDMA 连接。第一步,它必须使用doca_rdma_addr_create()创建地址对象。此函数的参数对应于执行连接所需的 RDMA 服务器详细信息。可以使用doca_rdma_addr_destroy()销毁此对象,并使用.

  3. doca_rdma_connection_get_addr()从连接中检索它。RDMA 客户端可以使用doca_rdma_connection_set_user_data().

  4. 设置连接用户数据以包含在每个连接中,并使用doca_rdma_connection_get_user_data()从连接中检索它。

  5. RDMA 客户端现在可以使用doca_rdma_connect_to_addr()执行到 RDMA 服务器的连接。根据网络拓扑和配置,可以使用 IPv4、IPv6 或 GID 建立连接。RDMA 服务器通过先前设置的连接请求回调函数接收带有连接请求的通知。RDMA 服务器可以决定使用.

    • doca_rdma_connection_accept()

    • 接受连接,或使用

  6. doca_rdma_connection_reject()doca_rdma_connection_disconnect()拒绝连接。

image-2024-4-30_9-12-42-version-1-modificationdate-1734272273113-api-v2.png

注意

如果 RDMA 服务器拒绝连接或无法成功建立连接,RDMA 服务器和 RDMA 客户端将通过连接失败回调函数收到通知。

注意

如果 RDMA 服务器接受连接并且可以成功建立连接,则 RDMA 服务器和 RDMA 客户端将通过连接建立回调函数收到通知。doca_rdma_connect_to_addr() , RDMA 服务器通过先前设置的连接请求回调函数接收带有连接请求的通知。RDMA 服务器可以决定使用在 RDMA 操作完成后,任何一方都可以使用doca_rdma_connection_disconnect()执行断开连接过程。未启动断开连接过程的 RDMA 实例通过断开连接回调函数接收通知。

注意

连接过程涉及解析 RDMA 服务器连接地址。此过程受 connection_request_timeout 属性的限制,可以使用 doca_rdma_set_connection_request_timeout() 设置,并使用 doca_rdma_get_connection_request_timeout() 检索。

注意

doca_rdma_connect_to_addr()RDMA 服务器“连接请求”回调和 RDMA 客户端“连接建立”回调函数提供一个连接对象,该对象对于连接是唯一的。此对象必须作为输入提供给


、和/或

以及通过此连接交换的所有任务分配。每个单独的连接都遵循相同的过程,以便每个连接都有一个唯一的连接对象。

如果在服务器/客户端 RDMA 实例之间未能建立连接,则连接对象仅在连接失败回调中有效,并在返回后立即隐式销毁。

  1. doca_rdma_connect_to_addr() 方法接受私有数据作为输入参数,该参数作为通信请求的一部分透明地传递到远程端。

  2. 使用桥接功能接受 CM 连接DOCA RDMA 为用户 RDMA CM 应用程序提供连接功能,该应用程序充当维护 CM 事件通道并自行执行侦听过程的服务器(即,不使用 DOCA RDMA 连接流程函数)。该功能必须按如下方式执行doca_rdma_connect_to_addr()服务器用户应用程序,使用 RDMA CM,必须创建 RDMA CM 事件通道,开始主动侦听来自远程 RDMA 对等方的连接,并监视创建的 CM 事件通道。这些功能是在不使用“使用 RDMA CM 连接流程进行连接”部分中解释的 DOCA RDMA 连接流程函数的情况下执行的。

  3. 一旦服务器用户应用程序收到来自充当客户端的远程 RDMA 对等方的连接请求(使用 RDMA CM),它就可以调用DOCA RDMA 为用户 RDMA CM 应用程序提供连接功能,该应用程序充当维护 CM 事件通道并自行执行侦听过程的服务器(即,不使用 DOCA RDMA 连接流程函数)。doca_rdma_bridge_accept()。此方法充当桥梁,用于接受来自自行执行侦听过程的应用程序的连接请求。先前解释的doca_rdma_connection_accept() 不能用于此连接步骤,因为用户应用程序需要提供 RDMA CM ID 才能接受连接。

image-2024-7-15_15-27-1-version-1-modificationdate-1734272274037-api-v2.png

注意

DOCA RDMA 为用户 RDMA CM 应用程序提供连接功能,该应用程序充当维护 CM 事件通道并自行执行侦听过程的服务器(即,不使用 DOCA RDMA 连接流程函数)。在服务器端调用。此方法充当桥梁,用于接受来自自行执行侦听过程的应用程序的连接请求。先前解释的doca_rdma_bridge_accept() 并确认客户端连接成功建立后,它应调用

注意

DOCA RDMA 为用户 RDMA CM 应用程序提供连接功能,该应用程序充当维护 CM 事件通道并自行执行侦听过程的服务器(即,不使用 DOCA RDMA 连接流程函数)。doca_rdma_bridge_established()

以完成服务器端的连接过程。只有在建立连接后,才能分配和提交 DOCA RDMA 任务。

doca_rdma_bridge_accept() 方法返回一个唯一的连接对象,用于标识连接。此对象必须作为输入提供给

doca_rdma_bridge_established() 以完成服务器端的连接过程,以及通过此连接交换的所有任务分配。每个单独的连接都需要相同的过程,以便每个连接都有一个唯一的连接对象。

注意

doca_rdma_bridge_accept() 方法接受私有数据作为输入参数,该参数作为通信请求的一部分透明地传递到远程端。

注意

本节介绍使用DOCA Core PE在 CPU 上执行。有关其他执行环境,请参阅“备选数据路径选项”部分。

接收任务

任务

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

描述

用于设置配置的 API

用于查询支持的 API

描述

启用任务

doca_rdma_task_receive_set_conf

doca_rdma_cap_task_receive_is_supported


任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

任务输入

DOCA Core Task中所述的通用输入。

  • 名称

  • 注释

  • 目标缓冲区

  • 指向本地内存地址的缓冲区。数据在任务成功完成后写入缓冲区。


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

当远程端请求的 DOCA RDMA 任务是“带立即数据写入”时,或者当远程端发送空消息(无论是否带有立即数据)时,目标缓冲区不是强制性的,可以为 NULL(这些任务将在后面的“任务”部分中介绍)

对于 DOCA RDMA 接收任务,每个缓冲区的长度都视为从数据段末尾到缓冲区末尾的长度,因为这是每个缓冲区中可以写入的可用内存。如果数据在任务成功完成后写入缓冲区,则数据长度会在每个缓冲区中增加。

任务输出

DOCA Core Task中所述的通用输出。

结果长度

任务接收的数据长度

仅在任务成功完成时有效

结果操作码

  • 任务输出

  • 对等方执行并由任务接收的操作的操作码

在任务完成后有效,与成功与否无关

结果立即数据

任务接收的立即数据


仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 任务使用的 RDMA 连接

  • 仅在任务成功完成回调时有效

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 数据长度增加接收到的数据长度

任务完成失败

  • 如果任务中途失败

  • 如果发生致命错误,则上下文停止,用户应释放任务

  • 如果发生非致命错误,则任务状态会更新。某些缓冲区可能会更新,而某些缓冲区可能会保持不变。任务限制操作不是原子的,因此应用程序必须适当处理同步

  • 目标缓冲区必须保持有效,直到任务完成

  • 消息总长度不得超过

发送任务

max_message_size

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

设备功能

缓冲区列表长度不得超过 DOCA RDMA 接收任务的 dst_buf_list_len 属性

用于查询支持的 API

设备功能

其他限制在DOCA Core Task中描述

应提交此任务以将消息传输到远程端,同时远程端正在等待消息并且事先已提交接收任务。

doca_rdma_task_send_set_conf

  1. doca_rdma_cap_task_send_is_supported

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

源缓冲区列表长度

doca_rdma_set_max_send_buf_list_len 2

  • 名称

  • doca_rdma_cap_get_max_send_buf_list_len此配置也会影响其他任务。    源缓冲区

  • 指向本地内存地址并保存要发送到远程对等方的数据的缓冲区

  • 给定的源缓冲区/缓冲区列表的总长度(在

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 源缓冲区不是强制性的,当希望发送空消息时可以为 NULL

  • 对于 DOCA RDMA 发送任务,每个缓冲区的长度都视为其数据长度

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 任务上要使用的 RDMA 连接

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 在任务成功完成后,源缓冲区中的数据将发送到远程端。

  • 如果发生非致命错误,则任务状态会更新。某些缓冲区可能会更新,而某些缓冲区可能会保持不变。任务限制操作不是原子的,因此应用程序必须适当处理同步

  • 这并不表示远程端已收到数据。

  • 消息总长度不得超过

带立即数据的发送任务

如果发生非致命错误,则任务状态会更新

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

操作不是原子的。因此,应用程序必须适当处理同步。

源缓冲区必须保持有效,直到任务完成

用于查询支持的 API

操作不是原子的。因此,应用程序必须适当处理同步。

其他限制在DOCA Core Task中描述

缓冲区列表长度不得超过 DOCA RDMA 实例的 max_send_buf_list_len 属性

doca_rdma_task_send_set_conf

  1. 应提交此任务以将带有立即数据(发送到远程端的 32 位值,带外)的消息传输到远程端,同时远程端正在等待消息并且事先已提交接收任务。

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

源缓冲区列表长度

doca_rdma_task_send_imm_set_conf

  • doca_rdma_cap_task_send_imm_is_supported

  • doca_rdma_cap_get_max_send_buf_list_len此配置也会影响其他任务。    doca_rdma_set_max_send_buf_list_len 3

  • 此配置也会影响其他任务。    

  • 给定的源缓冲区/缓冲区列表的总长度(在

缓冲区,指向本地内存地址并保存要发送到远程对等方的数据

支持链表缓冲区。

  • )不得超过远程端的预期消息大小,否则任务将失败。源缓冲区不是强制性的,当希望发送空消息时可以为 NULL(当希望保持连接活动状态时可能相关)

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 立即数据

  • 发送到远程端的 32 位值,带外

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 任务上要使用的 RDMA 连接

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 在任务成功完成后,源缓冲区中的数据将发送到远程端。

  • 如果发生非致命错误,则任务状态会更新。某些缓冲区可能会更新,而某些缓冲区可能会保持不变。任务限制操作不是原子的,因此应用程序必须适当处理同步

  • 这并不表示远程端已收到数据。

  • 消息总长度不得超过

读取任务

immediate_data

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

字段应为大端格式。仅当接收任务成功完成时,远程端才会收到此值。

源缓冲区中的数据将发送到远程端

用于查询支持的 API

字段应为大端格式。仅当接收任务成功完成时,远程端才会收到此值。

启用任务

这并不表示远程端已收到数据

doca_rdma_task_send_set_conf

  1. 应在希望从远程内存(即连接远程端的内存)读取数据时提交此任务。

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

源缓冲区列表长度

doca_rdma_task_read_set_conf

  • doca_rdma_cap_task_read_is_supported

  • doca_rdma_set_max_send_buf_list_len 4此配置也会影响其他任务。    此配置也会影响其他任务。    

  • 指向远程内存地址并保存要读取的数据

  • 不支持链表缓冲区

任务输入

源缓冲区(

  • 名称

  • src_buf)不是强制性的,当希望读取零字节时可以为 NULL(当希望保持连接活动状态时可能相关)

  • 数据仅从源缓冲区的数据段读取

在任务完成后有效,与成功与否无关

src_buf

源缓冲区的长度被视为其数据长度。从源缓冲区读取的数据长度取决于其数据长度,但不能超过给定目标缓冲区/缓冲区列表的总长度。也就是说,实际读取的长度取决于源和目标之间的最小长度。


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

当远程端请求的 DOCA RDMA 任务是“带立即数据写入”时,或者当远程端发送空消息(无论是否带有立即数据)时,目标缓冲区不是强制性的,可以为 NULL(这些任务将在后面的“任务”部分中介绍)

指向本地内存地址。数据在任务成功完成后写入缓冲区

任务输出


仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 每个目标缓冲区的长度都视为从数据段末尾到缓冲区末尾的长度,因为这是每个缓冲区中可以写入的可用内存

  • 如果源缓冲区已设置为 NULL,则可以为 NULL

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 在“建立 RDMA 连接”部分中描述的连接建立过程中提供的连接对象

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 任务读取的数据长度

  • 读取的数据附加在目标缓冲区中的数据段之后,就像在任务提交之前一样任务限制操作不是原子的,因此应用程序必须适当处理同步

  • 数据长度增加读取的数据长度

  • 消息总长度不得超过

写入任务

如果发生非致命错误,则任务状态会更新。某些目标缓冲区可能会更新,而某些缓冲区可能会保持不变。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

任务缓冲区必须保持有效,直到任务完成

给定的源缓冲区长度不得超过

用于查询支持的 API

任务缓冲区必须保持有效,直到任务完成

其他限制在DOCA Core Task中描述

doca_rdma_set_max_send_buf_list_len 5

doca_rdma_task_send_set_conf

  1. 此配置也会影响其他任务。     

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

源缓冲区列表长度

指向本地内存地址并保存要写入远程对等方的数据的缓冲区。

  • 名称

  • 源缓冲区应指向从中读取数据的本地内存地址。数据仅从源缓冲区的数据段读取。

  • doca_rdma_set_max_send_buf_list_len 4此配置也会影响其他任务。    )不是强制性的,当希望写入零字节时(当希望保持连接活动时可能相关)可以为 NULL

  • 缓冲区的长度被视为其数据长度

任务输入

指向远程内存地址。数据在任务成功完成后写入缓冲区。

  • doca_rdma_cap_task_read_is_supported

  • 目标缓冲区(dst_buf)应指向远程内存地址

  • 缓冲区的长度被视为其数据长度

  • 目标缓冲区的长度被视为从数据段末尾到缓冲区末尾的长度,因为这是可以写入的可用内存

  • 写入目标缓冲区的数据长度取决于给定源缓冲区/缓冲区列表的总长度

  • 如果源缓冲区设置为 NULL,则可以为 NULL

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 写入的数据附加在目标缓冲区中的数据段之后,就像在提交任务之前一样。

  • 数据长度会增加写入的数据长度

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 在“建立 RDMA 连接”部分中描述的连接建立过程中提供的连接对象

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 任务读取的数据长度

  • 给定源缓冲区/缓冲区列表的总长度不得超过任务限制操作不是原子的,因此应用程序必须适当处理同步

  • 源缓冲区列表长度不得超过 DOCA RDMA 实例的 max_send_buf_list_len 属性

  • 消息总长度不得超过

带立即数据的写入任务

如果发生非致命错误,则任务状态会更新。某些目标缓冲区可能会更新,而某些缓冲区可能会保持不变。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

doca_rdma_task_write_imm_set_conf

doca_rdma_cap_task_write_imm_is_supported

用于查询支持的 API

doca_rdma_task_write_imm_set_conf

其他限制在DOCA Core Task中描述

doca_rdma_set_max_send_buf_list_len 6

doca_rdma_task_send_set_conf

  1. 此配置也会影响其他任务。     

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

源缓冲区列表长度

指向本地内存地址并保存要写入远程对等方的数据的缓冲区

  • 名称

  • 源缓冲区应指向从中读取数据的本地内存地址。数据仅从源缓冲区的数据段读取。

  • doca_rdma_set_max_send_buf_list_len 4此配置也会影响其他任务。    )不是强制性的,当希望写入零字节时可以为 NULL

  • 缓冲区的长度被视为其数据长度

任务输入

指向远程内存地址。数据在任务成功完成后写入缓冲区。

  • doca_rdma_cap_task_read_is_supported

  • 目标缓冲区(dst_buf)应指向远程内存地址

  • 缓冲区的长度被视为其数据长度

  • 目标缓冲区的长度被视为从数据段末尾到缓冲区末尾的长度,因为这是可以写入的可用内存

  • 写入目标缓冲区的数据长度取决于给定源缓冲区/缓冲区列表的总长度

  • 如果源缓冲区设置为 NULL,则可以为 NULL

缓冲区,指向本地内存地址并保存要发送到远程对等方的数据

支持链表缓冲区。

  • 应为大端格式

  • 只有在接收任务成功完成后,远程端才会收到该值

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

仅当远程端期望立即值并且事先提交了接收任务时,带有立即任务的写入才会成功。

RDMA 连接

  • 写入的数据附加在目标缓冲区中的数据段之后,就像在提交任务之前一样

  • 数据长度会增加写入的数据长度。

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 如果发生非致命错误,则会更新任务状态。某些目标缓冲区可能会更新,而某些缓冲区可能保持不变。

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 任务缓冲区必须保持有效,直到任务完成

  • 给定源缓冲区/缓冲区列表的总长度不得超过任务限制操作不是原子的,因此应用程序必须适当处理同步

  • 源缓冲区列表长度不得超过 DOCA RDMA 实例的 max_send_buf_list_len 属性

  • 消息总长度不得超过

原子比较和交换任务

当希望在远程内存(即连接远程端的内存)上执行 8 字节原子读-修改-写操作时,应提交此任务,其中检索远程值并在其等于给定值时更新该值。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

doca_rdma_task_atomic_cmp_swp_set_conf

doca_rdma_cap_task_atomic_cmp_swp_is_supported

用于查询支持的 API

doca_rdma_task_atomic_cmp_swp_set_conf


任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

任务输入

指向远程内存地址的缓冲区

  • doca_rdma_cap_task_read_is_supported

  • 目标缓冲区的数据段必须从对齐到 8 字节的内存地址开始

  • 只有数据地址之后的第一个 8 字节被视为原子操作

比较数据

要与目标缓冲区中的值进行比较的 64 位值

交换数据

要与目标缓冲区中的值交换的 64 位值

  • 仅当比较的数据值等于目标缓冲区中的值时,才会交换目标缓冲区中的值。否则,目标缓冲区保持不变。

结果缓冲区

指向本地内存地址的缓冲区。目标缓冲区的原始值(在执行原子操作之前)在成功后写入缓冲区。

  • doca_rdma_cap_task_read_is_supported

  • 结果写入数据地址之后的第一个 8 字节

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 如果比较的值相等,则目标中的值将与任务的交换数据字段中的 64 位值交换(swap_data)

  • 如果比较的值不相等,则目标值中的值保持不变

  • 目标缓冲区的原始值(在执行原子操作之前)写入结果缓冲区

任务完成成功

任务成功完成后,会发生以下情况

  • 上下文已停止,用户应释放任务

任务完成失败

  • 任务缓冲区必须保持有效,直到任务完成

  • 消息总长度不得超过

原子获取和添加任务

当希望在远程内存(即连接远程端的内存)上执行 8 字节原子读-修改-写操作时,应提交此任务,其中检索远程值并按给定值增加该值。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

doca_rdma_task_atomic_fetch_add_set_conf

doca_rdma_cap_task_atomic_fetch_add_is_supported

用于查询支持的 API

doca_rdma_task_atomic_fetch_add_set_conf


任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

任务输入

指向远程内存地址的缓冲区

  • doca_rdma_cap_task_read_is_supported

  • 目标缓冲区的数据段必须从对齐到 8 字节的内存地址开始

  • 只有数据地址之后的第一个 8 字节被视为原子操作

添加数据

要添加到目标缓冲区中的值的 64 位值

结果缓冲区

指向本地内存地址的缓冲区。目标缓冲区的原始值(在执行原子操作之前)在成功后写入缓冲区。

  • doca_rdma_cap_task_read_is_supported

  • 结果写入数据地址之后的第一个 8 字节

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 目标中的值会增加任务的添加数据字段中的 64 位值

  • 目标缓冲区的原始值(在执行原子操作之前)写入结果缓冲区

任务完成成功

任务成功完成后,会发生以下情况

  • 上下文已停止,用户应释放任务

任务完成失败

  • 任务缓冲区必须保持有效,直到任务完成

  • 消息总长度不得超过

获取远程同步事件任务

当希望获取远程同步事件的值时,应提交此任务。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

doca_rdma_task_remote_net_sync_event_get_set_conf

doca_rdma_cap_task_remote_net_sync_event_get_is_supported

用于查询支持的 API

doca_rdma_task_remote_net_sync_event_get_set_conf

启用任务

doca_rdma_set_max_send_buf_list_len 7

doca_rdma_task_send_set_conf

  1. 此配置也会影响其他任务。     

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

同步事件

要获取其值的远程 DOCA 同步事件

任务输入

指向本地内存地址。同步事件值在任务成功完成后写入缓冲区。

  • 名称

  • 每个缓冲区的长度被视为从数据段末尾到缓冲区末尾的长度,因为这是每个缓冲区中可以写入的可用内存

在任务完成后有效,与成功与否无关

src_buf

源缓冲区的长度被视为其数据长度。从源缓冲区读取的数据长度取决于其数据长度,但不能超过给定目标缓冲区/缓冲区列表的总长度。也就是说,实际读取的长度取决于源和目标之间的最小长度。


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

当远程端请求的 DOCA RDMA 任务是“带立即数据写入”时,或者当远程端发送空消息(无论是否带有立即数据)时,目标缓冲区不是强制性的,可以为 NULL(这些任务将在后面的“任务”部分中介绍)

对于 DOCA RDMA 接收任务,每个缓冲区的长度都视为从数据段末尾到缓冲区末尾的长度,因为这是每个缓冲区中可以写入的可用内存。如果数据在任务成功完成后写入缓冲区,则数据长度会在每个缓冲区中增加。

任务输出


仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 远程同步事件值附加在目标缓冲区中的数据段之后,就像在提交任务之前一样

  • 数据长度会增加检索到的数据长度

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 如果发生非致命错误,则会更新任务状态。某些目标缓冲区可能会更新,而某些缓冲区可能保持不变。

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 目标缓冲区必须保持有效,直到任务完成

  • 数据长度增加读取的数据长度

  • 消息总长度不得超过

设置远程同步事件任务

当希望将远程同步事件设置为给定值时,应提交此任务。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

doca_rdma_task_remote_net_sync_event_notify_set_set_conf

doca_rdma_cap_task_remote_net_sync_event_notify_set_is_supported

用于查询支持的 API

doca_rdma_task_remote_net_sync_event_notify_set_set_conf

其他限制在DOCA Core Task中描述

doca_rdma_set_max_send_buf_list_len 8

doca_rdma_task_send_set_conf

  1. 此配置也会影响其他任务。     

任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

源缓冲区列表长度

指向应从中检索同步事件的本地内存地址

  • 名称

  • 数据仅从缓冲区数据段检索,最多 8 字节

  • 源缓冲区的长度被视为其数据长度。从源缓冲区检索的数据长度不会超过同步事件值长度(8 字节)。因此,实际检索的长度取决于源缓冲区和同步事件值长度之间的最小长度。

同步事件

要获取其值的远程 DOCA 同步事件

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 远程同步事件值设置为源缓冲区中的数据

任务完成成功

任务成功完成后,会发生以下情况

  • 接收到的数据被复制到尾部段,扩展了原始数据段

  • 如果发生非致命错误,则会更新任务状态,并且同步事件值未定义

任务完成失败

  • 在连接建立过程中提供的连接对象,如“建立 RDMA 连接”部分中所述

  • 在任务成功完成后,源缓冲区中的数据将发送到远程端。

  • 源缓冲区列表长度不得超过 DOCA RDMA 实例的 max_send_buf_list_len 属性

  • 消息总长度不得超过

添加远程同步事件任务

当希望以原子方式将远程同步事件增加给定值时,应提交此任务。

DOCA RDMA 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。请参阅DOCA Core Task

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

DOCA RDMA 任务中使用的所有缓冲区都必须保持有效,直到检索到任务结果。

应在远程端预期提交发送/带立即数据发送/带立即数据写入任务之前提交此任务。

任务配置

doca_rdma_task_remote_net_sync_event_notify_add_set_conf

doca_rdma_cap_task_remote_net_sync_event_notify_add_is_supported

用于查询支持的 API

doca_rdma_task_remote_net_sync_event_notify_add_set_conf


任务数量

目标缓冲区列表长度

doca_rdma_task_receive_set_dst_buf_list_len

大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

doca_rdma_cap_task_receive_get_max_dst_buf_list_len

同步事件

远程同步事件

添加数据

添加到同步事件值的 64 位值

结果缓冲区

指向本地内存地址的缓冲区。目标缓冲区的原始同步事件值(在执行原子操作之前)在成功后写入缓冲区。

  • doca_rdma_cap_task_read_is_supported

  • 结果写入数据地址之后的第一个 8 字节

在任务完成后有效,与成功与否无关

src_buf

)不得超过远程端的预期消息大小,否则任务将失败


支持链表缓冲区

给定的目标缓冲区/缓冲区列表(在 dst_buf 中给出)必须具有足够的总长度以容纳预期的消息大小,否则任务将失败

仅当收到立即值时有效(即,当结果操作码为 DOCA_RDMA_OPCODE_RECV_SEND_WITH_IMMDOCA_RDMA_OPCODE_RECV_WRITE_WITH_IMM 时)– 可以使用 doca_rdma_task_receive_get_result_opcode() 检索)

RDMA 连接

  • 远程同步事件的值会增加任务的添加数据字段中的 64 位值

  • 远程同步事件的原始值(在执行操作之前)写入结果缓冲区

任务完成成功

任务成功完成后,会发生以下情况

  • 上下文已停止,用户应释放任务

任务完成失败

  • 结果缓冲区必须保持有效,直到任务完成

  • 消息总长度不得超过

事件

根据 DOCA Core 架构,DOCA RDMA 公开了异步事件,以通知意外发生的更改。

DOCA RDMA 公开的唯一事件是 DOCA Core Event 中描述的常见事件。

DOCA RDMA 库遵循 DOCA Core Context State Machine 中描述的上下文状态机。

以下部分描述了如何在状态之间移动以及每个状态中允许的操作。

空闲

在此状态下,应用程序应执行以下操作之一

  • 销毁上下文

  • 启动上下文

允许的操作

  • 根据“配置”部分配置上下文

  • 启动上下文

可以按如下方式达到此状态

上一个状态

转换操作

不适用

创建上下文

运行中

在确保所有任务都已释放后调用 stop

停止中

调用 progress 直到所有任务都已完成并释放


启动中

无法达到此状态。

运行中

在此状态下,应用程序应执行以下操作

  1. 连接两个对等方上的 RDMA 实例。有关更多信息,请参阅“建立 RDMA 连接”部分。

  2. 执行 RDMA 实例断开连接过程。有关更多信息,请参阅“建立 RDMA 连接”部分。

  3. 在 RDMA 实例断开连接过程之后,执行两个对等方上的 RDMA 实例的新连接。有关更多信息,请参阅“建立 RDMA 连接”部分。

  4. 如果监听和 CM 通道监视由用户应用程序完成,则接受并指示已建立的 RDMA 连接。有关更多信息,请参阅“使用 RDMA CM 连接流程连接”部分。

  5. 分配和提交任务。

  6. 调用 progress 以完成任务和/或接收事件。

允许的操作

  • 在 2 个对等方之间执行连接

  • 分配先前配置的任务

  • 提交已分配的任务

  • 调用 stop

可以按如下方式达到此状态

上一个状态

转换操作

空闲

配置后调用 start


停止中

在此状态下,应用程序应执行以下操作

  1. 调用 progress 以完成所有正在进行中的任务(任务完成时失败)

  2. 释放任何已完成的任务

  3. 执行 RDMA 实例断开连接过程。有关更多信息,请参阅“建立 RDMA 连接”部分

允许的操作

  • 调用 progress

可以按如下方式达到此状态

上一个状态

转换操作

运行中

调用 progress 并且发生致命错误

运行中

在未释放所有任务的情况下调用 stop


DOCA RDMA 允许数据路径在 DPA 或 GPU 上运行。

DPA 数据路径

DOCA 提供 DOCA DPA 库,该库为将以通信为中心的用户代码卸载到 BlueField DPU 上的 DPA 处理器上运行提供了编程模型。有关 DOCA DPA 库 的更多信息。

用户可以选择通过以下方式配置应用程序使用的 DOCA RDMA 上下文,从而在 DPA 数据路径上运行 RDMA 操作

  1. 通过调用 doca_rdma_as_ctx() 获取 DOCA CTX。

  2. 通过调用 doca_ctx_set_datapath_on_dpa() 将上下文的数据路径设置为 DPA。有关更多信息,请参阅 DOCA Core Alternative Data Path

  3. 通过调用 doca_ctx_start() 完成上下文配置并启动上下文。有关更多信息,请参阅 DOCA Context

配置数据路径后,用户可以通过调用 doca_rdma_get_dpa_handle() 获取 DOCA RDMA 上下文的 DPA 句柄。

DOCA DPA 库可以使用 DPA 句柄进行数据路径操作。有关更多信息,请参阅 DOCA DPA Communication Model

GPU 数据路径

DOCA 提供 DOCA GPUNetIO 库,该库为将通信编排卸载到 GPU CUDA 内核提供了编程模型。有关 DOCA GPUNetIO 库的更多信息。

用户可以选择通过以下方式配置应用程序使用的 DOCA RDMA 上下文,从而在 GPU 数据路径上运行 RDMA 操作

  1. 通过调用 doca_rdma_as_ctx() 获取 DOCA CTX。

  2. 通过调用 doca_ctx_set_datapath_on_gpu() 将上下文的数据路径设置为 GPU。有关更多信息,请参阅 DOCA Core Alternative Data Path

  3. 通过调用 doca_ctx_start() 完成上下文配置并启动上下文。有关更多信息,请参阅 DOCA Context

配置数据路径后,用户可以通过调用 doca_rdma_get_gpu_handle() 获取 DOCA RDMA 上下文的 GPU 句柄。

GPU 句柄必须传递给 GPU CUDA 内核,以便 DOCA GPUNetIO CUDA 设备功能可以执行数据路径操作。有关更多信息,请参阅 DOCA GPUNetIO 设备功能。

这些示例说明了如何使用 DOCA RDMA API 执行 DOCA RDMA 操作。

信息

本节中描述的所有 DOCA 示例均受 BSD-3 软件许可协议约束。

运行示例

  1. 请参阅以下文档

  2. 要构建给定的示例

    复制
    已复制!
                

    cd /opt/mellanox/doca/samples/doca_rdma/<sample_name> meson /tmp/build ninja -C /tmp/build

    信息

    二进制文件 doca_<sample_name>/tmp/build/ 下创建。

  3. 示例用法

    • 常用参数

      参数

      大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

      -d, --device

      IB 设备名称(可选)。如果未提供,则分配一个随机 IB 设备。

      -ld, --local-descriptor-path

      本地描述符文件路径,其中包含要复制到远程程序的本地连接信息

      -re, --remote-descriptor-path

      远程描述符文件路径,其中包含要从远程程序复制的远程连接信息

      -m, --mmap-descriptor-path

      远程描述符文件路径,其中包含要从远程程序复制的远程 mmap 连接信息

      -g, --gid-index

      DOCA RDMA 的 GID 索引(可选)

      -tt, ---transport-type

      DOCA RDMA 的传输类型(RC 或 DC;可选);目前仅对单个带外 RDMA 连接有用

      -cm, --use-rdma-cm

      是否使用 RDMA CM 或 OOB 设置连接

      -lp, --listen-port

      服务器监听端口号

      -sa, --server-addr

      RDMA CM 服务器设备地址

      -sat, --server-addr-type

      RDMA CM 服务器设备地址类型:IPv4、IPv6 或 GID

    • 特定于示例的参数

      示例

      参数

      大多数 DOCA RDMA 操作都不是原子的,因此应用程序必须适当处理同步。此外,成功完成写入任务(无论是否带有立即数据)并不能保证数据已完全写入远程地址。

      RDMA 读取响应器

      -r, --read-string

      要读取的字符串(可选)。如果未提供,则定义为“Hi DOCA RDMA!”。

      RDMA 发送

      RDMA 立即发送

      RDMA 多连接发送

      -s, --send-string

      RDMA 写入请求器

      RDMA 立即写入请求器

      -w, --write-string

      RDMA 多连接发送

      RDMA 多连接接收

      -nc, --num-connections

      DOCA RDMA 的连接数(可选);在此示例中,最大连接数必须 ≤8

  4. 有关每个示例的更多信息,请使用 -h 选项

    复制
    已复制!
                

    /tmp/build/<sample_name> -h

示例

每个示例都演示了两个对等方之间的连接,在每个示例中使用不同的 RDMA 操作将数据从一个对等方传输到另一个对等方。有关可用 RDMA 操作的更多信息,请参阅“任务”部分。

每个示例都由两个可执行文件组成,每个可执行文件在一个对等方上运行。

只要选择的对等方之间存在连接,示例就可以在 DPU 或主机上运行。

注意

在运行示例之前,请确保通过设备名称和 GID 索引选择的设备设置正确,并且彼此之间具有连接。在每个示例中,用户都有责任在对等方之间复制描述符。

大多数示例都遵循以下主要基本步骤

  1. 分配资源

    1. 定位和打开设备。选择的设备是支持示例相关任务的设备。如果示例不需要任何任务,则可以选择任何设备。

    2. 创建本地 MMAP 并对其进行配置(包括设置 MMAP 内存范围和相关权限)

    3. 创建 DOCA PE

    4. 创建 RDMA 实例并对其进行配置(包括设置相关权限)

    5. 将 RDMA 上下文连接到 PE

  2. 特定于示例的配置

    1. 配置与示例相关的任务(如果有)。包括

      1. 设置每种任务类型的任务数。

      2. 为每种任务类型设置回调函数,逻辑如下

        1. 成功完成回调

          1. 验证从远程接收到的数据(如果有)是否有效。

          2. 打印传输的数据。

          3. 释放任务和特定于任务的资源(例如源/目标缓冲区)。

          4. 如果在步骤 a. 和 b. 中发生错误,请更新遇到的错误。

            注意

            如果上下文不处于空闲状态,则仅保存流程中的第一个错误。

          5. 减少剩余任务的数量,并在达到 0 时停止上下文。

        2. 失败完成回调

          1. 更新遇到的错误。

            注意

            如果上下文不处于空闲状态,则仅保存流程中的第一个错误。

          2. 释放任务和特定于任务的资源(例如源/目标缓冲区)。

          3. 减少剩余任务的数量,并在达到 0 时停止上下文。

    2. 设置状态更改回调函数,逻辑如下

      • 一旦上下文移动到“启动”状态(只能从“空闲”状态到达),则导出并连接 RDMA,并在某些示例中,导出本地 mmap 或同步事件。

        注意

        在此步骤中,用户负责在两个对等方之间复制描述符。

        注意

        描述符只能由对等方读取和使用,使用相关的 DOCA 函数(描述符包含编码数据)。

      • 一旦上下文移动到“运行”状态(只能在 RDMA 示例中从“启动”状态到达)

        • 在某些示例中,仅打印日志并等待对等方,或同步事件

        • 在其他示例中,准备并提交任务

          1. 如果需要,从从对等方传递的接收到的导出 mmap 描述符创建 mmap。

          2. 从缓冲区库存请求所需的缓冲区。

          3. 分配和启动所需的任务,并将剩余任务数的参数设置为任务的用户数据。

          4. 提交任务。

      • 一旦上下文移动到“停止”状态,则打印相关日志。

      • 一旦上下文移动到“空闲”状态

        1. 打印相关日志。

        2. 发送更新,指示可以停止主循环。

  3. 将程序的资源设置为要在回调中使用的上下文用户数据。

  4. 创建缓冲区库存并启动它。

  5. 启动上下文。

    信息

    启动上下文后,PE 调用状态更改回调函数,该 PE 执行相关步骤。

    信息

    在成功运行中,每个部分都按照第 2.b 节中呈现的顺序执行。

  6. 推进 PE,直到上下文返回到“空闲”状态,并且由于所有任务都已完成的运行或由于致命错误,可以停止主循环。

  7. 清理资源。

RDMA 读取

RDMA 读取请求器

此示例说明了如何使用 DOCA RDMA 从远程对等方(响应器)读取。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了读取任务。

  3. 在此示例中,数据从对等方读取,验证为有效,并在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 要从对等方读取,请从对等方的导出 mmap 创建远程 mmap。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_read_requester/rdma_read_requester_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_read_requester/rdma_read_requester_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_read_requester/meson.build

RDMA 读取响应器

此示例说明了如何为 DOCA RDMA 读取请求设置远程对等方。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 和 RDMA 实例的权限都允许 RDMA 读取。

  2. 没有为此示例配置任务,因此没有准备和提交任务,也没有任务完成回调。

  3. 本地 mmap 导出到远程内存,以允许对等方将其用于 RDMA 读取。

  4. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_read_responder/rdma_read_responder_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_read_responder/rdma_read_responder_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_read_responder/meson.build

RDMA 写入

RDMA 写入请求器

此示例说明了如何使用 DOCA RDMA 写入远程对等方(响应器)。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了写入任务。

  3. 在此示例中,数据写入对等方,并在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 要写入对等方,请从对等方的导出 mmap 创建远程 mmap。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_requester/rdma_write_requester_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_requester/rdma_write_requester_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_requester/meson.build

RDMA 写入响应器

此示例说明了如何为 DOCA RDMA 写入请求设置远程对等方。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 和 RDMA 实例的权限都允许 RDMA 写入。

  2. 没有为此示例配置任务,因此没有准备和提交任务,也没有任务完成回调。在此示例中,一旦上下文状态更改为“运行”,就会打印写入响应器内存的数据,使用状态更改回调。这仅在收到用户的输入(指示请求者已完成写入)后完成。

  3. 本地 mmap 导出到远程内存,以允许对等方将其用于 RDMA 写入。

  4. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_responder/rdma_write_responder_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_responder/rdma_write_responder_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_responder/meson.build

RDMA 立即写入

RDMA 立即写入请求器

此示例说明了如何使用 DOCA RDMA 以及带外发送的 32 位立即值写入远程对等方(响应器)。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了带有立即任务的写入。

  3. 在此示例中,数据写入对等方,并在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 要写入对等方,请从对等方的导出 mmap 创建远程 mmap。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_immediate_requester/rdma_write_immediate_requester_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_immediate_requester/rdma_write_immediate_requester_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_immediate_requester/meson.build

RDMA 立即写入响应器

此示例说明了如何在设置远程对等方以进行 DOCA RDMA 写入请求时,接收来自对等方 OOB 的 32 位立即值。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 和 RDMA 实例的权限都允许 RDMA 写入。

  2. 为此示例配置了接收任务以检索立即值。在带有立即任务的写入之前未能提交接收任务会导致致命失败。

  3. 在此示例中,成功的任务完成回调还包括

    1. 检查结果操作码,以验证接收任务是否在接收到带有立即请求的写入后完成。

    2. 验证写入响应器内存的数据是否有效,并将其与接收到的立即数据一起打印。

  4. 本地 mmap 导出到远程内存,以允许对等方将其用于 RDMA 写入。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_immediate_responder/rdma_write_immediate_responder_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_immediate_responder/rdma_write_immediate_responder_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_write_immediate_responder/meson.build

RDMA 发送和接收

RDMA 发送

此示例说明了如何使用 DOCA RDMA 向远程对等方发送消息。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了发送任务。

  3. 在此示例中,发送的数据在任务准备期间打印,而不是在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_send/rdma_send_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_send/rdma_send_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_send/meson.build

RDMA 接收

此示例说明了远程对等方如何接收对等方(发送方)发送的消息。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了接收任务以检索发送的数据。在发送任务之前未能提交接收任务会导致致命失败。

  3. 在此示例中,从对等方接收到的数据经过验证是有效的,并在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_receive/rdma_receive_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_receive/rdma_receive_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_receive/meson.build

带立即数据的 RDMA 发送和接收

RDMA 立即发送

此示例说明了如何使用 DOCA RDMA 以及带外发送的 32 位立即值向远程对等方发送消息。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了带有立即任务的发送。

  3. 在此示例中,发送的数据在任务准备期间打印,而不是在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_send_immediate/rdma_send_immediate_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_send_immediate/rdma_send_immediate_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_send_immediate/meson.build

RDMA 立即接收

此示例说明了远程对等方如何接收对等方(发送方)发送的消息,同时还接收来自对等方 OOB 的 32 位立即值。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了接收任务以检索发送的数据和立即值。在带有立即任务的发送之前未能提交接收任务会导致致命失败。

  3. 在此示例中,成功的任务完成回调还包括

    1. 检查结果操作码,以验证接收任务是否在接收到带有立即值的发送消息后完成。

    2. 验证从对等方接收到的数据是否有效,并将其与接收到的立即数据一起打印。

  4. 在此示例中,从对等方接收到的数据经过验证是有效的,并在成功的任务完成回调中打印。

  5. 本地 mmap 未导出,因为对等方不打算访问它。

  6. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_receive_immediate/rdma_receive_immediate_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_receive_immediate/rdma_receive_immediate_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_receive_immediate/meson.build

RDMA 远程同步事件

此示例说明了如何在本地同步事件和远程同步事件 DOCA RDMA 之间进行同步。

RDMA 远程同步事件请求器

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了“remote net sync event notify set”任务。

    • 对于此任务,成功的任务完成回调具有以下逻辑

      1. 打印信息日志,说明任务已成功完成,以及特定于任务的成功完成日志。

      2. 减少剩余任务的数量。一旦达到 0

        1. 释放任务和特定于任务的资源。

        2. 停止上下文。

    • 对于此任务,即使剩余任务数不为 0,失败的任务完成回调也会停止上下文(因为对等方之间的同步会失败)。

  3. 为此示例配置了“remote net sync event get”任务。

    • 对于此任务,成功的任务完成回调还包括

      1. 重新提交任务,直到检索到大于或等于预期值的值。

      2. 一旦检索到此类值,则提交“remote net sync event notify set”任务以发出示例完成信号,包括

        1. 相应地更新成功完成消息。

        2. 增加提交的任务数。

        3. 如果遇到错误,并且未提交“remote net sync event notify set”任务,则释放任务和任务资源。

    • 对于此任务,失败的任务完成回调还包括释放“remote net sync event notify set”任务和任务资源。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

  6. 要与对等方同步事件,请从对等方的导出同步事件创建同步事件远程网络。

  7. 一旦上下文从“启动”移动到“运行”,则在状态更改回调中准备并提交这两个任务。

  8. “remote net sync event get”任务的用户数据指向“remote net sync event notify set”任务。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_sync_event_requester/rdma_sync_event_requester_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_sync_event_requester/rdma_sync_event_requester_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_sync_event_requester/meson.build

RDMA 远程同步事件响应器

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 此示例包括创建本地同步事件并将其导出到远程内存,以允许对等方创建远程句柄。

  3. 没有为此示例配置任务,因此没有准备和提交任务,也没有任务完成回调。在此示例中,一旦上下文从“启动”移动到“运行”,就会使用状态更改回调执行以下步骤

    1. 等待远程端发出同步事件信号。

    2. 从本地端通知同步事件。

    3. 等待来自远程端的完成通知。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_sync_event_responder/rdma_sync_event_responder_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_sync_event_responder/rdma_sync_event_responder_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_sync_event_responder/meson.build

RDMA 多连接发送和接收

以下示例说明了如何执行多重连接,以演示对等方之间消息的交换。

请注意,使用 DOCA RDMA CM 流(请参阅“使用 RDMA CM 连接流连接”部分)

  1. 一个示例将充当服务器,而另一个示例将充当客户端

  2. 需要独立执行充当客户端的示例的多个实例,以模拟每个客户端对等方,从而达到所需的 RDMA 连接数量。

RDMA 多连接发送

此示例演示了如何建立多重连接,并演示了

  • 多个对等方(客户端)如何使用 DOCA RDMA CM 流向远程单个对等方(服务器)发送消息(请参阅“使用 RDMA CM 连接流连接”部分)。

  • 单个对等方(服务器)如何使用 DOCA RDMA CM 流向多个远程对等方(客户端)发送消息(请参阅“使用 RDMA CM 连接流连接”部分)。

  • 多个远程对等方如何使用 DOCA RDMA 导出和连接流向其连接的对等方发送消息(请参阅“导出和连接 RDMA”部分)。

注意

在 DOCA RDMA CM 流中,需要独立执行此示例的多个实例,以模拟每个客户端对等方,从而达到所需的 RDMA 连接数量。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 为此示例配置了发送任务。

  3. 在此示例中,发送的数据在任务准备期间打印,而不是在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

  6. 连接数选项可以设置为

    1. 当使用 DOCA RDMA CM 流时,单个对等方(服务器发送方)预期的远程对等方的数量(请参阅“使用 RDMA CM 连接流连接”部分)。

    2. 使用 DOCA RDMA 导出和连接流连接到其远程对等方的对等方数量(请参阅“导出和连接 RDMA”部分)。

注意

在 DOCA RDMA CM 流中,连接数不能用于模拟每个客户端对等方。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_multi_conn_send/rdma_multi_conn_send_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_multi_conn_send/rdma_multi_conn_send_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_multi_conn_send/meson.build

RDMA 多连接接收

此示例演示了如何执行多重连接,并演示了

  • 多个远程对等方(客户端)如何使用 DOCA RDMA CM 流接收由单个对等方(发送方服务器)发送的消息(请参阅“使用 RDMA CM 连接流连接”部分)。

  • 单个远程对等方(服务器)如何使用 DOCA RDMA CM 流从多个对等方(发送方客户端)接收消息(请参阅“使用 RDMA CM 连接流连接”部分)。

  • 多个远程对等方如何使用 DOCA RDMA 导出和连接流接收由其连接的对等方发送的消息(请参阅“导出和连接 RDMA”部分)。

注意

在 DOCA RDMA CM 流中,需要独立执行此示例的多个实例,以模拟每个客户端对等方,从而达到所需的 RDMA 连接数量。

示例逻辑如 通用示例步骤 中所示,请注意以下事项

  1. 此示例中本地 mmap 的权限设置为本地读取和写入。

  2. 此示例配置了一个接收任务,以检索发送的数据。

    注意

    在发送任务之前未能提交接收任务会导致致命错误。

  3. 在此示例中,从对等方接收到的数据经过验证是有效的,并在成功的任务完成回调中打印。

  4. 本地 mmap 未导出,因为对等方不打算访问它。

  5. 未创建远程 mmap,因为在此示例中不打算访问远程内存。

  6. 连接数可以设置为

    1. 当使用 DOCA RDMA CM 流时,单个远程对等方(服务器)预期的对等方数量(请参阅“使用 RDMA CM 连接流连接”部分)。

    2. 使用 DOCA RDMA 导出和连接流连接到其发送方对等方的远程对等方数量(请参阅“导出和连接 RDMA”部分)。

注意

在 DOCA RDMA CM 流中,连接数不能用于模拟每个客户端对等方。

参考

  • /opt/mellanox/doca/samples/doca_rdma/rdma_multi_conn_receive/rdma_multi_conn_receive_sample.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_multi_conn_receive/rdma_multi_conn_receive_main.c

  • /opt/mellanox/doca/samples/doca_rdma/rdma_multi_conn_receive/meson.build

© 版权所有 2025,NVIDIA。 上次更新时间:2025 年 2 月 12 日。