第二部分 · 2 / 7

两层 API:选哪个?

这是理解整个库最关键的一点。gordma 从同一套底层硬件资源出发,提供了两个抽象层级—— 底层 gordma给你完全控制权,高层 rdmanet让你像写 net 一样写业务。

两层对照

底层 · gordma
直接操作 Device / Context / PD / MR / CQ / QP / AH。你自己注册内存、投递 WR、轮询 CQ、驱动 QP 状态机。完全控制,适合复刻 perftest 这类需要精细操作的场景。
高层 · rdmanet
像标准库 net 一样 Dial / Listen / SendMsg / RecvMsg。内存注册、WR 投递、CQ 轮询、流控全部隐藏。适合直接写业务。

同一件事,两种写法

实现一个「收一条消息」的服务端,差距一目了然:

// ── 高层 rdmanet:几行搞定 ──
ln, _   := rdmanet.Listen("0.0.0.0:18515")
conn, _ := ln.Accept()
msg, _  := conn.RecvMsg()        // 一条完整消息,保留边界

// ── 底层 gordma:自己走完七步 ──
// 1. GetDeviceList → Open
// 2. AllocPD → RegMRBuffer → CreateCQ → CreateQP
// 3. 带外握手交换 QPN/PSN/GID/rkey
// 4. ModifyToInit → RTR → RTS
// 5. post_recv
// 6. 轮询 CQ 拿 WorkCompletion
// 7. 各对象 Close()
// (完整实现见 perftest/ 包)

怎么选

你的情况建议
写业务、要 net 风格的收发rdmanet(高层)
io.Reader/io.Writer 兼容、用 io.Copyrdmanet 的字节流适配器
要复刻 perftest、精确控制每个 WR 与 QP 参数gordma(底层)
要用单边 RDMA Write/Readgordma(底层,高层目前聚焦消息/数据报语义)
要实现自定义传输协议 / 流控gordma(底层)
关系 两层用的是同一套硬件资源——高层 rdmanet 内部就是调用底层 gordma 的对象搭起来的。 所以选高层不会「损失」什么,只是把样板和流控交给库去管。需要时你随时能下沉到底层。
下一步 接下来两节分别细看两层:先是 底层 verbs 封装,再是 高层 rdmanet
gordma 教程