HcclBatchSendRecv
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
- Atlas 推理系列产品:不支持
- Atlas 训练系列产品:支持
功能说明
异步批量点对点通信操作接口,调用一次接口可以完成本rank上的多个收发任务,本rank发送和接收之间是异步的,发送和接收任务之间不会相互阻塞。
函数原型
HcclResult HcclBatchSendRecv(HcclSendRecvItem* sendRecvInfo, uint32_t itemNum, HcclComm comm, aclrtStream stream)
参数说明
| 参数名 | 输入/输出 | 描述 |
|---|---|---|
| sendRecvInfo | 输入 | 本rank需要下发的收发任务列表的首地址。 HcclSendRecvItem类型,详细可参见HcclSendRecvItem。 |
| itemNum | 输入 | 本rank需要接收和发送的任务个数。 |
| comm | 输入 | 集合通信操作所在的通信域。 |
| stream | 输入 | 本rank所使用的stream。 |
数据类型说明
- 针对Ascend 950PR/Ascend 950DT,支持数据类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、float8-e5m2、float8-e4m3、float8-e8m0、hifloat8、float16、float32、float64、bfp16。
- 针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持数据类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64、bfp16。
- 针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持数据类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64、bfp16。
- 针对Atlas 训练系列产品,支持数据类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64。
返回值
HcclResult:接口成功返回HCCL_SUCCESS,其他失败。
约束说明
-
“异步”是指同一张卡上的接收和发送任务是异步的,不会相互阻塞。但是在卡间,收发任务依旧是同步的,因此,卡间的收发任务也同HcclSend、HcclRecv一样,必须是一一对应的。
-
针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,在大规模集群下(ranksize>500)使用此接口时,并发执行数不能超过3个。
-
针对Atlas 200T A2 Box16 异构子框,若Server内卡间出现建链失败的情况(错误码:EI0010),需要将环境变量HCCL_INTRA_ROCE_ENABLE配置为1,HCCL_INTRA_PCIE_ENABLE配置为0,让Server内采用RoCE环路进行多卡间的通信(请确保Server上存在RoCE网卡,且具有send/recv收发关系的设备之间RDMA链路互通),环境变量配置示例如下:
export HCCL_INTRA_ROCE_ENABLE=1 export HCCL_INTRA_PCIE_ENABLE=0
调用示例
// 申请集合通信操作的Device内存
void *sendBuf = nullptr;
void *recvBuf = nullptr;
uint64_t count = 8;
size_t mallocSize = count * sizeof(float);
aclrtMalloc((void **)&sendBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY);
aclrtMalloc((void **)&recvBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY);
// 初始化通信域
uint32_t rankSize = 8;
HcclComm hcclComm;
HcclCommInitRootInfo(rankSize, &rootInfo, deviceId, &hcclComm);
// 创建任务流
aclrtStream stream;
aclrtCreateStream(&stream);
// 执行Send/Recv,将数据发送至下一节点,同时接收上一节点的数据
// HcclBatchSendRecv可以同时下发本rank上的多个收发任务
uint32_t next = (deviceId + 1) % count;
uint32_t prev = (deviceId - 1 + count) % count;
HcclSendRecvItem sendRecvInfo[2];
sendRecvInfo[0] = HcclSendRecvItem{HCCL_SEND, sendBuf, count, HCCL_DATA_TYPE_FP32, next};
sendRecvInfo[1] = HcclSendRecvItem{HCCL_RECV, recvBuf, count, HCCL_DATA_TYPE_FP32, prev};
HcclBatchSendRecv(sendRecvInfo, 2, hcclComm, stream);
// 阻塞等待任务流中的集合通信任务执行完成
ACLCHECK(aclrtSynchronizeStream(stream));
// 释放资源
aclrtFree(sendBuf); // 释放Device侧内存
aclrtFree(recvBuf); // 释放Device侧内存
aclrtDestroyStream(stream); // 销毁任务流
HcclCommDestroy(hcclComm); // 销毁通信域