Load2DMX
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
x |
|
x |
|
x |
|
x |
|
x |
功能说明
Load2D支持如下数据通路的搬运:
GM->A1; GM->B1; GM->A2; GM->B2;
A1->A2; B1->B2。
函数原型
- Load2DMX接口
1 2
template <typename T, typename U = T> __aicore__ inline void LoadData(const LocalTensor<U>& dst, const LocalTensor<T>& src, const LocalTensor<fp8_e8m0_t>& srcMx, const LoadData2DParamsV2& loadDataParams, const LoadData2DMxParams& loadMxDataParams)
- Load2Dv2MX接口,支持源操作数和目的操作数数据类型不一致
1 2
template <typename T, typename U> __aicore__ inline void LoadData(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<fp8_e8m0_t>& srcMx, const LoadData2DParamsV2& loadDataParams, const LoadData2DMxParams& loadMxDataParams)
参数说明
参数名称 |
含义 |
|---|---|
T |
源操作数和目的操作数的数据类型。
|
U |
|
参数名称 |
输入/输出 |
含义 |
|---|---|---|
dst |
输出 |
目的操作数,类型为LocalTensor。 数据连续排列顺序由目的操作数所在TPosition决定,具体约束如下:
|
src |
输入 |
源操作数,类型为LocalTensor或GlobalTensor。 数据类型需要与dst保持一致。 |
srcMx |
输入 |
源操作数,类型为LocalTensor,仅支持fp8_e8m0_t类型。 |
loadDataParams |
输入 |
LoadData参数结构体,类型为:
上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。 |
参数名称 |
含义 |
|---|---|
xStartPosition |
源矩阵X轴方向的起始位置,即M维度方向,单位为1个分形(1个单位代表一个32B的分形)。 |
yStartPosition |
源矩阵Y轴方向的起始位置,即K维度方向,单位为32B。 |
xStep |
源矩阵X轴方向搬运长度,即M维度方向,单位为1个分形(1个单位代表一个32B的分形)。取值范围:xStep∈[0, 255]。 |
yStep |
源矩阵Y轴方向搬运长度,即K维度方向,单位为32B。取值范围:yStep∈[0, 255]。 |
srcStride |
源矩阵X方向前一个分形起始地址与后一个分形起始地址的间隔,单位为32B。 |
dstStride |
目标矩阵X方向前一个分形起始地址与后一个分形起始地址的间隔,单位为32B。 |
下面通过一个具体的示例来解释LoadData2DMX结构体参数。假设A矩阵shape为(M,K),则ScaleA矩阵shape为(M,K/32),ScaleA数据类型为fp8_e8m0_t,ScaleA矩阵分形排布见图1。
下图为ScaleA从L1搬运至L0A过程中的配置参数示意。每一行为32Byte,对应着图1中的一个分形。xStep为M维度分形的个数,如图中的xStep = M / 16 = 3,yStep为K维度32Byte的个数,如图中的yStep = K / 32 / 2 = 21,srcStride和dstStride同理,表示在K维度上32Byte的个数。

约束说明
- 操作数地址对齐要求请参见通用地址对齐约束。
返回值说明
无
调用示例
该调用示例支持的运行平台为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include "kernel_operator.h" uint16_t C1 = 2; uint16_t H = 4, W = 4; uint8_t Kh = 2, Kw = 2; uint16_t Cout = 16; uint16_t C0 = 16; uint8_t dilationH = 2, dilationW = 2; uint8_t padTop = 1, padBottom = 1, padLeft = 1, padRight = 1; uint8_t strideH = 1, strideW = 1; uint16_t coutBlocks, ho, wo, howo, howoRound; uint32_t featureMapA1Size, weightA1Size, featureMapA2Size, weightB2Size, dstSize, dstCO1Size; uint8_t padList[4] = {padLeft, padRight, padTop, padBottom}; featureMapA2Size = howoRound * (C1 * Kh * Kw * C0); fmRepeat = featureMapA2Size / (16 * C0); LoadData2DParamsV2 param = { padList, H, W, 0, 0, 0, -1, -1, strideW, strideH, Kw, Kh, dilationW, dilationH, 1, 0, fmRepeat, 0, (half)(0)}; Load2DBitModeParam paramBitMode(param); AscendC::LocalTensor<half> featureMapA1 = inQueueFmA1.DeQue<half>(); AscendC::LocalTensor<half> featureMapA2 = inQueueFmA2.AllocTensor<half>(); AscendC::LoadData<A2, A1, half>(featureMapA2, featureMapA1, paramBitMode); inQueueFmA2.EnQue<half>(featureMapA2); inQueueFmA1.FreeTensor(featureMapA1); |
