这是一个比较有趣的技术吧,可以直接访问远端内存,而不需要远端cpu相应来处理。
更多的介绍可以参考其他文章。这里主要是尝试构建一个简单的示例来展示rdma的基本使用。
参考官方文档, 可以比较简单的跑起来一个测试程序
我拷到了一个仓库里,可以直接打开测试。
下面讲述一下里面的一个操作流程。
如果内容上,对名词等有不懂的话,可以期待下我的另一篇文章~
初始化
获取设备上下文
ibv_get_device_name获取设备列表
然后ibv_open_device来打开其中一个设备,获取上下文
然后可以把列表释放掉ibv_free_device_list
随后测试端口可否来通信ibv_query_port
申请保护域
ibv_alloc_pd
创建完成队列
ibv_create_cq
绑定内存
申请一块用来存储数据,随后用ibv_reg_mr来注册获得mr
创建队列对
初始化ibv_qp_init_attr的参数包含消息队列长度,接收队列等信息,使用ibv_create_qp创建qp
连接队列对
先用ibv_modify_qp初始化qp,状态,rtr rts等信息,
通信
发起
接收端 告知准备好接收ibv_post_recv
发送端 发送数据 ibv_post_send
等待完成
不断ibv_poll_cq查询完成队列是否完成。确认后完成一次传输
销毁
倒序销毁前面建立的对象即可
ibv_destroy_qp
ibv_dereg_mr
销毁内存
ibv_destroy_cq
ibv_dealloc_pd
ibv_close_device
更详细的内容可以参考我的仓库里面,可以直接跑起来示例。仓库(来都来了,star一下呗~~)
如果希望更多的内容可以留言啊,不定期更新