Skip to content

LoadData(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字节的数据分形为单位进行,支持如下数据通路:

  • L1 Buffer->L0A Buffer、L1 Buffer->L0B Buffer。

对于不同的数据类型,每个数据分形对应的矩阵如下:

  • 对于b4数据类型,每个数据分形在L0A Buffer中为一个16×64的矩阵,在L0B Buffer中为一个64×16的矩阵。
  • 对于b8数据类型,每个数据分形在L0A Buffer中为一个16×32的矩阵,在L0B Buffer中为一个32×16的矩阵。
  • 对于b16数据类型,每个数据分形为一个16×16的矩阵。
  • 对于b32数据类型,每个数据分形在L0A Buffer中为一个16×8的矩阵,在L0B Buffer中为一个8×16的矩阵。

函数原型

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

参数说明

表1 模板参数说明

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

表2 通用参数说明

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

表3 LoadData2DParamsV2结构体内参数说明

参数名称含义
mStartPosition以M×K矩阵为例,源矩阵M轴方向的起始位置,单位为16个元素。
kStartPosition以M×K矩阵为例,源矩阵K轴方向的起始位置,单位为32字节。
mStep以M×K矩阵为例,源矩阵M轴方向搬运长度,单位为16个元素。取值范围:mStep∈[0, 255]。
通过ifTranspose参数启用转置功能时,mStep除需满足取值范围外,还需满足以下额外约束:
  •当数据类型为b4时,mStep必须是4的倍数;
  •当数据类型为b8时,mStep必须是2的倍数;
  •当数据类型为b16时,mStep必须是1的倍数;
  •当数据类型为b32时,mStep无额外约束。
注:mStep=0表示不执行搬运,该接口将被视为NOP(空操作)。
kStep以M×K矩阵为例,源矩阵K轴方向搬运长度,单位为32字节。取值范围:kStep∈[0, 255]。
通过ifTranspose参数启用转置功能时,kStep除需满足取值范围外,还需满足以下额外约束:
  •当数据类型为b4、b8或b16时,kStep没有额外约束;
  •当数据类型为b32时,kStep必须是2的倍数。
注:kStep=0表示不执行搬运,该接口将被视为NOP(空操作)。
srcStride以M×K矩阵为例,源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位:512字节。
dstStride以M×K矩阵为例,目标矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位:512字节。
ifTranspose是否启用转置功能,对每个分形矩阵进行转置,默认为false:
  • true:启用
  • false:不启用
注意:只有L1 Buffer(TPosition: A1)->L0A Buffer(TPosition: A2)和L1 Buffer(TPosition: B1)->L0B Buffer(TPosition: B2)通路才能开启转置。开启转置功能时,支持b4、b8、b16、b32数据类型。
sid预留参数,配置为0即可。
注:兼容旧款产品接口传入,Ascend 950PR/Ascend 950DT产品不做处理。

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数据类型,不启用转置为例)

数据类型

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

返回值说明

约束说明

  • mStep和kStep为0时,表示不执行搬运,该接口将被视为NOP(空操作)。
  • 当目的地址位于L0A Buffer/L0B Buffer时,地址必须512字节对齐;当源地址或目的地址位于L1 Buffer时,地址必须32字节对齐。
  • 对于矩阵转置操作,不同的数据类型需要满足不同的mStep和kStep约束:b4数据类型时,mStep必须是4的倍数;b8数据类型时,mStep必须是2的倍数;b16数据类型时,mStep必须是1的倍数;b32数据类型时,kStep必须是2的倍数。

关键特性说明

非转置场景搬入及搬运起始位置计算

利用mStep和kStep搬运多个方向的数据块,以[M, K]的NZ分形为例:

  • mStartPosition为2,说明M方向搬运起始位置是在距离源操作数起始位置M轴方向16×2=32个元素的位置。
  • kStartPosition为2,说明K方向搬运起始位置是距离源操作数起始位置K轴方向32B×2=64B的位置。
  • srcStride为5,表示源操作数中,K方向前一个分形起始地址与后一个分形起始地址的间隔为5。
  • dstStride为3,表示目的操作数中,K方向前一个分形起始地址与后一个分形起始地址的间隔为3。

起始地址计算公式为:

因此,最终的搬运起始位置为第十三个分形矩阵(源操作数起始地址开始为第1个分形矩阵)。

图2 搬运起始位置示意图

转置场景搬入

对b4/b8/b16/b32的矩阵转置操作,需要满足mStep和kStep的约束:

  • b4数据类型时,mStep必须是4的倍数。
  • b8数据类型时,mStep必须是2的倍数。
  • b16数据类型时,mStep必须是1的倍数。
  • b32数据类型时,kStep必须是2的倍数。

各数据类型转置示意图如下:

图3 b4数据类型转置示意图

图4 b8数据类型转置示意图

图5 b16数据类型转置示意图

图6 b32数据类型转置示意图

调用示例

示例代码片段如下,仅展示样例中的部分代码,完整使用样例请参见LoadData(2D矩阵搬运V2)样例

C++
// LoadData: Nz -> Nz
uint32_t m = 40;
uint32_t k = 70;
uint32_t fractalShape[2] = {16, 32 / sizeof(half)};
uint32_t fractalSize = fractalShape[0] * fractalShape[1];
uint16_t mStep = (m + fractalShape[0] - 1) / fractalShape[0];

AscendC::LoadData2DParamsV2 loadDataParams;
loadDataParams.mStep = mStep;
loadDataParams.kStep = (k + fractalShape[1] - 1) / fractalShape[1];
loadDataParams.srcStride = mStep;
loadDataParams.dstStride = mStep;
loadDataParams.ifTranspose = false;
AscendC::LoadData(a2Local, a1Local, loadDataParams);

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