集合通信是一个进程组的所有进程都参与的全局通信操作,其最为基础的操作有发送、接收、复制、节点间进程同步等,这些基本的操作经过组合构成了一组通信模板,也称为通信原语,这些通信原语通过相应的集合通信算子实现。
Broadcast操作是将通信域内root节点的数据广播到其他rank。
注意:通信域内只能有一个root节点。
Scatter操作是将通信域内root节点的数据均分并散布至其他rank。
注意:通信域内只能有一个root节点。
Reduce操作是将通信域内所有rank的输入数据进行归约操作后(支持sum、prod、max、min),再把结果发送到root节点的输出buffer。
AllGather操作是将通信域内所有节点的输入按照rank id重新排序(rank id按照从小到大的顺序排序),然后拼接起来,再将结果发送到所有节点的输出buffer。
针对AllGather操作,每个节点都接收按照rank id重新排序后的数据集合,即每个节点的AllGather输出都是一样的。
AllGather操作是将通信域内所有节点的输入按照rank id重新排序(rank id按照从小到大的顺序排序),然后拼接起来,再将结果发送到所有节点的输出。与AllGather操作不同的是,AllGatherV操作支持通信域内不同节点的输入配置不同大小的数据量。
针对AllGatherV操作,每个节点都接收按照rank id重新排序后的数据集合,即每个节点的AllGatherV输出都是一样的。
AllReduce操作是将通信域内所有节点的输入数据进行归约操作后(支持sum、prod、max、min),再把结果发送到所有节点的输出buffer。
注意:每个rank只能有一个输入。
ReduceScatter操作是将通信域内所有rank的输入进行归约操作后(支持sum、prod、max、min),再把结果按照rank编号均匀分散到各个rank的输出buffer,每个进程拿到其他进程1/ranksize份的数据进行归约操作。
如下图所示,有rank0、rank1、rank2、rank3四个rank,每个rank的输入数据切分成4份,每个进程分别取每个rank的1/4份数据进行sum操作(或其他操作),将结果发送到输出buffer。
ReduceScatterV操作是将所有rank的输入进行归约操作后(支持sum、prod、max、min),再把结果按照rank编号分散到各个rank的输出buffer,每个进程拿到其他进程对应rank编号的数据进行归约操作。与ReduceScatter操作不同的是,ReduceScatterV操作支持为通信域内不同的节点配置不同大小的数据量。
如下图所示,有rank0、rank1、rank2、rank3四个rank,每个进程分别取其他进程对应rank编号的数据进行sum操作(或其他操作),将结果发送到输出buffer。
AlltoAll操作是向通信域内所有rank发送相同数据量的数据,并从所有rank接收相同数据量的数据。
AlltoAll操作将输入数据在特定的维度切分成特定的块数,并按顺序发送给其他rank,同时从其他rank接收输入,按顺序在特定的维度拼接数据。
AlltoAllV操作是向通信域内所有rank发送数据(数据量可以定制),并从所有rank接收数据。