前言

在 flagcx_connector 内通过 flagcxCommRegister + flagcxOneSideSignalRegister 来完成传输时的 kv cache + signal 的注册。

_register_kv_for_comm
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(commhomoComm, buff, size, &homoHandle); 但是在异构的情况下,会注册 ipc 和调用 flagcxOneSideRegisterflagcxOneSideRegister 内并没有按照 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新增 signalHandlestagingHandle 字段,comm 对象独立持有各自注册状态
全局辅助函数新增 flagcxOneSideFindMeshHandle(heteroComm)(找第一个 data buffer handle)、flagcxOneSideResolveDataHandle(heteroComm, idx)(按索引找第 N 个 handle)
全局单例指针删除 globalOneSideSignalHandlesglobalOneSideStagingHandles