# LoadData2D矩阵搬运【免费下载链接】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支持功能说明头文件路径为basic_api/kernel_operator_mm_intf.h。负责完成普通矩阵计算所需的2D格式数据的搬运以大小为512字节的数据分形为单位进行搬运支持如下数据通路的搬运支持GM-L0A Buffer、GM-L0B Buffer、L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer。特别针对Ascend 950PR/Ascend 950DT仅支持L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer。对于不同的数据类型每个数据分形对应的矩阵如下对于b8数据类型每个数据分形在L0A Buffer中为一个16×32的矩阵在L0B Buffer中为一个32×16的矩阵。对于b16数据类型每个数据分形为一个16×16的矩阵。对于b32数据类型每个数据分形在L0A Buffer中为一个16×8的矩阵在L0B Buffer中为一个8×16的矩阵。实现原理可参考伪代码LoadData2D矩阵搬运伪代码。函数原型template typename T __aicore__ inline void LoadData(const LocalTensorT dst, const LocalTensorT src, const LoadData2DParams loadDataParams) template typename T __aicore__ inline void LoadData(const LocalTensorT dst, const GlobalTensorT src, const LoadData2DParams loadDataParams)针对Ascend 950PR/Ascend 950DTtemplate typename T __aicore__ inline void LoadData(const LocalTensorT dst, const LocalTensorT src, const LoadData2DParams loadDataParams)参数说明表1通用参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor。分形约束参考矩阵计算输入搬运约束。起始地址对齐约束参考对齐约束。数据类型和src的数据类型保持一致。支持的物理存储位置为L0A BufferTPosition: A2/L0B BufferTPosition: B2。数据连续排列顺序由目的操作数所在TPosition决定A2对应ZZ格式/NZ格式分形大小为16×(32字节/sizeof(T))B2对应ZN格式分形大小为(32字节/sizeof(T))×16。src输入源操作数类型为LocalTensor或GlobalTensor。分形约束参考矩阵计算输入搬运约束。起始地址对齐约束参考对齐约束。数据类型和dst的数据类型保持一致。位于L1 BufferTPosition: A1/B1时无格式要求一般情况下为NZ格式分形大小为16×(32字节/sizeof(T))。loadDataParams输入LoadData参数结构体类型为LoadData2DParams具体参考表2。表2LoadData2DParams结构体内参数说明参数名称含义startIndex分形矩阵ID说明搬运起始位置为源操作数中第几个分形0为源操作数中第1个分形矩阵。取值范围startIndex∈[0, 65535]。单位512字节。默认为0。特性细节可参考设置搬运起始位置。repeatTimes迭代次数每个迭代可以处理512字节数据。取值范围repeatTimes∈[0, 255]。注repeatTimes0表示不执行搬运该接口将被视为NOP空操作。srcStride相邻迭代间源操作数前一个分形与后一个分形起始地址的间隔单位512字节。取值范围srcStride∈[0, 65535]。默认为0。特性细节可参考非连续搬入。注srcStride0表示在连续的重复执行周期之间重复获取相同的分形矩阵。sid此参数用户无需关注设置为0即可。注预留的扩展参数当前因后续架构升级该参数已废弃不对其进行业务处理。dstGap相邻迭代间目的操作数前一个分形结束地址与后一个分形起始地址的间隔单位512字节。取值范围dstGap∈[0, 65535]。默认为0。特性细节可参考非连续搬入。注dstGap0表示相邻repeat目的操作数起始地址间隔1个数据分形即连续存放。ifTranspose是否启用转置功能对每个分形矩阵进行转置默认为false• true启用• false不启用特性细节可参考分形转置。注只有L1 Buffer-L0A Buffer和L1 Buffer-L0B Buffer通路才能开启转置开启转置功能时源操作数、目的操作数仅支持b16数据类型。addrMode用于控制多次迭代场景下源操作数中每一次迭代的分形矩阵索引ID是递增还是递减• 0默认递增下一次repeat index startIndex srcStride×repeatTime• 1递减下一次repeat index startIndex - srcStride×repeatTime。特性细节可参考控制地址更新方式。注目前仅GM-L1 Buffer通路支持配置保持默认值0即可该参数不涉及性能。数据类型Ascend 950PR/Ascend 950DT支持数据类型为uint8_t、int8_t、uint16_t、int16_t、half、bfloat16_t、uint32_t、int32_t、float。Atlas A3 训练系列产品/Atlas A3 推理系列产品支持数据类型为int4b_t、uint8_t、int8_t、uint16_t、int16_t、half、bfloat16_t、uint32_t、int32_t、float注int4b_t仅支持L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer通路。Atlas A2 训练系列产品/Atlas A2 推理系列产品支持数据类型为int4b_t、uint8_t、int8_t、uint16_t、int16_t、half、bfloat16_t、uint32_t、int32_t、float注int4b_t仅支持L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer通路。Atlas 200I/500 A2 推理产品支持数据类型为uint8_t、int8_t、uint16_t、int16_t、half、bfloat16_t、uint32_t、int32_t、float。Atlas 训练系列产品支持数据类型为uint8_t、int8_t、uint16_t、int16_t、half。Atlas 推理系列产品AI Core支持数据类型为int4b_t、uint8_t、int8_t、uint16_t、int16_t、half注int4b_t仅支持L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer通路。Kirin X90支持数据类型为int8_t、half。Kirin 9030支持数据类型为half。返回值说明无约束说明repeatTimes为0时表示不执行搬运该接口将被视为NOP空操作。只有L1 Buffer-L0A Buffer/L0B Buffer通路才能开启转置开启转置功能时源操作数、目的操作数仅支持b16数据类型。当目的地址位于L0A Buffer/L0B Buffer时地址必须512字节对齐。当源地址或目的地址位于L1 Buffer时地址必须32字节对齐。当源地址位于GM时地址必须1字节对齐。当源地址位于GM时指令执行占用的流水为PIPE_MTE2当源地址位于L1 Buffer时指令执行占用的流水为PIPE_MTE1。当srcStride0时表示连续的repeat之间读取源操作数中的同一块数据分形。对于Atlas 推理系列产品AI Core在配合Mmad接口使用、B矩阵数据类型为S4场景下如果通过ifTranspose参数启用转置只支持64×64的分形。不同型号的物理存储位置不同开发者可以参考如下支持的物理存储位置为Global MemoryTPosition: GM/L1 BufferTPosition: A1/B1。特别针对Ascend 950PR/Ascend 950DT支持的物理存储位置为L1 BufferTPosition: A1/B1。特别针对Ascend 950PR/Ascend 950DT设置dstGap参数无效。关键特性说明非连续搬入利用srcStride和dstGap参数进行跳读跳写从L1 Buffer搬运四个float数据类型的分形到L0A Buffer。startIndex为0说明搬运起始位置为源操作数中第1个分形0为源操作数中第1个分形矩阵。repeatTimes为4表示每条指令搬运4个数据分形。srcStride为2表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔2个数据分形。dstGap为2表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔2个数据分形。从L1 Buffer搬运数据类型为float的6个数据分形到L0A Buffer不开启转置需要循环调用搬运指令3次每次调用搬运指令源操作数地址需要偏移2个数据分形目的操作数地址需要偏移1个数据分形。repeatTimes为2表示每条指令搬运2个数据分形。srcStride为1表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔1个数据分形表示数据分形在物理上相邻。dstGap为2表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔2个数据分形。从L1 Buffer搬运数据类型为float的8个数据分形到L0B Buffer不开启转置需要循环调用搬运指令2次每次调用搬运指令源操作数地址需要偏移1个数据分形目的操作数地址需要偏移1个数据分形。repeatTimes为4表示每条指令搬运4个数据分形。srcStride为2表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔2个数据分形。dstGap为1表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔1个数据分形。设置搬运起始位置从L1 Buffer搬运4个float数据类型的分形到L0A Buffer通过设置startIndex为1跳过第1个分形。startIndex为1说明搬运起始位置为源操作数中第2个分形。repeatTimes为4表示每条指令搬运4个数据分形。srcStride为2表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔2个数据分形。dstGap为2表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔2个数据分形。分形转置数据类型为half时通过设置ifTranspose为1开启转置。startIndex为0说明搬运起始位置为源操作数中第1个分形。repeatTimes为2表示每条指令搬运2个数据分形。srcStride为2表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔2个数据分形。dstGap为2表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔2个数据分形。ifTranspose1表示开启转置。从L1 Buffer搬运数据类型为half的6个数据分形到L0A Buffer开启转置。需要循环调用搬运指令2次每次调用搬运指令源操作数地址需要偏移1个数据分形目的操作数地址需要偏移1个数据分形。repeatTimes为3表示每条指令搬运3个数据分形。srcStride为2表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔2个数据分形。dstGap为1表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔1个数据分形。ifTranspose1表示开启转置。控制地址更新方式从GM搬运四个float数据类型的分形到L1 Buffer设置addrMode为1改变源操作数地址的更新方式。addrMode为1源操作数地址每次迭代在前一个地址的基础上减去srcStride。startIndex为6说明搬运起始位置为源操作数中第7个分形。repeatTimes为4表示每条指令搬运4个数据分形。srcStride为2表示源操作数上前一个数据分形的首地址与后一个数据分形的首地址之间间隔2个数据分形。dstGap为2表示目的操作数上前一个数据分形的尾地址与后一个数据分形的首地址之间间隔2个数据分形。调用示例一、如下示例中在A矩阵不转置数据类型为half的场景下可以直接调用LoadData2D矩阵搬运接口无需开启转置相关参数。搬运过程的数据排布变化示意图如下示例代码片段如下仅展示样例中的部分代码完整示例请参考load_data_l12l0样例。uint32_t dstOffset CeilDivision(k, fractalShape[1]) * fractalSize; uint32_t srcOffset fractalSize; // Nz - Zz AscendC::LoadData2DParams loadDataParams; loadDataParams.repeatTimes CeilDivision(k, fractalShape[1]); loadDataParams.srcStride CeilDivision(m, fractalShape[0]); loadDataParams.dstGap 0; loadDataParams.ifTranspose false; for (int i 0; i CeilDivision(m, fractalShape[0]); i) { AscendC::LoadData(a2Local[i * dstOffset], a1Local[i * srcOffset], loadDataParams); }二、如下示例中在A矩阵转置数据类型为half的场景下调用LoadData2D矩阵搬运接口需开启转置相关参数。搬运过程的数据排布变化示意图如下示例代码片段如下仅展示样例中的部分代码完整示例请参考load_data_l12l0样例。uint32_t dstOffset CeilDivision(k, fractalShape[0]) * fractalSize; uint32_t srcOffset CeilDivision(k, fractalShape[0]) * fractalSize; // Nz - Zz AscendC::LoadData2DParams loadDataParams; loadDataParams.repeatTimes CeilDivision(k, fractalShape[0]); // 源操作数内轴相邻迭代间 loadDataParams.srcStride 1; loadDataParams.dstGap 0; loadDataParams.ifTranspose true; for (int i 0; i CeilDivision(m, fractalShape[1]); i) { AscendC::LoadData(a2Local[i * dstOffset], a1Local[i * srcOffset], loadDataParams); }【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考