In-place 操作¶
与 MPI 相反,NCCL 没有定义特殊的 “in-place” 值来替换指针。相反,NCCL 优化了提供的指针实际上是 “in place” 的情况。
对于 ncclBroadcast、ncclReduce 和 ncclAllreduce 函数,这意味着传递 sendBuff == recvBuff
将执行 in-place 操作,并将最终结果存储在与读取初始数据相同的位置。
对于 ncclReduceScatter 和 ncclAllGather,当每个 rank 的指针位于全局缓冲区的 rank 偏移位置时,将执行 in-place 操作。更准确地说,当满足以下条件时,这些调用被认为是 in-place 操作
ncclReduceScatter(data, data+rank*recvcount, recvcount, datatype, op, comm, stream);
ncclAllGather(data+rank*sendcount, data, sendcount, datatype, op, comm, stream);