HcclAlltoAllVC
产品支持情况
|
产品 |
是否支持 |
|---|---|
|
|
√ |
|
|
√ |
|
|
☓ |
|
|
☓ |
|
|
☓ |
|
|
☓ |
功能说明
集合通信算子AlltoAllVC操作接口,向通信域内所有rank发送数据(数据量可以定制),并从所有rank接收数据。相比于AlltoAllV,AlltoAllVC通过输入参数sendCountMatrix传入所有rank的收发参数。

函数原型
1
|
HcclResult HcclAlltoAllVC(const void *sendBuf, const void *sendCountMatrix, HcclDataType sendType, const void *recvBuf, HcclDataType recvType, HcclComm comm, aclrtStream stream) |
参数说明
|
参数名 |
输入/输出 |
描述 |
|---|---|---|
|
sendBuf |
输入 |
源数据buffer地址。 |
|
sendCountMatrix |
输入 |
表示发送数据量的二维uint64数组,数组形状为[rankSize][rankSize],sendCountMatrix[i][j] = n表示rank i发给rank j的数据量为n。 例如,若“sendType”为float32,则“sendCountMatrix[i][j] = n”表示rank i发送给rank j n个float32数据。 |
|
sendType |
输入 |
发送数据的数据类型,HcclDataType类型。 针对 针对 |
|
recvBuf |
输出 |
目的数据buffer地址,集合通信结果输出至此buffer中。 recvBuf与sendBuf配置的地址不能相同。 |
|
recvType |
输入 |
接收数据的数据类型,HcclDataType类型。 针对 针对 |
|
comm |
输入 |
集合通信操作所在的通信域。 |
|
stream |
输入 |
本rank所使用的stream。 |
返回值
HcclResult:接口成功返回HCCL_SUCCESS,其他失败。
约束说明
AlltoAllVC操作的性能与NPU之间共享数据的缓存区大小有关,当通信数据量超过缓存区大小时性能将出现明显下降。若业务中AlltoAllVC通信数据量较大,建议通过配置环境变量HCCL_BUFFSIZE适当增大缓存区大小以提升通信性能。
调用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// 申请集合通信操作的 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_FIRST); aclrtMalloc((void **)&recvBuf, mallocSize, ACL_MEM_MALLOC_HUGE_FIRST); // 初始化通信域 uint32_t rankSize = 8; HcclComm hcclComm; HcclCommInitRootInfo(rankSize, &rootInfo, deviceId, &hcclComm); // 创建任务流 aclrtStream stream; aclrtCreateStream(&stream); // 设置收发数据量,收发数据量相同 std::vector<uint64_t> sendCountMatrix(rankSize * rankSize); for (uint32_t i = 0; i < rankSize; ++i) { for (uint32_t j = 0; j < rankSize; ++j) { sendCountMatrix[i * rankSize + j] = count / rankSize; } } // 执行 AlltoAllVC,向通信域内所有 rank 发送相同数据量的数据,并从所有 rank 接收相同数据量的数据,可定制数据量 HcclAlltoAllVC(sendBuf, sendCountMatrix.data(), HCCL_DATA_TYPE_FP32, recvBuf, HCCL_DATA_TYPE_FP32, hcclComm, stream); // 阻塞等待任务流中的集合通信任务执行完成 aclrtSynchronizeStream(stream); // 释放资源 aclrtFree(sendBuf); // 释放 Device 侧内存 aclrtFree(recvBuf); // 释放 Device 侧内存 aclrtDestroyStream(stream); // 销毁任务流 HcclCommDestroy(hcclComm); // 销毁通信域 |