# Infra: Collective Operations

Author: Fanyi Pu

Published: 2026-09-05

Canonical: <https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op>

Notes for Collective Operations

每行一张 GPU · root = R0 颜色跟随数据块，下标表示分片

逐元素求和的图例

Σ₀ = A₀ + B₀ + C₀ + D₀，表示同一分片位置的逐元素求和。

A₀

\+

B₀

C₀

D₀

\=

Σ₀

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

01 Broadcast 整份复制

Broadcast：整份复制

R0 的完整张量 A、B、C、D 被复制到所有 rank，每个 rank 都得到完整的一份。

输入

输出

R0

A

B

C

D

R1

—

R2

R3

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

02 Scatter 切开分发

Scatter：切开分发

R0 持有 A、B、C、D 四块数据。分发后 R0 得到 A，R1 得到 B，R2 得到 C，R3 得到 D。

输入

输出

R0

A

B

C

D

R1

—

R2

R3

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

03 Gather 收集拼接

Gather：收集拼接

四个 rank 分别提供 A、B、C、D，在 R0 按 rank 顺序拼接为四块数据。只在 R0 指定输出。

输入

输出

R0

A

R1

B

R2

C

R3

D

—

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

04 Reduce 逐项相加

Reduce：逐项相加

四个 rank 的同形状数据 A、B、C、D 逐元素相加，R0 得到同形状的结果 Σ = A + B + C + D。只在 R0 指定输出。

输入

输出

\+

R0

A

R1

B

R2

C

R3

D

Σ

—

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

05 All-gather 每处都拼接

All-gather：每处都拼接

四个 rank 分别提供 A、B、C、D，每个 rank 都得到按 rank 顺序拼接的完整数据 A、B、C、D。

输入

输出

R0

A

R1

B

R2

C

R3

D

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

06 Reduce-scatter 相加后分片

Reduce-scatter：相加后分片

各 rank 先按相同分片位置逐元素相加。Σᵢ = Aᵢ + Bᵢ + Cᵢ + Dᵢ。R0 只得到 Σ₀，R1 只得到 Σ₁，R2 只得到 Σ₂，R3 只得到 Σ₃。

输入

输出

\+

R0

A₀

A₁

A₂

A₃

R1

B₀

B₁

B₂

B₃

R2

C₀

C₁

C₂

C₃

R3

D₀

D₁

D₂

D₃

Σ₀

Σ₁

Σ₂

Σ₃

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

07 All-reduce 每处都得总和

All-reduce：每处都得总和

各 rank 按相同分片位置逐元素相加，每个 rank 都得到完整结果 Σ₀、Σ₁、Σ₂、Σ₃。

输入

输出

\+

R0

A₀

A₁

A₂

A₃

R1

B₀

B₁

B₂

B₃

R2

C₀

C₁

C₂

C₃

R3

D₀

D₁

D₂

D₃

Σ₀

Σ₁

Σ₂

Σ₃

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

08 All-to-all 按列交换

All-to-all：按列交换

每个 rank 将第 i 个分片发给 Ri。Ri 按来源 rank 顺序收到 Aᵢ、Bᵢ、Cᵢ、Dᵢ。输入的每一列成为输出的一行，没有求和或复制。可用图下方的单选按钮高亮一个目标 rank。

输入

输出

R0

A₀

A₁

A₂

A₃

R1

B₀

B₁

B₂

B₃

R2

C₀

C₁

C₂

C₃

R3

D₀

D₁

D₂

D₃

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

追踪去向\[x]全部\[ ]R0\[ ]R1\[ ]R2\[ ]R3

All-reduce = Reduce-scatter + All-gather

横向滑动查看完整分解 →

All-reduce 的两步分解

左侧每个 rank 有四个输入分片。Reduce-scatter 后，中间的每个 rank 持有一个求和分片 Σᵢ。再经 All-gather，右侧每个 rank 都持有完整结果 Σ₀、Σ₁、Σ₂、Σ₃，与 All-reduce 的输出相同。这是结果等价的分解，不限定实际通信算法。

输入

每处一片

每处一整份

R0

A₀

A₁

A₂

A₃

R1

B₀

B₁

B₂

B₃

R2

C₀

C₁

C₂

C₃

R3

D₀

D₁

D₂

D₃

Σ₀

Σ₁

Σ₂

Σ₃

Reduce-scatter

All-gather

[View diagram in the original article](https://pufanyi.com/blog/ml/ml-revisit/infra/collective-op)

更详细的代码可以看 [CS336 · Lecture 7](https://cs336.stanford.edu/lectures/?trace=lecture_07)。归约以 SUM 为例；箭头表示数据关系。虚线框表示无指定输入或输出，并不表示清空原数据。
