跳到主要内容

集合通信

必须为每个rank(即CUDA设备)调用集合通信,以形成完整的集合通信。否则,其他rank将无限期等待。

AllReduce

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

在k个rank之间执行求和的allreduce操作中,每个rank将提供一个包含N个值的数组 VkV_k ,并接收一个相同的数组S,其中 S[i]=V0[i]+V1[i]+...+Vk1[i]S[i]=V_0[i]+V_1[i]+...+V_{k-1}[i]

AllReduce操作:每个rank接收对rank间输入值的归约。

Broadcast

Broadcast操作将根rank上的一个N元素缓冲区复制到所有rank。

Broadcast操作:所有rank从“根”rank接收数据。

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

相关函数:ncclBroadcast

Reduce

Reduce操作与AllReduce执行相同的操作,但只将结果写入指定根rank的接收缓冲区。

Reduce操作:一个rank接收对rank间输入值的归约。

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

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

相关函数:ncclReduce

AllGather

AllGather操作将k个rank中的N个值聚集到一个大小为k*N的输出中,并将结果分发给所有rank。

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

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

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

相关函数:ncclAllGather

ReduceScatter

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

ReduceScatter操作受到不同的rank或设备映射的影响,因为rank确定数据布局。

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

相关函数:ncclReduceScatter