前言
在 flagcx_connector 内通过 flagcxCommRegister + flagcxOneSideSignalRegister 来完成传输时的 kv cache + signal 的注册。
for base_addr, size in self.kv_tensors_meta:
self.flagcx.flagcxCommRegister(comm, base_addr, size)
assert self.signal_buffer is not None
self.flagcx.flagcxOneSideSignalRegister(
comm, self.signal_buffer.data_ptr(), self.signal_buffer.nbytes
)flagcxCommRegister 在同构时会走 cclAdaptors[flagcxCCLAdaptorDevice]→commRegister(comm→homoComm, buff, size, &homoHandle);
但是在异构的情况下,会注册 ipc 和调用 flagcxOneSideRegister。flagcxOneSideRegister 内并没有按照 comm 对 MR/GID/rkey 等资源进行隔离。
核心
原本整个进程只有一套全局状态,Signal 和 Staging Handle 均为全局指针,globalOneSideHandleTable 中的 handle 无归属标记,MR Index 是全局表的绝对下标。
现在每个 flagcxHeteroComm 独立拥有自己的 Signal/Staging 状态,数据窗口 handle 通过 ownerHeteroComm 标记归属,MR Index 是”该 comm 下注册的第 N 个数据窗口”(per-comm 相对偏移)。并且注册的时候的全局表我们调整为:
修改
| 结构 | 变更 |
|---|---|
flagcxOneSideHandleInfo | 新增 ownerHeteroComm 字段,标记每个表项的归属 comm |
flagcxHeteroComm | 新增 signalHandle、stagingHandle 字段,comm 对象独立持有各自注册状态 |
| 全局辅助函数 | 新增 flagcxOneSideFindMeshHandle(heteroComm)(找第一个 data buffer handle)、flagcxOneSideResolveDataHandle(heteroComm, idx)(按索引找第 N 个 handle) |
| 全局单例指针 | 删除 globalOneSideSignalHandles、globalOneSideStagingHandles |