3.3 关键概念
3.3.1 发送请求 (Send Request, SR)
SR 定义发送多少数据、从哪里发送、怎样发送以及使用 RDMA 发送到哪里。
struct ibv_send_wr 被用于实现 SR 。
3.3.2 接收请求 (Receive Request, RR)
RR 定义要接收非 RDMA 操作数据的缓冲区。如果未定义缓冲区,并且发送者尝试发送操作或带立即数写入,
则会发送”接收未准备好 (Receive not Ready, RNR)” 错误。
struct ibv_recv_wr 用于实现 RR。
3.3.3 完成队列 (Completion Queue, CQ)
struct ibv_cq 用于实现 CQ 。3.3.4 内存注册 (Memory Registration)
struct ibv_mr 被用于实现内存注册。3.3.5 内存窗口 (Memory Window)
MW 允许应用程序对内存的远程访问进行更灵活的控制。内存窗口被用于以下场景中:
希望动态地对被注册区域授予和撤销远程访问权限,与注销/注册或重新注册相比,性能损失较小。
希望对不同的远程代理授予不同的权限,或在被注册区域内的不同范围授予这些权限。
将 MW 与 MR 关联的操作成为”绑定 (binding)”。不同的 MW 可以覆盖相同的 MR (即使访问权限 不同)。
3.3.6 地址向量 (Address Vector)
地址向量是描述从本地节点到远程节点的路由的对象。在每个 UC/RC QP 的上下文中都有一个
地址向量。在 UD QP 中,地址向量应该在每个发布的 SR 中定义。
struct ibv_ah 被用于实现地址向量。
3.3.7 全局路由头 (Global Routing Header, GRH)
struct ibv_grh 被用于实现 GRH。3.3.8 保护域 (Protection Domain)
其组件只能相互交互的对象。这些组件可以是 AH、QP、MR 和 SRQ。保护域被用于将 QP 与 MR 和
MW 关联起来,作为使能和控制网络适配器对主机系统内存访问的一种方法。PD 也被用来将 UD QP
与 AH 关联起来,作为控制对 UD 目的地访问的一种方法。
struct ibv_pd 被用于实现 PD。
3.3.9 异步事件 (Asynchronous Events)
网络适配器可以发送异步事件以向SW通知系统中发生的事件。
有两种异步事件类型:
附属事件 (Affiliated events): 发生在私有对象 (CQ、QP、SRQ) 上的事件。这些事件将被发送 到特定的进程。
非附属事件 (Unaffiliated events): 发生在全局对象 (网络适配器、端口错误) 的事件。这些事件 将被发送给所有的进程。
3.3.10 集散 (Scatter Gather)
使用集散元素 (gather scatter elements) 来收集/分散数据,包括:
地址 (Address): 本地数据缓冲区的地址,被用于数据的收集和分发。
大小 (Size): 读写到该地址的数据的大小。
L_key: 注册到该缓冲区的 MR 的本地密钥。
struct sge 被用于实现集散元素。
3.3.11 轮询 (Polling)
ibv_poll_cq 操作完成的。