Ascend C UBToL1 ND2NZ搬运接口
UBToL1随路转换-ND2NZ搬运DataCopy【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core不支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持Kirin X90不支持Kirin 9030不支持功能说明[!NOTE]说明 本接口为软件仿真实现是在Matmul高阶API的基础上利用Matmul高阶API中的workspace GM空间作为数据中转空间数据先搬入GM再搬入L1 Buffer。因此在使用本接口时需要先使用REGISTER_MATMUL注册高阶API。头文件路径为basic_api/kernel_operator_data_copy_intf.h。支持在数据搬运时进行ND到NZ格式的转换。数据从Unified BufferUBTPosition为VECIN/VECCALC/VECOUT搬运至L1 Buffer搬运过程中完成ND-NZ格式转换。函数原型template typename T __aicore__ inline void DataCopy(const LocalTensorT dst, const LocalTensorT src, const Nd2NzParams intriParams)参数说明表1模板参数说明参数名描述T源操作数或者目的操作数的数据类型。支持的数据类型请参考数据类型。表2参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor存储位置为L1 BufferTSCM。src输入源操作数类型为LocalTensor存储位置为Unified BufferTPosition为VECIN/VECCALC/VECOUT。intriParams输入搬运参数类型为Nd2NzParams。具体定义请参考${INSTALL_DIR}/asc/include/basic_api/interface/kernel_struct_data_copy.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。表3Nd2NzParams结构体参数定义参数名称含义ndNum传输ND矩阵的数目取值范围ndNum∈[0, 4095]。nValueND矩阵的行数取值范围nValue∈[0, 16384]。dValueND矩阵的列数取值范围dValue∈[0, 65535]。srcNdMatrixStride源操作数相邻ND矩阵起始地址间的偏移取值范围srcNdMatrixStride∈[0, 65535]单位为元素。srcDValue源操作数同一ND矩阵的相邻行起始地址间的偏移取值范围srcDValue∈[1, 65535]单位为元素。dstNzC0StrideND转换到NZ格式后源操作数中的一行会转换为目的操作数的多行。dstNzC0Stride表示目的NZ矩阵中来自源操作数同一行的多行数据相邻行起始地址间的偏移取值范围dstNzC0Stride∈[1, 16384]单位C0_SIZE32字节。dstNzNStride目的NZ矩阵中Z型矩阵相邻行起始地址之间的偏移。取值范围dstNzNStride∈[1, 16384]单位C0_SIZE32字节。dstNzMatrixStride目的NZ矩阵中相邻NZ矩阵起始地址间的偏移取值范围dstNzMatrixStride∈[0, 16384]单位为元素。ND2NZ转换示意图如下样例中参数设置值和解释说明如下ndNum 2表示传输ND矩阵的数目为2ND矩阵1为A1~A2 B1~B2ND矩阵2为C1~C2 D1~D2。nValue 2ND矩阵的行数也就是矩阵的高度为2。dValue 24ND矩阵的列数也就是矩阵的宽度为24个元素。当dValue不满足32字节对齐时在目的操作数中不足的部分会被补齐为0例如图示中A2所在DataBlock的空白部分会被补齐为0。srcNdMatrixStride 144表示相邻ND矩阵起始地址间的偏移即为A1~C1的距离即为9个DataBlock9 * 16 144个元素。srcDValue 48表示一行的所含元素个数即为A1到B1的距离即为3个DataBlock3 * 16 48个元素。dstNzC0Stride 11。ND转换到NZ格式后源操作数中的一行会转换为目的操作数的多行例如src中A1和A2为1行dst中A1和A2被分为2行。多行数据起始地址之间的偏移就是A1和A2在dst中的偏移偏移为11个DataBlock。dstNzNStride 2表示src中一个ND矩阵的第x行和第x1行转换为NZ格式后在dst中的偏移即A1和B1在dst之间的偏移为2个DataBlock。dstNzMatrixStride 96表示dst中第x个ND矩阵的起点和第x1个ND矩阵的起点的偏移即A1和C1之间的距离即为6个DataBlock6 * 16 96个元素。图1ND2NZ转换示意图half数据类型数据类型源矩阵和目的矩阵支持的数据类型保持一致。针对Ascend 950PR/Ascend 950DT支持数据类型为bool、int8_t、uint8_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、fp8_e8m0_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、complex32。针对Atlas A3 训练系列产品/Atlas A3 推理系列产品支持数据类型为int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float。针对Atlas A2 训练系列产品/Atlas A2 推理系列产品支持数据类型为int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float。返回值说明无约束说明本接口通过软件仿真实现首先会进行数据分形的转换然后再通过搬运指令进行数据的搬运。本接口内部会申请一块临时的UB空间用于数据分形的转换开发者无需申请但是需要预留临时空间的大小空间大小计算公式如下单位为字节$$((dValue \times sizeof(T) / 32 - 1) \times dstNzC0Stride (nValue - 1) \times dstNzNStride 1) \times 32$$本接口仅支持配置ndNum为1。位于Unified Buffer的源地址必须32字节对齐位于L1 Buffer的目的地址必须32字节对齐。Nd2NzParams结构体参数ndNum、nValue、dValue设置不能为0。搬运至L1 Buffer的数据不能重叠如果存在重叠写入硬件不会产生任何警告或错误并且不保证重叠数据的写入顺序。针对Ascend 950PR/Ascend 950DT支持ub-L1 Buffer的1:2硬通道的方式同时提供1:1的兼容模式解决A2/A3的代码迁移兼容问题这种模式通过Global Memory进行中转效率稍低。Nd2NzParams结构体参数的值需在取值范围内参数取值范围如表4所示。表 4Nd2NzParams结构体参数取值范围参数名称取值范围ndNum[1]nValue[1, 16384]dValue[1, 65535]srcNdMatrixStride[0, 65535]srcDValue[1, 65535]dstNzC0Stride[1, 16384]dstNzNStride[1, 16384]dstNzMatrixStride[0, 16384]调用示例示例场景如图1所示示例代码片段如下AscendC::Nd2NzParams nd2nzParams; // 传输2个ND矩阵。 nd2nzParams.ndNum 2; // 每个ND矩阵高度为2行。 nd2nzParams.nValue 2; // 每行宽度为24个half不足32B对齐的部分在目的端补0。 nd2nzParams.dValue 24; // 源端相邻ND矩阵起始地址间隔为9个DataBlock即9 * 16 144个half。 nd2nzParams.srcNdMatrixStride 144; // 源端同一ND矩阵相邻行起始地址间隔为3个DataBlock即3 * 16 48个half。 nd2nzParams.srcDValue 48; // 目的NZ中同一源行拆出的相邻C0块间隔为11个DataBlock。 nd2nzParams.dstNzC0Stride 11; // 目的NZ中相邻源行转换后的起始地址间隔为2个DataBlock。 nd2nzParams.dstNzNStride 2; // 目的端相邻NZ矩阵起始地址间隔为6个DataBlock即6 * 16 96个half。 nd2nzParams.dstNzMatrixStride 96; AscendC::DataCopy(dstLocal, srcLocal, nd2nzParams);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考