Skip to content

总体约束说明

所有数据搬运接口共享若干通用约束规则,在进行任何搬运操作前都应确保这些约束被满足,否则可能导致未定义行为或数据异常。

地址对齐约束

AI Core上的各类存储单元有不同的地址对齐要求。Ascend C API操作数的起始地址必须满足对应存储单元的对齐约束。DataBlock(32字节)是搬运操作的基本寻址粒度,大部分搬运接口的blockLen参数均以DataBlock为单位计算。各存储单元的对齐要求如下表所示。

表 1 各存储单元地址对齐要求

存储单元对齐要求说明
Global Memory1字节对齐最宽松的对齐要求,任意字节地址均可
Unified Buffer32字节对齐与DataBlock大小一致,地址必须为32的整数倍
L1 Buffer32字节对齐同UB,地址必须为32的整数倍
L0A Buffer/L0B Buffer512字节对齐矩阵计算输入的高对齐要求
L0C Buffer64字节对齐矩阵计算结果缓冲区
BiasTable Buffer64字节对齐偏置数据缓冲区
Fixpipe Buffer128字节对齐量化参数暂存区

说明

  • 需要注意的是:如果某个具体接口的约束说明中明确指定了与上表不同的对齐要求,则应以该接口自身的说明为准。
  • 对于不满足对齐要求的场景,应使用DataCopyPad接口的非对齐搬运能力。

多指令同步

如果需要执行多个DataCopy指令,且DataCopy的目的地址存在重叠,需要调用PipeBarrier插入同步指令,保证多个DataCopy指令的串行化,防止出现异常数据。如下图左侧示意图,执行两个DataCopy指令,搬运的目的GM地址存在重叠,两条搬运指令之间需要通过调用PipeBarrier<PIPE_MTE3>()进行MTE3流水的同步;如下图右侧示意图所示,搬运的目的地址UB存在重叠,两条搬运指令之间需要调用PipeBarrier<PIPE_MTE2>()进行MTE2流水的同步。多指令同步的核心代码示例如下:

C++
AscendC::DataCopy(src2Local, src2Global, srcDataSize);
// 两条搬运指令之间需要调用PipeBarrier<PIPE_MTE2>()添加MTE2搬入流水的同步。
AscendC::PipeBarrier<PIPE_MTE2>();
AscendC::DataCopy(src1Local, src1Global, srcDataSize);
// 输入src1和src2在UB上分配的地址区间有重叠。
// 为了保证src2的数据不会覆盖src1在重叠区间的值,必须保证先搬入src2,后搬入src1。

图 1 DataCopy的目的地址存在重叠

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区