ReduceScatter

功能说明

集合通信算子ReduceScatter的任务下发接口,返回该任务的标识handleId给用户。ReduceScatter的功能为:将所有rank的输入相加(或其他归约操作)后,再把结果按照rank编号均匀分散的到各个rank的输出buffer,每个进程拿到其他进程1/ranksize份的数据进行归约操作。

函数原型

1
2
template <bool commit = false>
__aicore__ inline HcclHandle ReduceScatter(GM_ADDR sendBuf, GM_ADDR recvBuf, uint64_t recvCount, HcclDataType dataType, HcclReduceOp op, uint64_t strideCount, uint8_t repeat = 1)

参数说明

表1 模板参数说明

参数名

输入/输出

描述

commit

输入

bool类型。参数取值如下:

  • true:在调用Prepare接口时,Commit同步通知服务端可以执行该通信任务。
  • false:在调用Prepare接口时,不通知服务端执行该通信任务。
表2 接口参数说明

参数名

输入/输出

描述

sendBuf

输入

源数据buffer地址。

recvBuf

输出

目的数据buffer地址,集合通信结果输出到此buffer中。

recvCount

输入

参与ReduceScatter操作的recvBuf的数据个数;sendBuf的数据个数等于recvCount * rank size。

dataType

输入

ReduceScatter操作的数据类型,目前支持float、half 、int8_t、int16_t、int32_t、bfloat16_t数据类型,即支持取值为HCCL_DATA_TYPE_FP32、HCCL_DATA_TYPE_FP16、HCCL_DATA_TYPE_INT8、HCCL_DATA_TYPE_INT16、HCCL_DATA_TYPE_INT32、HCCL_DATA_TYPE_BFP16。HcclDataType数据类型的介绍请参考表3

op

输入

ReduceScatter的操作类型,目前支持sum、max、min操作类型,即支持取值为HCCL_REDUCE_SUM、HCCL_REDUCE_MAX、HCCL_REDUCE_MIN。HcclReduceOp数据类型的介绍请参考表4

strideCount

输入

当将一张卡上sendBuf中的数据scatter到多张卡的recvBuf时,需要用strideCount参数表示sendBuf上相邻数据块间的起始地址的偏移量。

  • strideCount=0,表示从当前卡发送数据给其它卡时,相邻数据块保持地址连续。本卡发送数据到卡rank[i],且本卡数据块在SendBuf中的偏移为i*recvCount。非多轮切分场景下,推荐用户设置该参数为0。
  • strideCount>0,表示从当前卡发送数据给其它卡时,相邻数据块在sendBuf中起始地址的偏移数据量为strideCount。本卡发送数据到卡rank[i],且本卡数据块在SendBuf中的偏移为i*strideCount。

注意:上述的偏移数据量为数据个数,单位为sizeof(dataType)。

repeat

输入

一次下发的ReduceScatter通信任务个数。repeat取值≥1,默认值为1。当repeat>1时,每个ReduceScatter任务的sendBuf和recvBuf地址由服务端自动算出,计算公式如下:

sendBuf[i] = sendBuf + recvCount * sizeof(datatype) * i, i∈[0, repeat)

recvBuf[i] = recvBuf + recvCount * sizeof(datatype) * i, i∈[0, repeat)

注意:当设置repeat>1时,须与strideCount参数配合使用,规划通信数据地址。

图1 ReduceScatter通信示例

以上图为例,假设4张卡的场景,每份数据被切分为3块(TileCnt为3),每张卡上的0-0、0-1、0-2数据最终reduce+scatter到卡rank0的recvBuf上,其余的每块1-y、2-y、3-y数据类似,最终分别reduce+scatter到卡rank1、rank2和rank3的recvBuf上。因此,对一张卡上的数据需要调用3次ReduceScatter接口,完成每份数据的3块切分数据的通信。对于每一份数据,本接口中参数recvCount为TileLen,strideCount为TileLen*TileCnt(即数据块0-0和1-0间隔的数据个数)。由于本例为内存连续场景,因此也可以只调用1次ReduceScatter接口,并将repeat参数设置为3。

返回值

返回该任务的标识handleId,handleId大于等于0。调用失败时,返回 -1。

支持的型号

Atlas A2训练系列产品/Atlas 800I A2推理产品

注意事项

调用示例