优化的内存访问
内存区域重新注册允许用户更改内存区域的属性。 用户可以更改 PD、访问标志或内存区域的地址和长度。 内存
区域支持连续页面分配。 因此,它会注销内存区域,然后注册内存区域。 在可能的情况下,资源会被重用而不是被释放和重新分配。
示例:
int
ibv_rereg_mr(struct ibv_mr *mr, int
flags, struct ibv_pd *pd, void
*addr, size_t length, uint64_t access, struct ibv_rereg_mr_attr *attr);
@mr | 要修改的内存区域。 |
@flags | 一个位掩码,用于指示正在修改的内存区域的以下属性。 标志应为以下之一 IBV_REREG_MR_CHANGE_TRANSLATION /* 更改转换(位置和长度)*/ IBV_REREG_MR_CHANGE_PD/* 更改保护域 */ IBV_REREG_MR_CHANGE_ACCESS/* 更改访问标志 */ |
@pd | 如果在标志中设置了 IBV_REREG_MR_CHANGE_PD,则此字段指定要与内存区域关联的新保护域,否则,此参数将被忽略。 |
@addr | 如果在标志中设置了 IBV_REREG_MR_CHANGE_TRANSLATION,则此字段指定要在新转换中使用的虚拟地址的起始位置,否则,此参数将被忽略。 |
@length | 如果在标志中设置了 IBV_REREG_MR_CHANGE_TRANSLATION,则此字段指定要在新转换中使用的虚拟地址的长度,否则,此参数将被忽略。 |
@access | 如果在标志中设置了 IBV_REREG_MR_CHANGE_ACCESS,则此字段指定新的内存访问权限,否则,此参数将被忽略。 可以是以下之一 IBV_ACCESS_LOCAL_WRITE IBV_ACCESS_REMOTE_WRITE IBV_ACCESS_REMOTE_READ IBV_ACCESS_ALLOCATE_MR /* 让库为用户分配内存,尝试获取连续页面 */ |
@attr | 未来扩展 |
ibv_rereg_mr 在成功时返回 0,失败时返回 errno 值(指示错误原因)。 如果发生错误,MR 处于未定义状态。 用户需要调用 ibv_dereg_mr 以释放它。
请注意,如果 MR(内存区域)是作为共享 MR 创建的并且请求了转换,则在调用之后,MR 将不再是共享 MR。 此外,不支持使用 NVIDIA PeerDirect™ 技术的 MR 重新注册。
内存窗口允许应用程序更灵活地控制对其内存的远程访问。 它仅在物理功能/本机上可用。 支持的内存窗口类型有两种:类型 1 和类型 2B。
内存窗口旨在用于以下情况:应用程序希望
以动态方式授予和撤销对已注册区域的远程访问权限,并减少性能损失
向不同的远程代理授予不同的远程访问权限和/或在已注册区域内的不同范围内授予这些权限
有关更多信息,请参阅 InfiniBand 规范文档。
内存窗口 API 不能与对等内存客户端 (PeerDirect) 协同工作。
查询功能
只有当硬件支持内存窗口时,内存窗口才可用。 要验证内存窗口是否可用,请运行 ibv_query_device
。
例如
struct ibv_device_attr device_attr = {.comp_mask = IBV_DEVICE_ATTR_RESERVED - 1
};
ibv_query_device(context, & device_attr);
if
(device_attr.exp_device_cap_flags & IBV_DEVICE_MEM_WINDOW ||
device_attr.exp_device_cap_flags & IBV_DEVICE_MW_TYPE_2B) {
/* Memory window is supported */
内存窗口分配
内存窗口的分配是通过调用 ibv_alloc_mw
verb 完成的。
type_mw = IBV_MW_TYPE_2/ IBV_MW_TYPE_1
mw = ibv_alloc_mw(pd, type_mw);
绑定内存窗口
分配后,内存窗口应绑定到已注册的内存区域。 内存区域应已使用 IBV_ACCESS_MW_BIND 访问标志注册。
有关如何绑定内存窗口的更多信息,请参阅 rdma-core 手册页。
使内存窗口失效
在重新绑定类型 2 内存窗口之前,必须使用 ibv_post_send
使其失效 - 请参阅 此处。
释放内存窗口
释放内存窗口是使用 ibv_dealloc_mw verb 完成的。
ibv_dealloc_mw(mw);
用户模式内存注册 (UMR) 是一种使用发送队列的快速注册模式。 UMR 支持通过在远程端定义适当的内存密钥,在远程端启用 RDMA 操作和分散数据的使用。
UMR 使用户能够
从先前注册的内存区域创建间接内存密钥,包括从先前的 KLM 创建 KLM。 与用于定义新 KLM 的内存区域没有数据对齐或长度限制。
创建内存区域,这些区域支持定义常规的非连续内存区域。
按需分页 (ODP) 是一种缓解内存注册的大部分缺点的技术。 应用程序不再需要固定地址空间的底层物理页面,并跟踪映射的有效性。 相反,当页面不存在时,HCA 会从操作系统请求最新的转换,并且操作系统会使由于页面不存在或映射更改而不再有效的转换失效。 ODP 不支持连续页面。
ODP 可以进一步分为 2 个子类:显式 ODP 和隐式 ODP。
显式 ODP
在显式 ODP 中,应用程序仍然注册用于通信的内存缓冲区,但此操作用于定义 IO 的访问控制,而不是固定页面。 ODP 内存区域 (MR) 在注册时不需要具有有效的映射。
隐式 ODP
在隐式 ODP 中,应用程序会获得一个特殊的内存密钥,该密钥代表其完整的地址空间。 所有引用此密钥的 IO 访问(受与密钥关联的访问权限的约束)都不需要注册任何虚拟地址范围。
查询功能
如果硬件和内核都支持按需分页,则按需分页可用。 要验证是否支持 ODP,请运行 ibv_query_device.
有关更多信息,请参阅 手册页。
注册 ODP 显式和隐式 MR
ODP 显式 MR 在分配必要的资源(例如 PD、缓冲区)后注册,而 ODP 隐式 MR 注册提供了一个隐式 lkey,该 lkey 代表完整的地址空间。
有关更多信息,请参阅 手册页。
注销 ODP MR
ODP MR 的注销方式与常规 MR 的注销方式相同
ibv_dereg_mr(mr);
Advice MR Verb
驱动程序可以预取给定范围的页面并将它们映射以供 HCA 访问。 advice MR verb 仅适用于 ODP MR。
有关更多信息,请参阅 手册页。
ODP 统计信息
为了帮助调试和性能测量和调整,ODP 支持包括广泛的统计信息集。
有关更多信息,请参阅 rdma-statistics 手册页。
HCA 可以将接收到的数据写入接收 CQE。 内联接收节省了 PCIe 读取事务,因为 HCA 不需要读取散列表。 因此,它可以提高短接收消息情况下的性能。
在轮询 CQ 时,驱动程序将接收到的数据从 CQE 复制到用户的缓冲区。
默认情况下启用内联接收,并且对用户应用程序是透明的。 要全局禁用它,请将 MLX5_SCATTER_TO_CQE 环境变量设置为值 0。 否则,使用带有 MLX5DV_QP_CREATE_DISABLE_SCATTER_TO_CQE 的 mlx5dv_create_qp() 在特定 QP 上禁用它。
有关更多信息,请参阅 mlx5dv_create_qp() 的手册页。