从 MCCL 1 迁移到 MCCL 2
如果您正在使用 MCCL 1.x 并希望迁移到 MCCL 2.x,请留意 API 已经发生了轻微变化。MCCL 2.x 支持 MCCL 1.x 支持的所有集合操作,但对 API 进行了轻微修改。
此外,MCCL 2.x 还要求在使用单个线程为多个 GPU 管理 MCCL 调用时使用"组 API"。
以下列表总结了在使用单个线程管理多个 GPU 的 MCCL 调用的应用中,从 MCCL 1.x 迁移到 2.x 时可能需要的 MCCL API 使用变更:
初始化
在 1.x 版本中,MCCL 必须使用 mcclCommInitAll 在单个线程中初始化,或者让每个 GPU 并发地调用一个线程的 mcclCommInitRank。MCCL 2.x 保留了这两种初始化模式。它增加了一种新的模式,使用组 API,其中 mcclCommInitRank 可以在循环中被调用,类似于通信调用,如下所示。循环必须由组开始和结束 API 保护。
mcclGroupStart();
for (int i=0; i<ngpus; i++) {
musaSetDevice(i);
mcclCommInitRank(comms+i, ngpus, id, i);
}
mcclGroupEnd();
通信
在 MCCL 2.x 中,可以通过在单个线程中循环调用来为不同的设备启动集合操作。这与 MCCL 1.x 中的使用类似。但是,这个循环在 2.x 中必须由组 API 保护。应用程序在进行通信 API 调用之前不需要选择相关的 MUSA 设备。MCCL 运行时内部选择与 MCCL 通信器句柄关联的设备。例如:
mcclGroupStart();
for (int i=0; i<nLocalDevs; i++) {
mcclAllReduce(..., comm[i], stream[i]);
}
mcclGroupEnd();
当每个线程或每个进程只使用一个设备时,API 的一般使用从 MCCL 1.x 到 2.x 保持不变。在这种情况下不需要使用组 API。
计数
现在作为参数提供的计数类型是 size_t 而不是整数。
AllGather 和 ReduceScatter 的原地使用
有关更多信息,请参见"原地操作"。
AllGather 参数顺序
AllGather 函数的参数顺序已经重新排列。原型从:
mcclResult_t mcclAllGather(const void* sendbuff, int count, mcclDataType_t datatype,
void* recvbuff, mcclComm_t comm, musaStream_t stream);
变为:
mcclResult_t mcclAllGather(const void* sendbuff, void* recvbuff, size_t sendcount,
mcclDataType_t datatype, mcclComm_t comm, musaStream_t stream);
recvbuff 参数被移动到 sendbuff 后面,以与其他操作保持一致。
数据类型
MCCL 2.x 中添加了新的数据类型。MCCL 1.x 中存在的数据类型没有变化,仍然可以在 MCCL 2.x 中使用。
错误代码
错误代码已经合并到 mcclInvalidArgument 类别中,并已简化。创建了一个新的 mcclInvalidUsage 代码,以涵盖新的编程错误。

