我最近开始使用 Infiniband 卡,具体来说是两个 Mellanox Technologies MT27700 系列 [ConnectX-4]。最终,我想使用基于 VPI Verbs API/RDMA CM API 的接口扩展现有框架。
关于我已经对 RDMA 编程进行的研究:我首先阅读了Mellanox 的 RDMA Aware Networks Programming User Manual。其次,我阅读了一篇关于 VPI Verbs/RDMA Verbs 功能的相当全面的博客。最后,我阅读了 Tarick Bedeir 发表的三篇关于 RDMA 编程的论文:[1]、[2]、[3]。
为了了解什么最适合我的需求,我创建了一个测试平台来测量延迟、CPU 使用率和吞吐量等。我测试了不同的操作(见下表 1)、不同的发送标志(例如IBV_SEND_INLINE
)以及检索工作完成的不同方式(忙轮询与等待完成通道中的事件)。我的测试台的部分灵感来自这项 RDMA 编程性能研究的结果。
OPCODE | IBV_QPT_UD | IBV_QPT_UC | IBV_QPT_RC
----------------------------+------------+------------+-----------
IBV_WR_SEND | X | X | X
IBV_WR_SEND_WITH_IMM | X | X | X
IBV_WR_RDMA_WRITE | | X | X
IBV_WR_RDMA_WRITE_WITH_IMM | | X | X
IBV_WR_RDMA_READ | | | X
IBV_WR_ATOMIC_CMP_AND_SWP | | | X
IBV_WR_ATOMIC_FETCH_AND_ADD | | | X
目前,我仍在寻找所有可能性。
我注意到的一件事是,每次我想分别用oribv_post_send
写入远程内存或从远程内存中读取时,我都必须调用它。所以,我的问题是是否可以将远程内存地址映射到主机的虚拟地址空间。IBV_WR_RDMA_WRITE
IBV_WR_RDMA_READ
当然,VPI 组件的所有初始化、内存注册ibv_reg_mr
以及远程密钥和地址的交换都必须完成。Infiniband 是否提供任何使这成为可能的东西?
谢谢!