|
产品 |
是否支持 |
|---|---|
|
Ascend 950PR/Ascend 950DT |
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
x |
|
|
√ |
Load2D支持如下数据通路的搬运:
GM->A1; GM->B1; GM->A2; GM->B2;
A1->A2; B1->B2。
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) |
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) |
|
参数名称 |
含义 |
|---|---|
|
T |
源操作数和目的操作数的数据类型。
|
|
参数名称 |
输入/输出 |
含义 |
|---|---|---|
|
dst |
输出 |
目的操作数,类型为LocalTensor。 数据连续排列顺序由目的操作数所在TPosition决定,具体约束如下:
|
|
src |
输入 |
源操作数,类型为LocalTensor或GlobalTensor。 数据类型需要与dst保持一致。 |
|
loadDataParams |
输入 |
LoadData参数结构体,类型为: 上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。 |
|
参数名称 |
含义 |
|---|---|
|
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。 注: |
|
ifTranspose |
是否启用转置功能,对每个分形矩阵进行转置,默认为false:
注意:只有A1->A2和B1->B2通路才能使能转置,使能转置功能时,源操作数、目的操作数仅支持b16数据类型。 |
|
addrMode |
控制地址更新方式,默认为false:
|
|
参数名称 |
含义 |
|---|---|
|
mStartPosition |
以M*K矩阵为例,源矩阵M轴方向的起始位置,单位为16个元素。 |
|
kStartPosition |
以M*K矩阵为例,源矩阵K轴方向的起始位置,单位为32B。 |
|
mStep |
以M*K矩阵为例,源矩阵M轴方向搬运长度,单位为16 element。取值范围:mStep∈[0, 255]。 通过ifTranspose参数启用转置功能时,mStep除需满足 [0, 255]的取值范围外,还需满足以下额外约束:
|
|
kStep |
以M*K矩阵为例,源矩阵K轴方向搬运长度,单位为32B。取值范围:kStep∈[0, 255]。 通过ifTranspose参数启用转置功能时,kStep除需满足[0,255]的取值范围外,还需满足以下额外约束:
|
|
srcStride |
以M*K矩阵为例,源矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位:512B。 |
|
dstStride |
以M*K矩阵为例,目标矩阵K方向前一个分形起始地址与后一个分形起始地址的间隔,单位:512B。 |
|
ifTranspose |
是否启用转置功能,对每个分形矩阵进行转置,默认为false。
注意:只有A1->A2和B1->B2通路才能使能转置。使能转置功能时,支持的数据类型约束如下: 对于Ascend 950PR/Ascend 950DT,源操作数、目的操作数支持b4、b8、b16、b32数据类型。 |
|
sid |
预留参数,配置为0即可。 |
LoadData2DParamsV2结构体在不启用转置时,示意图如下,参数设置值和解释说明如下:
无
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); |