开发者
下载

Load2D

产品支持情况

产品

是否支持

Atlas 350 加速卡

Atlas A3 训练系列产品 / Atlas A3 推理系列产品

Atlas A2 训练系列产品 / Atlas A2 推理系列产品

Atlas 200I/500 A2 推理产品

Atlas 推理系列产品 AI Core

Atlas 推理系列产品 Vector Core

x

Atlas 训练系列产品

功能说明

Load2D支持如下数据通路的搬运:

GM->A1; GM->B1; GM->A2; GM->B2;

A1->A2; B1->B2。

函数原型

  • Load2D接口
    1
    2
    3
    4
    template <typename T>
    __aicore__ inline void LoadData(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LoadData2DParams& loadDataParams)
    template <typename T> 
    __aicore__ inline void LoadData(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const LoadData2DParams& loadDataParams)
    
  • Load2Dv2接口
    1
    2
    3
    4
    template <typename T>
    __aicore__ inline void LoadData(const LocalTensor<T>& dst, const LocalTensor<T>& src,const LoadData2DParamsV2& loadDataParam)
    template <typename T>
    __aicore__ inline void LoadData(const LocalTensor<T>& dst, const GlobalTensor<T>& src,const LoadData2DParamsV2& loadDataParam)
    

参数说明

表1 模板参数说明

参数名称

含义

T

源操作数和目的操作数的数据类型。

  • Load2D接口

    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仅支持A1->A2,B1->B2通路

    Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ,支持数据类型为:int4b_t/uint8_t/int8_t/uint16_t/int16_t/half/bfloat16_t/uint32_t/int32_t/float,int4b_t仅支持A1->A2,B1->B2通路

    Atlas A3 训练系列产品 / Atlas A3 推理系列产品 ,支持数据类型为:int4b_t/uint8_t/int8_t/uint16_t/int16_t/half/bfloat16_t/uint32_t/int32_t/float,int4b_t仅支持A1->A2,B1->B2通路

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

    Atlas 350 加速卡,支持数据类型为:uint8_t/int8_t/uint16_t/int16_t/half/bfloat16_t/uint32_t/int32_t/float,仅支持如下数据通路: GM->A1; GM->B1; A1->A2; B1->B2。

  • Load2Dv2接口

    Atlas 350 加速卡

    • GM->A1、GM->B1时,支持数据类型为: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
    • A1->A2、B1->B2时,支持数据类型为:

      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

表2 通用参数说明

参数名称

输入/输出

含义

dst

输出

目的操作数,类型为LocalTensor。

数据连续排列顺序由目的操作数所在TPosition决定,具体约束如下:

  • A2:ZZ格式/NZ格式;对应的分形大小为16 * (32B / sizeof(T))。
  • B2:ZN格式;对应的分形大小为 (32B / sizeof(T)) * 16。
  • A1/B1:无格式要求,一般情况下为NZ格式。NZ格式下,对应的分形大小为16 * (32B / sizeof(T))。

src

输入

源操作数,类型为LocalTensor或GlobalTensor。

数据类型需要与dst保持一致。

loadDataParams

输入

LoadData参数结构体,类型为:

  • LoadData2DParams,具体参考表3
  • LoadData2DParamsV2,具体参考表4

上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。

表3 LoadData2DParams结构体内参数说明

参数名称

含义

startIndex

分形矩阵ID,说明搬运起始位置为源操作数中第几个分形(0为源操作数中第1个分形矩阵)。取值范围:startIndex∈[0, 65535] 。单位:512B。默认为0。

repeatTimes

迭代次数,每个迭代可以处理512B数据。取值范围:repeatTimes∈[1, 255]。

srcStride

相邻迭代间,源操作数前一个分形与后一个分形起始地址的间隔,单位:512B。取值范围:src_stride∈[0, 65535]。默认为0。

sid

预留参数,配置为0即可。

dstGap

相邻迭代间,目的操作数前一个分形结束地址与后一个分形起始地址的间隔,单位:512B。取值范围:dstGap∈[0, 65535]。默认为0。

注: Atlas 训练系列产品 此参数不使能。

ifTranspose

是否启用转置功能,对每个分形矩阵进行转置,默认为false:

  • true:启用
  • false:不启用

注意:只有A1->A2和B1->B2通路才能使能转置,使能转置功能时,源操作数、目的操作数仅支持b16数据类型。

addrMode

控制地址更新方式,默认为false:

  • true:递减,每次迭代在前一个地址的基础上减去srcStride。
  • false:递增,每次迭代在前一个地址的基础上加上srcStride。
表4 LoadData2DParamsV2结构体内参数说明

参数名称

含义

mStartPosition

以M*K矩阵为例,源矩阵M轴方向的起始位置,单位为16个元素。

kStartPosition

以M*K矩阵为例,源矩阵K轴方向的起始位置,单位为32B。

mStep

以M*K矩阵为例,源矩阵M轴方向搬运长度,单位为16 element。取值范围:mStep∈[0, 255]。

通过ifTranspose参数启用转置功能时,mStep除需满足 [0, 255]的取值范围外,还需满足以下额外约束:

  • 当数据类型为b4时,mStep必须是4的倍数;
  • 当数据类型为b8时,mStep必须是2的倍数;
  • 当数据类型为b16时,mStep必须是1的倍数;
  • 当数据类型为b32时,mStep无额外约束。

kStep

以M*K矩阵为例,源矩阵K轴方向搬运长度,单位为32B。取值范围:kStep∈[0, 255]。

通过ifTranspose参数启用转置功能时,kStep除需满足[0,255]的取值范围外,还需满足以下额外约束:

  • 当数据类型为b4、b8或b16时,kStep没有额外约束;
  • 当数据类型为b32时,kStep必须是2的倍数。

srcStride

以M*K矩阵为例,源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位:512B。

dstStride

以M*K矩阵为例,目标矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位:512B。

ifTranspose

是否启用转置功能,对每个分形矩阵进行转置,默认为false。

  • true:启用
  • false:不启用

注意:只有A1->A2和B1->B2通路才能使能转置。使能转置功能时,支持的数据类型约束如下:

对于Atlas 350 加速卡,源操作数、目的操作数支持b4、b8、b16、b32数据类型。

sid

预留参数,配置为0即可。

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

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

约束说明

  • 操作数地址对齐要求请参见通用地址对齐约束
  • 对于 Atlas 推理系列产品 AI Core,在配合Mmad接口使用、B矩阵数据类型为S4场景下,如果通过ifTranspose参数启用转置,只支持64*64的分形。

返回值说明

调用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Load2d: Nz -> Zz
uint32_t m = 40;
uint32_t k = 70;
uint32_t fractalShape[2] = {16, 32 / sizeof(half)};
uint32_t fractalSize = fractalShape[0] * fractalShape[1];
uint32_t dstOffset = (k + fractalShape[1] - 1) / fractalShape[1] * fractalSize;
uint32_t srcOffset = fractalSize;
uint16_t mStep = (m + fractalShape[0] - 1) / fractalShape[0];

AscendC::LoadData2DParams loadDataParams;
loadDataParams.repeatTimes = (k + fractalShape[1] - 1) / fractalShape[1];
loadDataParams.srcStride = mStep;
loadDataParams.dstGap = 0;
loadDataParams.ifTranspose = false;
for (int i = 0; i < mStep; ++i) {
	AscendC::LoadData(a2Local[i * dstOffset], a1Local[i * srcOffset], loadDataParams);
}

// Load2Dv2: Nz -> Nz
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);