从 MCCL 2.1 迁移到 MCCL 2.4
1. 文档目的
本文用于指导外部用户从 MCCL 2.1 升级到 MCCL 2.4,重点说明:
- 2.4 相对 2.1 的主要能力变化
- 应用侧需要重点关注的兼容性影响
- 推荐的升级与验证方式
- 典型新能力与示例入口
本文基于以下版本基线整理:
- 源版本:MCCL 2.1
- 目标版本:MCCL 2.4
2. 升级收益概览
与 2.1 相比,2.4 的主要提升集中在以下几个方面:
- 集合通信与通信器能力更完整:在 2.1 的基础能力之外,补充了更完整的通信器配置、生命周期管理、扩展与查询能力
- 主机侧管理能力增强:支持通信器能力查询、通信器内存管理、对称窗口辅助查询和 RMA signal
- 对称内存与 device API 相关能力更丰富:可在主机侧更方便地探测 LSA、GIN、Host RMA 和窗口属性
- 示例、构建与交付更完整:示例覆盖面更广,CMake 查找和版本查询能力更完善
3. 升级影响摘要
| 维度 | MCCL 2.1 | MCCL 2.4 | 升级影响 |
|---|---|---|---|
| 版本基线 | 2.1 | 2.4 | 建议按完整版本升级,不建议只替换单个动态库 |
| 交付与构建 | 旧版目录和交付内容较简 | 安装、示例、版本查询和 CMake 查找更完整 | 自动化脚本若依赖旧目录结构,需要同步调整 |
| 集合通信接口 | 以传统 collectives 和基础 P2P 为主 | 除传统能力外,还补充 alltoall、gather、scatter 等更完整接口族 | 应用可以减少部分自实现的 send/recv 组合逻辑 |
| 通信器管理 | 基础初始化/销毁为主 | 支持配置初始化、Finalize、Revoke、Split、Shrink、Grow、属性查询 | 复杂拓扑、动态成员和容错场景可获得更强支持 |
| 缓冲区与窗口 | 基础注册能力 | 窗口注册、用户指针查询、LSA 指针查询、通信器内存统计更完整 | 对称窗口与主机侧辅助管理更容易实现 |
| 主机侧 RMA | 无公开 signal 接口 | 支持 mcclPutSignal、mcclSignal、mcclWaitSignal | 需要显式管理窗口、signal 索引和上下文 |
| 类型与配置结构 | 结构体字段较少 | mcclConfig_t、属性结构和内存统计类型更完整 | 建议统一使用官方 initializer,避免手写旧布局 |
4. 对应用侧最重要的兼容性变化
4.1 接口面整体比 2.1 更大
从 2.1 升级到 2.4,不只是小修小补,而是跨越多个阶段的能力扩展。应用通常会遇到以下变化:
- 可以继续使用传统 collectives 和
Send/Recv - 可以逐步接入更完整的通信器管理、窗口和主机侧管理能力
- 原先依赖应用侧自拼装的一些逻辑,可能可以被公共 API 替代
4.2 结构体初始化方式需要统一
2.4 中多个结构体都采用了带 size/magic/version 的可扩展设计。建议统一使用:
MCCL_CONFIG_INITIALIZERMCCL_COMM_PROPERTIES_INITIALIZERMCCL_DEV_COMM_REQUIREMENTS_INITIALIZER
不建议:
- 手写结构体字面量
- 假设结构体字段数量固定
- 沿用 2.1 时期的裸
memset + 局部赋值方式而不重新检查字段
4.3 需要重点关注的新增能力
2.4 中较重要的增量能力包括:
- 通信器属性查询:
mcclCommQueryProperties - 通信器动态扩容:
mcclCommGetUniqueId、mcclCommGrow - 通信器内存管理:
mcclCommSuspend、mcclCommResume、mcclCommMemStats - 对称窗口辅助接口:
mcclWinGetUserPtr、mcclGetLsaDevicePointer - RMA signal:
mcclPutSignal、mcclSignal、mcclWaitSignal
4.4 部分能力有明确前提
以下能力需要应用侧先探测平台能力,再决定是否启用:
mcclGetLsaDevicePointer:需要对称窗口和 device API/LSA 能力mcclWinGetUserPtr:对不支持对称窗口辅助路径的平台存在特殊 fallback 行为mcclCommSuspend/mcclCommResume/mcclCommMemStats:依赖通信器内存管理启用,且不支持 split/share 通信器mcclPutSignal/mcclSignal/mcclWaitSignal:依赖对称窗口和 Host RMA 路径
4.5 主机侧管理操作需要串行化
涉及通信器内存管理 和窗口管理的 host API,需要在同一通信器上进行外部串行化。不要并发混用:
- collectives /
mcclSend/mcclRecv mcclCommSuspendmcclCommResumemcclCommMemStatsmcclCommWindowRegistermcclCommWindowDeregister
5. 从 2.1 到 2.4 的主要能力差异
5.1 通信器与生命周期管理
2.4 相比 2.1,通信器管理能力显著增强,常见能力包括:
mcclCommInitRankConfigmcclCommInitRankScalablemcclCommFinalizemcclCommRevokemcclCommSplitmcclCommShrinkmcclCommQueryPropertiesmcclCommGetUniqueIdmcclCommGrow
适用场景:
- 大规模初始化
- 通信域拆分与收缩
- 动态成员扩展
- 运行时能力探测
5.2 集合通信与点对点
2.4 相比 2.1 提供了更完整的集合通信接口族,文档与示例中已经覆盖:
mcclAlltoAllmcclGathermcclScatter
此外,还支持基于窗口的 RMA signal 流程:
mcclPutSignalmcclSignalmcclWaitSignal
5.3 对称窗口与主机侧辅助接口
除了窗口注册本身,2.4 还提供了更完整的辅助接口:
mcclWinGetUserPtrmcclGetLsaDevicePointer
它们适合:
- 调试窗口与用户缓冲区映射关系
- 构造或验证 LSA 可见地址
5.4 通信器内存管理
2.4 提供了通信器级别的内存管理能力:
mcclCommSuspendmcclCommResumemcclCommMemStatsmcclCommMemStat_t
适合:
- 采集通信器逻辑内存统计
- 在资源敏感场景中挂起/恢复通信器托管资源