CANN/HCOMM CCU Write函数
Write
【免费下载链接】hcommHCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
功能说明
在CCU kernel内发起跨rank写操作(异步),通过已建链的ChannelHandle将本端数据写入对端HBM,硬件完成时自动将event的第mask位置1。支持以下两种源类型:
| 重载 | 源 | 目标 |
|---|---|---|
| 重载1 | 本端HBM(LocalAddr) | 对端HBM(RemoteAddr) |
| 重载2 | 本端MS Buffer(CcuBuffer) | 对端HBM(RemoteAddr) |
注意:
- 参数顺序遵循"目的端在前,源端在后"约定:
Write(ch, remote, local, ...),即remote(目的,对端)在第二位,local(源,本端)在第三位。与Read中local在前的顺序相反,请勿混淆。C++类型系统通过RemoteAddr与LocalAddr的不同类型在编译期阻止参数顺序错误。 - 同一kernel内使用的所有
ChannelHandle必须属于同一die。本接口在调用处不做die校验,因此不会因die不一致而失败(调用处仍可能因无注册中kernel返回CCU_E_PTR、或句柄无效返回CCU_E_NOT_FOUND,详见返回值表);die一致性由HcommCcuKernelRegister统一校验(依据本kernel期间用到的全部channel),不一致时由HcommCcuKernelRegister返回CCU_E_PARA,而非本接口的返回值。
函数原型
namespace AscendC { namespace ccu { // 重载1:本端HBM→对端HBM CcuResult Write(ChannelHandle ch, RemoteAddr remote, LocalAddr local, Variable len, Event event, uint16_t mask = 1); // 重载2:本端MS Buffer→对端HBM CcuResult Write(ChannelHandle ch, RemoteAddr remote, CcuBuffer local, Variable len, Event event, uint16_t mask = 1); } // namespace ccu } // namespace AscendC参数说明
| 参数名 | 输入/输出 | 描述 |
|---|---|---|
| ch | 输入 | 跨rank通道句柄(ChannelHandle)。channel绑定的die须与本kernel内所有channel属于同一die(在HcommCcuKernelRegister内统一校验,详见上文CAUTION)。 |
| remote | 输入 | 对端HBM目标地址(RemoteAddr,对端HBM地址与token的复合对象)。 |
| local | 输入 | 本端源地址。重载1为LocalAddr(本端HBM地址与token的复合对象);重载2为CcuBuffer(本端MS Buffer切片对象,单片最大4096字节)。 |
| len | 输入 | 写入字节数,类型为Variable(运行期可变长度)。重载2时不可超过4096字节。 |
| event | 输入 | 完成事件对象。硬件写入完成时自动置位event[mask],下游调用EventWait(event, mask)等待。 |
| mask | 输入 | 16位事件掩码。默认值为1(即bit0)。 |
返回值
CcuResult:接口成功返回CCU_SUCCESS,其他值表示失败。
| 返回值 | 说明 |
|---|---|
CCU_SUCCESS | 操作成功。 |
CCU_E_PTR | 当前不存在处于注册中的kernel(接口在kernel注册阶段之外被调用)。 |
CCU_E_NOT_FOUND | 传入的remote/local/len/event句柄未在当前kernel注册。 |
[!NOTE]说明 本接口不会返回
CCU_E_PARA;channel die不一致由HcommCcuKernelRegister返回CCU_E_PARA,详见功能说明。
约束说明
- 参数顺序为对端(目的)在前、本端(源)在后:
Write(ch, remote, local, ...)。 - 同一kernel内所有
ChannelHandle须属于同一die,不同die的channel不可混入同一kernel。 - 重载2时,
len不可超过CcuBuffer单片大小(4096字节);该上限须由调用方自行保证,超出会导致运行期硬件行为未定义。 - 本接口为异步操作,须通过
EventWait(event, mask)等待写入完成,方可保证对端数据可见。
调用示例
using namespace AscendC::ccu; // 场景1:本端HBM→对端HBM CcuResult MyKernel(CcuKernelArg arg) { auto *params = static_cast<MyKernelArg *>(arg); // CcuKernelArg 为void*,先转型为用户入参结构体 ChannelHandle ch = params->channelHandle; RemoteAddr remote; LocalAddr src; Variable len; Event evt; Write(ch, remote, src, len, evt); // remote在前,local在后 EventWait(evt); return CCU_SUCCESS; } // 场景2:本端MS Buffer→对端HBM CcuResult MyKernel2(CcuKernelArg arg) { auto *params = static_cast<MyKernelArg *>(arg); // CcuKernelArg 为void*,先转型为用户入参结构体 ChannelHandle ch = params->channelHandle; RemoteAddr remote; CcuBuffer buf; Variable len; Event evt; Write(ch, remote, buf, len, evt); EventWait(evt); return CCU_SUCCESS; }【免费下载链接】hcommHCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考