Skip to content

LoadData(GMToL1-2D矩阵搬运V2)

产品支持情况

  • 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 LoadData2DParamsV2& loadDataParams)

参数说明

表 1 模板参数说明

参数名称含义
T源操作数和目的操作数的数据类型。

表 2 通用参数说明

参数名称输入/输出含义
dst输出目的操作数,类型为LocalTensor。支持的物理存储位置为L1 Buffer(TPosition为A1/B1)。
数据分形无格式要求,一般情况下为NZ格式。NZ格式下,对应的分形大小为16 * (32字节 / sizeof(T))。
src输入源操作数,类型为GlobalTensor。数据类型需要与dst保持一致。
loadDataParams输入LoadData参数结构体,类型为LoadData2DParamsV2,具体参考表3

表 3 LoadData2DParamsV2结构体内参数说明

参数名称含义
mStartPosition以M*K矩阵为例,源矩阵M轴方向的起始位置,单位为16个元素。
kStartPosition以M*K矩阵为例,源矩阵K轴方向的起始位置,单位为32字节。
mStep以M*K矩阵为例,源矩阵M轴方向搬运长度,单位为16个元素。取值范围:mStep∈[0, 255]。
注:mStep=0表示不执行搬运,该接口将被视为NOP(空操作)。
kStep以M*K矩阵为例,源矩阵K轴方向搬运长度,单位为32字节。取值范围:kStep∈[0, 255]。
注:kStep=0表示不执行搬运,该接口将被视为NOP(空操作)。
srcStride以M*K矩阵为例,源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位为512字节。
dstStride以M*K矩阵为例,目的矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位为512字节。
ifTranspose是否启用转置功能,对每个分形矩阵进行转置,默认为false。
  • true:启用。
  • false:不启用。
注意:本通路场景下(GM->L1 Buffer)不支持转置,参数无意义,保持默认值即可。
sid预留参数,配置为0即可。

LoadData2DParamsV2结构体在不启用转置时,示意图如下,参数设置值和解释说明如下:

  • mStartPosition = 2,表示源矩阵M轴方向的起始位置为第32个元素(2*16个元素)。
  • kStartPosition = 2,表示源矩阵K轴方向的起始位置为第32个元素(2*32字节)。
  • mStep = 2,表示源矩阵M轴方向搬运长度为32个元素(2*16个元素)。
  • kStep = 3,表示源矩阵K轴方向搬运长度为48个元素(3*32字节)。
  • srcStride = 5,表示源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔为1280个元素(5*512字节)。
  • dstStride = 3,表示目的矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔为768个元素(3*512字节)。
  • ifTranspose = false,表示不启用转置。
  • sid = 0,预留参数,配置为0即可。

图 1 LoadData2DParamsV2结构体参数示例(以half数据类型,不启用转置为例)

数据类型

支持数据类型为:uint8_t、int8_t、fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t、uint32_t、int32_t、float。

返回值说明

约束说明

调用示例

图 1所示的场景为例,源矩阵为GM上Nz排布的half数据,从M轴第2个分形、K轴第2个32B块开始,搬运2个M方向分形、3个K方向32B块到L1 Buffer。

C++
constexpr uint32_t fractalElemCount = 256;
constexpr uint32_t srcElemCount = 25 * fractalElemCount;
constexpr uint32_t dstElemCount = 9 * fractalElemCount;

// 源操作数:GM上按Nz分形排布存放half数据。一个512B分形包含256个half。
// GM shape为80 * 80,M方向和K方向各有5个小分形,因此预留5 * 5 = 25个512B分形。
AscendC::GlobalTensor<half> srcGm;
srcGm.SetGlobalBuffer((__gm__ half *)src, srcElemCount);

// 目的操作数:L1 Buffer,目的矩阵为3 * 3个小分形,因此预留9个512B分形。
AscendC::LocalTensor<half> dstLocal(AscendC::TPosition::A1, 0, dstElemCount);

AscendC::LoadData2DParamsV2 loadDataParams;
// 源矩阵M轴起始位置为第32个元素,即2 * 16个元素。
loadDataParams.mStartPosition = 2;
// 源矩阵K轴起始位置为第32个half,即2 * 32B。
loadDataParams.kStartPosition = 2;
// M方向搬运32个元素,即2 * 16个元素。
loadDataParams.mStep = 2;
// K方向搬运48个half,即3 * 32B。
loadDataParams.kStep = 3;
// GM源矩阵M方向有5个小分形。
loadDataParams.srcStride = 5;
// 目的A1矩阵M方向有3个小分形。
loadDataParams.dstStride = 3;
// 不启用转置。
loadDataParams.ifTranspose = false;
// 预留参数,固定配置为0。
loadDataParams.sid = 0;

AscendC::LoadData(dstLocal, srcGm, loadDataParams);

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