Skip to main content

集体操作

集体操作必须为每个 rank(因此是 MUSA 设备)调用,使用相同的计数和相同的数据类型,以形成一个完整的集体操作。不这样做将导致未定义的行为,包括挂起、崩溃或数据损坏。

AllReduce

AllReduce 操作在设备间对数据(例如,求和、最小值、最大值)进行归约,并将结果存储在每个 rank 的接收缓冲区中。

k 个 rank 之间的 求和 AllReduce 操作中,每个 rank 将提供一个包含 N 个值的数组,并在包含 N 个值的数组 out 中接收相同的结果,其中 out[i] = in0[i] + in1[i] + ... + in(k-1)[i]

AllReduce 操作:每个 rank 接收跨 rank 输入值的归约结果。

相关链接:mcclAllReduce()

Broadcast

Broadcast 操作从 root rank 复制一个 N 元素缓冲区到所有 rank。

Broadcast 操作:所有 rank 从 root rank 接收数据。

重要说明:root 参数是 rank 之一,不是设备编号,因此受到不同的 rank 到设备映射的影响。

相关链接:mcclBroadcast()

Reduce

Reduce 操作执行与 AllReduce 相同的操作,但只将结果存储在指定 root rank 的接收缓冲区中。

Reduce 操作:一个 rank 接收跨 rank 输入值的归约结果。

重要说明:root 参数是 rank 之一(不是设备编号),因此受到不同的 rank 到设备映射的影响。

注意:Reduce 后跟 Broadcast,等同于 AllReduce 操作。

相关链接:mcclReduce()

AllGather

AllGather 操作从 k 个 rank 中收集 N 个值到大小为 k*N 的输出缓冲区,并分配该结果到所有 rank。

输出按 rank 索引排序。因此,AllGather 操作受到不同的 rank 到设备映射的影响。

AllGather 操作:每个 rank 按 rank 顺序接收来自所有 rank 的数据聚合。

注意:执行 ReduceScatter 后跟 AllGather,等同于 AllReduce 操作。

相关链接:mcclAllGather()

ReduceScatter

ReduceScatter 操作执行与 Reduce 相同的操作,但结果在 rank 之间以等大小的块分散,每个 rank 根据其 rank 索引获得一块数据。

由于 rank 决定数据布局,ReduceScatter 操作受到不同的 rank 到设备映射的影响。

ReduceScatter 操作:输入值在 rank 间归约,每个 rank 接收结果的子部分。

相关链接:mcclReduceScatter()

AlltoAll

AlltoAll 操作中,每个 rank 向所有其他 rank 发送相同数量的数据,并从所有其他 rank 接收相同数量的数据。

发送到目标 rank j 的数据位于 sendbuff + j*count,从源 rank i 接收的数据位于 recvbuff + i*count

AlltoAll 操作:每个 rank 向所有其他 rank 发送数据,并从所有其他 rank 接收数据。

由于每个 rank 都同时扮演发送者和接收者,AlltoAll 适合规则的数据重排场景。

相关链接:mcclAlltoAll()

Gather

Gather 操作中,每个 rank 向 root rank 发送 count 个元素,root rank 按 rank 顺序把各个 rank 的数据放入接收缓冲区。

在 root rank 上,来自 rank i 的数据位于 recvbuff + i*count。在非 root rank 上,recvbuff 不被使用。

Gather 操作:root rank 按 rank 顺序收集来自所有 rank 的数据。

相关链接:mcclGather()

Scatter

Scatter 操作与 Gather 相反,由 root rank 向所有 rank 分发数据。

在 root rank 上,发送给 rank i 的数据位于 sendbuff + i*count。在非 root rank 上,sendbuff 不被使用。每个 rank 接收 count 个元素到 recvbuff

Scatter 操作:root rank 按 rank 顺序向所有 rank 分发数据。

相关链接:mcclScatter()