asc_copy_l12l0b_trans【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√功能说明该接口实现带转置的2D格式数据从L1 Buffer到L0B 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 3src_stride 1表示相邻迭代间源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1单位32 × 32 × 1B这里的单位实际上是拼接后的方块矩阵的大小dst_gap 1表示相邻迭代间目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1单位512Bdst_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 3src_stride 1表示相邻迭代间源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1 单位16 × 16 × 2Bdst_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 3src_stride 1表示相邻迭代间源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1单位16 × 16 × 4B这里的单位实际上是拼接后的方块矩阵的大小dst_gap 1表示相邻迭代间目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1单位512Bdst_frac_gap 0表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为0单位512B。如下图示例repeat_time和src_stride的解释和上图示例一致。dst_gap 0表示相邻迭代间目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔。dst_frac_gap 2表示每个迭代内目的操作数前一个分形结束地址与后一个分形起始地址的间隔为2单位512B。对于int4b_t数据类型每次迭代处理64*64*0.5B数据可处理4个分形一个分形512B每次迭代中源操作数中4个连续的16*64分形将被合并为1个64*64的方块矩阵基于方块矩阵做转置转置后分裂为4个16*64分形根据目的操作数分形间隔等参数可以有不同的排布。int4b_t数据类型需要两个数拼成一个int8_t或uint8_t的数拼凑的规则如下如下图所示共需要处理6144B的数据每次迭代处理64*64*0.5B数据需要3次迭代可以完成repeatTime 3srcStride 1表示相邻迭代间源操作数前一个方块矩阵与后一个方块矩阵起始地址的间隔为1单位64*64*0.5B这里的单位实际上是拼接后的方块矩阵的大小dstGap 1表示相邻迭代间目的操作数前一个迭代第一个分形的结束地址到下一个迭代第一个分形起始地址的间隔为1单位512BdstFracGap 0表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为0单位512B。如下图示例repeatTime和srcStride的解释和上图示例一致。dstGap 0表示相邻迭代间目的操作数前一个迭代第一个分形的结束地址和下一个迭代第一个分形起始地址无间隔。dstFracGap 2表示每个迭代内目的操作数前一个分形的结束地址与后一个分形起始地址的间隔为2单位512B。函数原型常规转置搬运__aicore__ inline void asc_copy_l12l0b_trans(__cb__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ float8_e4m3_t* dst, __cbuf__ float8_e4m3_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ float8_e5m2_t* dst, __cbuf__ float8_e5m2_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ half* dst, __cbuf__ half* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ float* dst, __cbuf__ float* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ hifloat8_t* dst, __cbuf__ hifloat8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ int32_t* dst, __cbuf__ int32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ int8_t* dst, __cbuf__ int8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ fp4x2_e2m1_t* dst, __cbuf__ fp4x2_e2m1_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans(__cb__ fp4x2_e1m2_t* dst, __cbuf__ fp4x2_e1m2_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride);同步转置搬运__aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ float8_e4m3_t* dst, __cbuf__ float8_e4m3_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ float8_e5m2_t* dst, __cbuf__ float8_e5m2_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ half* dst, __cbuf__ half* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ float* dst, __cbuf__ float* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ hifloat8_t* dst, __cbuf__ hifloat8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ int32_t* dst, __cbuf__ int32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ int8_t* dst, __cbuf__ int8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ fp4x2_e2m1_t* dst, __cbuf__ fp4x2_e2m1_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride); __aicore__ inline void asc_copy_l12l0b_trans_sync(__cb__ fp4x2_e1m2_t* dst, __cbuf__ fp4x2_e1m2_t* src, uint16_t index_id, uint8_t repeat, uint16_t src_stride, uint16_t dst_stride, uint16_t dst_frac_stride, uint16_t src_frac_stride);参数说明参数名输入/输出描述dst输出目的L0B Buffer地址。src输入源L1 Buffer地址。index_id输入矩阵ID搬运起始位置为源操作数中第几个分形。取值范围[0, 65535]。repeat输入迭代次数。对于位宽为4的数据类型每次迭代处理4个分形每个分形为16640.5B数据对于位宽为8的数据类型每次迭代处理2个分形每个分形为16321B数据对于位宽为16的数据类型每次迭代处理1个分形每个分形为16162B数据对于位宽为32的数据类型每次迭代处理4个分形每个分形为1684B数据。取值范围[1, 255]。src_stride输入相邻迭代间源操作数前一个分形与后一个分形起始地址的间隔。单位为单个分形512B。取值范围[0, 65535]。dst_stride输入相邻迭代间目的操作数前一个分形与后一个分形起始地址的间隔。单位为单个分形512B。取值范围[0, 65535]。dst_frac_stride输入每个迭代内目的操作数转置前一个分形结束地址与后一个分形起始地址的间隔。单位为512B。仅在数据位宽为4、8或32时有效。src_frac_stride输入每个迭代内源操作数转置前一个分形结束地址与后一个分形起始地址的间隔。单位为512B。仅在数据位宽为4、8或32时有效。返回值说明无流水类型PIPE_MTE1约束说明repeat0表示不执行搬运操作。开发者需要保证目的操作数转置后的分形没有重叠。操作数地址重叠约束请参考通用地址重叠约束。调用示例//设置源操作数和目的操作数total_length 指参与计算的数据长度 constexpr uint64_t total_length 512; __cbuf__ int32_t src[total_length]; __cb__ 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_stride 1; uint16_t dst_frac_stride 15; uint16_t src_frac_stride 8; asc_copy_l12l0b_trans(dst, src, index_id, repeat, src_stride, dst_stride, dst_frac_stride, src_frac_stride);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考