集合通信
必须为每个rank(即CUDA设备)调用集合通信,以形成完整的集合通信。否则,其他rank将无限期等待。
AllReduce
AllReduce操作对数据(例如求和、最小值、最大值等)进行归约,跨设备并将结果写入每个rank的接收缓冲区。
在k个rank之间执行求和的allreduce操作中,每个rank将提供一个包含N个值的数组 ,并接收一个相同的数组S,其中 。
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
。