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。 |
| 参数名称 | 含义 |
|---|---|
| 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);
}