Skip to content

LoadData(GMToL1-2D矩阵搬运)

产品支持情况

  • 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字节的数据分形为单位从Global Memory搬运至L1 Buffer(TPosition为A1/B1)。

函数原型

C++
template <typename T>
__aicore__ inline void LoadData(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const LoadData2DParams& loadDataParams)

参数说明

表1 通用参数说明

参数名称输入/输出含义
dst输出目的操作数,类型为LocalTensor。
分形约束参考矩阵计算输入搬运约束
起始地址对齐约束参考矩阵计算输入搬运约束中的对齐约束
数据类型和src的数据类型保持一致。
支持的物理存储位置为L1 Buffer(TPosition为A1/B1)。
src输入源操作数,类型为GlobalTensor。
分形约束参考矩阵计算输入搬运约束
起始地址对齐约束参考矩阵计算输入搬运约束中的对齐约束
数据类型和dst的数据类型保持一致。
支持的物理存储位置为Global Memory(TPosition为GM)。
loadDataParams输入LoadData参数结构体,类型为LoadData2DParams,具体参考表2

表2 LoadData2DParams结构体内参数说明

参数名称含义
startIndex分形矩阵ID,说明搬运起始位置为源操作数中第几个分形(0为源操作数中第1个分形矩阵)。取值范围:startIndex∈[0, 65535]。单位:512字节。默认为0。
repeatTimes迭代次数,每个迭代可以处理512字节数据。取值范围:repeatTimes∈[0, 255]。
注:repeatTimes = 0表示不执行搬运,该接口将被视为NOP(空操作)。
srcStride相邻迭代间,源操作数前一个分形与后一个分形起始地址的间隔,单位:512字节。取值范围:srcStride∈[0, 65535]。默认为0。
注:srcStride = 0表示在连续的重复执行周期之间,重复获取相同的分形矩阵。
sid此参数用户无需关注,设置为0即可。
dstGap相邻迭代间,目的操作数前一个分形结束地址与后一个分形起始地址的间隔,单位:512字节。取值范围:dstGap∈[0, 65535]。默认为0。
注:dstGap = 0表示相邻repeat目的操作数起始地址间隔1个数据分形即连续存放。
ifTranspose是否启用转置功能,对每个分形矩阵进行转置,默认为false:
  • true:启用。
  • false:不启用。
注:本通路场景下不支持转置,参数无意义,保持默认即可。
addrMode用于控制多次迭代场景下,源操作数中每一次迭代的分形矩阵索引ID是递增还是递减,0表示递增,下一次repeat index = startIndex + srcStride * repeatTimes。1表示递减,下一次repeat index = startIndex - srcStride * repeatTimes。

数据类型

针对Ascend 950PR/Ascend 950DT,支持数据类型为:uint8_t、int8_t、uint16_t、int16_t、half、bfloat16_t、uint32_t、int32_t、float。

针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持数据类型为:b8、b16、b32。

针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持数据类型为:b8、b16、b32。

针对Atlas 200I/500 A2 推理产品,支持数据类型为:uint8_t、int8_t、uint16_t、int16_t、half、bfloat16_t、uint32_t、int32_t、float。

针对Atlas 推理系列产品AI Core,支持数据类型为:uint8_t、int8_t、uint16_t、int16_t、half。

针对Atlas 训练系列产品,支持数据类型为:uint8_t、int8_t、uint16_t、int16_t、half。

针对Kirin X90,支持数据类型为:int8_t、half。

针对Kirin 9030,支持数据类型为:half。

返回值说明

约束说明

  • 操作数地址对齐要求请参见通用地址对齐约束
  • 本通路搬运过程中不支持转置。
  • 目的地址必须32字节对齐。源地址必须1字节对齐,指令执行占用的流水为PIPE_MTE2。
  • 当srcStride=0时,表示连续的repeat之间读取的源操作数中的同一块数据分形。
  • 针对Atlas 训练系列产品不支持dstGap设置参数。

调用示例

如下示例中:在数据类型为half的场景下,通过调用LoadData接口完成GM->L1 Buffer的Nz2Nz数据搬运。

搬运过程的数据排布变化示意图如下:

示例代码片段如下:

C++
// m=32, k=32, fractalShape[0] = 16,fractalShape[1] = 16, fractalSize = 256;
uint32_t dstOffset = fractalSize;
uint32_t srcOffset = fractalSize;
AscendC::LoadData2DParams loadDataParams;
loadDataParams.repeatTimes = CeilDivision(k, fractalShape[1]);
loadDataParams.srcStride = CeilDivision(m, fractalShape[0]);
loadDataParams.dstGap = CeilDivision(m, fractalShape[0]) - 1;
for (uint16_t i = 0; i < CeilDivision(m, fractalShape[0]); ++i) {
    AscendC::LoadData(a1Local[i * dstOffset], aGM[i * srcOffset], loadDataParams);
}

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