AlltoAllV

功能说明

集合通信AlltoAllV的任务下发接口,返回该任务的标识handleId给用户。AlltoAll是AlltoAllV的一个子集,AllToAll要求所有卡的收发数据量相同,AllToAllV则不需要数据量相同,使用上更加灵活。

AllToAllV的功能为:通信域内的卡互相发送和接收数据,并且定制每张卡给其它卡发送的数据量和从其它卡接收的数据量,以及定制发送和接收的数据在内存中的偏移。结合原型中的参数,描述接口功能,具体为:第i张卡发送sendBuf内存中第j块数据到第j张卡,该块数据在sendBuf中偏移为sdispls[j]的位置,且数据量为sendCounts[j],第j张卡将该数据存放到本卡recvBuf中偏移为rdispls[i]的位置,接收数据量为recvCounts[i],这里的sendCounts[j]与recvCounts[i]需要相等。注意:这里的偏移和数据量均为数据的个数,单位为sizeof(sendType)。

函数原型

1
2
template <bool commit = false>
__aicore__ inline HcclHandle AlltoAllV(GM_ADDR sendBuf, void *sendCounts, void *sdispls, HcclDataType sendType, GM_ADDR recvBuf, void *recvCounts, void *rdispls, HcclDataType recvType, uint8_t repeat = 1);

参数说明

表1 模板参数说明

参数名

输入/输出

描述

commit

输入

bool类型。参数取值如下:

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

参数名

输入/输出

描述

sendBuf

输入

源数据buffer地址。

sendCounts

输入

本卡向通信域内其它每张卡发送的数据量,sendCounts[i]表示本卡发送到第i张卡rank_i的数据量,单位是sizeof(sendType)。

sendCounts是一个uint64_t类型的数组,数组长度必须为通信域内总rank数。

例如:sendBuf内数据的数据类型为fp16,sendCounts[0]=1,sendCounts[1]=2,表示本rank给rank0发送1个fp16数据,给rank1发送2个fp16数据。

sdispls

输入

本卡向其它卡发送的数据在sendBuf中的偏移,sdispls[i]=n表示本卡发送给rank_i的数据块在sendBuf中的偏移数据量为n。

sdispls是一个uint64_t类型的数组,数组长度必须为通信域内总rank数。

sendType

输入

sendBuf内数据的数据类型,目前支持HcclDataType包含的全部数据类型,HcclDataType详细可参考表1

recvBuf

输出

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

recvCounts

输入

本卡从其它卡接收的数据量,recvCounts[i]表示本rank接收到的来自rank_i的数据个数,单位是sizeof(recvType)。

recvCounts是一个uint64_t类型的数组,数组长度必须为通信域内总rank数。

例如:recvBuf内数据的数据类型为fp16,recvCounts[0]=1,recvCounts[1]=2,表示本rank接收到rank0的1个fp16数据,接收到rank1的2个fp16数据。

rdispls

输入

本卡接收的数据存放在recvBuf中的偏移,rdispls[i]=n表示本卡接收到的rank_i的数据块在recvBuf中的偏移数据量为n。

rdispls是一个uint64_t类型的数组,数组长度必须为通信域内总rank数。

recvType

输入

recvBuf内数据的数据类型,目前支持HcclDataType包含的全部数据类型,HcclDataType详细可参考表1

注意:recvType和sendType必须一致。

repeat

输入

一次下发的AlltoAllV通信任务个数。repeat取值≥1,默认值为1。当repeat>1时,每个AlltoAllV任务的sendBuf\sendCounts\recvBuf\recvCounts参数不变,sdispls和rdispls由服务端更新,每一轮任务i的更新公式如下:

sdispls[i] = sdispls[i] + sendCounts[i], i∈[0, sdispls.size())

rdispls[i] = rdispls[i] + recvCounts[i], i∈[0, rdispls.size())

注意:当设置repeat>1时,须根据此计算公式,规划通信内存。

返回值

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

支持的型号

Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件当前暂不支持该接口。

约束说明

调用示例