Skip to content

asc_copy_l12l0a_trans

产品支持情况

  • Ascend 950PR/Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

该接口实现带转置的2D格式数据从L1 Buffer到L0A Buffer的加载。

下面通过示例来讲解接口功能和关键参数:下文图中一个N形或者一个Z形代表一个分形。

  • 对于uint8_t/int8_t数据类型,每次迭代处理32 × 32 × 1B数据,可处理2个分形(一个分形512B),每次迭代中,源操作数中2个连续的16 × 32分形将被合并为1个32 × 32的方块矩阵,基于方块矩阵做转置,转置后分裂为2个16 × 32分形,根据目的操作数分形间隔等参数可以有不同的排布。

如下图示例:

  • 共处理3072B的数据,每次迭代处理32 × 32 × 1B数据,需要3次迭代可以完成,repeat_time = 3;
  • src_stride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:32 × 32 × 1B),这里的单位实际上是拼接后的方块矩阵的大小;
  • dst_gap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512B);
  • dst_frac_gap = 0,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0(单位:512B)。

如下图示例:

  • repeat_time和src_stride的解释和上图示例一致。
  • dst_gap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔。
  • dst_frac_gap = 2,表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2(单位:512B)。

  • 对于half/bfloat16_t数据类型,每次迭代处理16 × 16 × 2B数据,可处理1个分形(一个分形512B),每次迭代中,源操作数中1个16 × 16分形将被转置。
    • 因为每次迭代处理16 × 16 × 2B数据,需要3次迭代可以完成,repeat_time = 3;
    • src_stride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1 (单位:16 × 16 × 2B);
    • dst_gap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址无间隔;
    • 该场景下,因为其分形即为方块矩阵,每个迭代处理一个分形,不存在迭代内分形的间隔,该参数设置无效。

  • 对于float/int32_t/uint32_t数据类型,每次迭代处理16 × 16 × 4B数据,可处理2个分形(一个分形512B),每次迭代中,源操作数2个连续的16 × 8分形将被合并为1个16 × 16的方块矩阵,基于方块矩阵做转置,转置后分裂为2个16 × 8分形,根据目的操作数分形间隔等参数可以有不同的排布。 如下图示例:
    • 因为每次迭代处理16 × 16 × 4B数据,需要3次迭代可以完成,repeat_time = 3;
    • src_stride = 1,表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1(单位:16 × 16 × 4B),这里的单位实际上是拼接后的方块矩阵的大小;
    • dst_gap = 1,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1(单位:512B);
    • dst_frac_gap = 0,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为0(单位:512B)。

如下图示例:

  • repeat_time和src_stride的解释和上图示例一致。
  • dst_gap = 0,表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔。
  • dst_frac_gap = 2,表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为2(单位:512B)。

函数原型

  • 高维切分搬运

    C++
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ int8_t* dst, __cbuf__ int8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ half* dst, __cbuf__ half* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ int32_t* dst, __cbuf__ int32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans(__ca__ float* dst, __cbuf__ float* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    
  • 同步高维切分搬运

    C++
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ int8_t* dst, __cbuf__ int8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ half* dst, __cbuf__ half* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ int32_t* dst, __cbuf__ int32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    __aicore__ inline void asc_copy_l12l0a_trans_sync(__ca__ float* dst, __cbuf__ float* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap, bool enable_addr_decrement, uint16_t dst_frac_gap)
    

参数说明

表1 参数说明

参数名输入/输出描述
dst输出目的操作数。
src输入源操作数。
index_id输入方块矩阵的ID,搬运起始位置为源操作数中第几个方块矩阵(0为源操作数中第1个方块矩阵)。取值范围:index_id∈[0, 65535]。
repeat输入迭代重复次数。repeat∈[0, 255]。
对于uint8_t/int8_t数据类型,每次迭代处理32 × 32 × 1B数据;
对于half/bfloat16_t数据类型,每次迭代处理16 × 16 × 2B数据;
对于float/int32_t/uint32_t数据类型,每次迭代处理16 × 16 × 4B数据。
src_stride输入表示相邻迭代间,源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔,单位:(1024B)。取值范围:src_stride∈[0, 65535]。
对于uint8_t/int8_t数据类型,单位是32 × 32 × 1B;
对于half/bfloat16_t数据类型,单位是16 × 16 × 2B;
对于float/int32_t/uint32_t数据类型,单位是16 × 16 × 4B;
对于int4b_t数据类型,每次迭代处理16 × 64 × 0.5B数据。
dst_gap输入表示相邻迭代间,目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔。取值范围:dst_gap∈[0, 65535]。
enable_addr_decrement输入控制地址更新方式。
false: 递增,每次迭代在前一个地址的基础上加上src_stride。
true: 递减,每次迭代在前一个地址的基础上减去src_stride。
dst_frac_gap输入每个迭代内目的操作数转置前一个分形结束地址与后一个分形起始地址的间隔,单位为512B,仅在数据类型为float/int32_t/uint32_t/uint8_t/int8_t时有效。

返回值说明

流水类型

PIPE_MTE1

约束说明

  • 各存储单元的空间大小和对齐要求请参考存储单元说明
  • repeat=0表示不执行搬运操作。
  • 开发者需要保证目的操作数转置后的分形没有重叠。

调用示例

C++
// 设置源操作数和目的操作数,total_length指参与计算的数据长度
constexpr uint64_t total_length = 512;
__cbuf__ int32_t src[total_length];
__ca__ int32_t dst[total_length];

// 设置搬运过程中的配置
uint8_t n = 64;
uint8_t nBlockSize = 32;
uint8_t repeat = n / nBlockSize;
uint16_t index_id = 0;
uint16_t src_stride = 1;
uint16_t dst_gap = 1;
bool enable_addr_decrement = false;
uint16_t dst_frac_gap = 0;

// 搬运过程
asc_copy_l12l0a_trans(dst, src, index_id, repeat, src_stride, dst_gap, enable_addr_decrement, dst_frac_gap);

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