Load3D
产品支持情况
|
产品 |
是否支持 |
|---|---|
|
Atlas 350 加速卡 |
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
x |
|
|
√ |
功能说明
Load3D用于完成image to column操作,将多维feature map转为二维矩阵。支持如下数据通路:A1->A2; B1->B2。
函数原型
- Load3Dv1接口
1 2
template <typename T, const IsResetLoad3dConfig &defaultConfig = IS_RESER_LOAD3D_DEFAULT_CONFIG, typename U = PrimT<T>, typename Std::enable_if<Std::is_same<PrimT<T>, U>::value, bool>::type = true> __aicore__ inline void LoadData(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LoadData3DParamsV1<U>& loadDataParams)
- Load3Dv2接口
1 2
template <typename T, const IsResetLoad3dConfig &defaultConfig = IS_RESER_LOAD3D_DEFAULT_CONFIG, typename U = PrimT<T>, typename Std::enable_if<Std::is_same<PrimT<T>, U>::value, bool>::type = true> __aicore__ inline void LoadData(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LoadData3DParamsV2<U>& loadDataParams)
- Load3Dv2Pro接口
1 2
template <typename T> __aicore__ inline void LoadData(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LoadData3DParamsV2Pro& loadDataParams)
参数说明
|
参数名称 |
含义 |
||||
|---|---|---|---|---|---|
|
T |
源操作数和目的操作数的数据类型。
|
||||
|
defaultConfig |
控制是否在Load3Dv1/Load3Dv2接口内部设置相关属性。 IsResetLoad3dConfig类型。IsResetLoad3dConfig结构定义如下:
isSetFMatrix配置为true,表示在接口内部设置FeatureMap的属性描述(包括l1H、l1W、padList,参数介绍参考表3、表4);设置为false,表示该接口传入的FeatureMap的属性描述不生效,开发者需要通过SetFmatrix进行设置。 isSetPadding配置为true,表示在接口内部设置Pad属性描述(即padValue参数,参数介绍参考表3、表4);设置为false,表示该接口传入的Pad属性不生效,开发者需要通过SetLoadDataPaddingValue进行设置。可参考样例调用示例。 该参数的默认值如下:
|
||||
|
U |
LoadData3DParamsV1/LoadData3DParamsV2中padValue的数据类型。
最后一个模板参数仅用于上述数据类型检查,用户无需关注。 |
|
参数名称 |
输入/输出 |
含义 |
|---|---|---|
|
dst |
输出 |
目的操作数,类型为LocalTensor。 数据连续排列顺序由目的操作数所在TPosition决定,具体约束如下:
|
|
src |
输入 |
源操作数,类型为LocalTensor或GlobalTensor。 数据类型需要与dst保持一致。 |
|
loadDataParams |
输入 |
LoadData参数结构体,类型为: 上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。 |
|
参数名称 |
含义 |
|---|---|
|
padList |
padding列表 [padding_left, padding_right, padding_top, padding_bottom],每个元素取值范围:[0,255]。默认为{0, 0, 0, 0}。 |
|
l1H |
源操作数 height,取值范围:l1H∈[1, 32767]。 |
|
l1W |
源操作数 width,取值范围:l1W∈[1, 32767] 。 |
|
c1Index |
该指令在源tensor C1维度的起点,取值范围:c1Index∈[0, 4095] 。默认为0。 |
|
fetchFilterW |
该指令在卷积核上w维度的起始位置,取值范围:fetchFilterW∈[0, 254] 。默认为0。 |
|
fetchFilterH |
该指令在filter上h维度的起始位置,取值范围:fetchFilterH∈[0, 254] 。默认为0。 |
|
leftTopW |
该指令在源操作数上w维度的起点,取值范围:leftTopW∈[-255, 32767] 。默认为0。如果padding_left = a,leftTopW配置为-a。 |
|
leftTopH |
该指令在源操作数上h维度的起点,取值范围:leftTopH∈[-255, 32767] 。默认为0。如果padding_top = a,leftTopH配置为-a。 |
|
strideW |
卷积核在源操作数w维度滑动的步长,取值范围:strideW∈[1, 63] 。 |
|
strideH |
卷积核在源操作数h维度滑动的步长,取值范围:strideH∈[1, 63] 。 |
|
filterW |
卷积核width,取值范围:filterW∈[1, 255] 。 |
|
filterH |
卷积核height,取值范围:filterH∈[1, 255] 。 |
|
dilationFilterW |
卷积核width膨胀系数,取值范围:dilationFilterW∈[1, 255] 。 |
|
dilationFilterH |
卷积核height膨胀系数,取值范围:dilationFilterH∈[1, 255] 。 |
|
jumpStride |
迭代之间,目的操作数首地址步长,取值范围:jumpStride∈[1, 127] 。 |
|
repeatMode |
迭代模式。
取值范围:repeatMode∈[0, 1] 。默认为0。 |
|
repeatTime |
迭代次数,每一次源操作数和目的操作数的地址都会改变。取值范围:repeatTime∈[1,255] 。 |
|
cSize |
配置是否开启cSize = 4(b16) / cSize = 8(b8)优化,取值范围:cSize∈[0, 1] 。默认为0。 |
|
padValue |
Pad填充值的数值,数据类型需要与src保持一致。默认为0。若不想使能padding,可将padList设为全0。 |
|
参数名称 |
含义 |
|---|---|
|
padList |
padding 列表 [padding_left, padding_right, padding_top, padding_bottom],每个元素取值范围:[0,255]。默认为{0, 0, 0, 0}。 |
|
l1H |
源操作数height,取值范围:l1H∈[1, 32767]。 |
|
l1W |
源操作数weight,取值范围:l1W∈[1, 32767] 。 |
|
channelSize |
源操作数的通道数,取值范围:channelSize∈[1, 63] 。 针对以下型号,channelSize的取值要求为:对于half,channelSize可取值为4,8,16,N * 16 + 4,N * 16 + 8;对于int8_t/uint8_t,channelSize可取值为4,8,16,32,N * 32 + 4,N * 32 + 8,N * 32 + 16;对于int4b_t,ChannelSize可取值为8,16,32,N * 64,N * 64 + 8,N * 64 + 16,N * 64 + 32。N为正整数。 针对以下型号,channelSize的取值要求为:对于uint32_t/int32_t/float,channelSize可取值为4,N * 8,N * 8 + 4;对于half/bfloat16,channelSize可取值为4,8,N * 16,N * 16 + 4,N * 16 + 8;对于int8_t/uint8_t,channelSize可取值为4,8,16, 32 * N,N * 32 + 4,N * 32 + 8,N * 32 + 16;对于int4b_t,ChannelSize可取值为8,16,32,N * 64,N * 64 + 8,N * 64 + 16,N * 64 + 32。N为正整数。 Atlas 350 加速卡 |
|
kExtension |
该指令在目的操作数width维度的传输长度,如果不覆盖最右侧的分形,对于half类型,应为16的倍数,对于int8_t/uint8_t应为32的倍数;覆盖的情况则无倍数要求。取值范围: kExtension∈[1, 65535] 。 |
|
mExtension |
该指令在目的操作数height维度的传输长度,如果不覆盖最下侧的分形,对于half/int8_t/uint8_t,应为16的倍数;覆盖的情况则无倍数要求。取值范围:mExtension∈[1, 65535] 。 |
|
kStartPt |
该指令在目的操作数width维度的起点,对于half类型,应为16的倍数,对于int8_t/uint8_t应为32的倍数。取值范围[0, 65535] 。默认为0。 |
|
mStartPt |
该指令在目的操作数height维度的起点,如果不覆盖最下侧的分形,对于half/int8_t/uint8_t,应为16的倍数;覆盖的情况则无倍数要求。取值范围[0, 65535] 。默认为0。 |
|
strideW |
卷积核在源操作数width维度滑动的步长,取值范围:strideW∈[1, 63] 。 |
|
strideH |
卷积核在源操作数height 维度滑动的步长,取值范围:strideH∈[1, 63] 。 |
|
filterW |
卷积核width,取值范围:filterW∈[1, 255] 。 |
|
filterH |
卷积核height,取值范围:filterH∈[1, 255] 。 |
|
dilationFilterW |
卷积核width膨胀系数,取值范围:dilationFilterW∈[1, 255] 。 |
|
dilationFilterH |
卷积核height膨胀系数,取值范围:dilationFilterH∈[1, 255] 。 |
|
enTranspose |
是否启用转置功能,对整个目标矩阵进行转置,支持数据类型为 bool,仅在目的TPosition为A2,且源操作数为half类型时有效。默认为false。
|
|
enSmallK |
是否使能small k特性,每个分形矩阵大小为16*4,支持数据类型为 bool,默认为false。当前产品形态,该特性已不再支持。
|
|
padValue |
Pad填充值的数值,数据类型需要与src保持一致。默认为0。若不想使能padding,可将padList设为全0。 |
|
filterSizeW |
是否在filterW的基础上将卷积核width增加256 个元素。true,增加;false,不增加。 |
|
filterSizeH |
是否在filterH的基础上将卷积核height增加256个元素。true,增加;false,不增加。 |
|
fMatrixCtrl |
表示LoadData3DV2指令从左矩阵还是右矩阵获取FeatureMap的属性描述,与SetFmatrix配合使用,当前只支持设置为false,默认值为false。
|
|
参数名称 |
含义 |
|---|---|
|
channelSize |
源操作数的通道数,取值范围:channelSize∈[1, 63] 。 对于half,channelSize除16的余数应当为0,4或8。 对于int8_t和uint8_t,channelSize除32的余数应当为0,4,8或16。 对于int4b_t,ChannelSize为8,16,32,N*64,N*64+8,N*64+16,N*64+32,N为正整数。 |
|
enTranspose |
是否启用转置功能,对整个目标矩阵进行转置,支持数据类型为bool,仅在目的TPosition为A2,且源操作数为half类型时有效。默认为false。
|
|
enSmallK |
是否使能small k特性,每个分形矩阵大小为16*4,支持数据类型为bool,默认为false。当前产品形态,该特性已不再支持。
|
|
filterSizeW |
是否在filterW的基础上将卷积核width增加256个元素。true,增加;false,不增加。 |
|
filterSizeH |
是否在filterH的基础上将卷积核height增加256个元素。true,增加;false,不增加。 |
|
fMatrixCtrl |
表示LoadData3DV2指令从左矩阵还是右矩阵获取FeatureMap的属性描述,与SetFmatrix配合使用,当前只支持设置为false,默认值为false。
|
|
extConfig |
组合参数(uint64_t类型),默认值为0; extConfig= ((uint64_t)mStartPt << 48) | ((uint64_t)kStartPt << 32) | ((uint64_t)mExtension << 16) | (uint64_t)kExtension。 |
|
filterConfig |
组合参数(uint64_t类型),默认值为0X10101010101; filterConfig= ((uint64_t)dilationFilterH << 40) | ((uint64_t)dilationFilterW << 32) | ((uint64_t)filterH << 24) | ((uint64_t)filterW << 16) | ((uint64_t)strideH << 8) | (uint64_t)strideW。 |
约束说明
- 操作数地址对齐要求请参见通用地址对齐约束。
- LoadData3DParamsV1 cSize特性的开启,需要保证A1/B1中的feature map为 4 channel对齐。
- 调用Load3Dv2/Load3Dv2Pro指令需要通过SetLoadDataRepeat接口配置dstStride,若不使能repeat模式,接口内repeat相关参数使用默认构造值。
Load3d数据格式说明
要求输入的feature map和filter的格式是NC1HWC0,其中C0是最低维度而且C0是固定值为16(对于u8/s8类型为32),C1=C/C0。
为了简化场景,以下场景假设输入的feature map的channel 为4,即Ci=4。输入feature maps在A1中的形状为 (Hi,Wi,Ci),经过load3dv1处理后在A2的数据形状为(Wo*Ho, Hk*Wk*Ci)。其中Wo 和Ho是卷积后输出的shape,Hk和Wk是filter的shape。
直观的来看,img2col的过程就是filter在feature map上扫过,将对应feature map的数据展开成输出数据的每一行的过程。filter首先在W方向上滑动Wo步,然后在H方向上走一步然后重复以上过程,最终输出Wo*Ho行数据。下图中红色和黄色的数据分别代表第一行和第二行。数字表示原始输入数据,filter和输出数据三者之间的关联关系。可以看到,load3dv1首先在输入数据的Ci维度搬运对应于00的4个数,然后搬运对应于01的四个数,最终这一行的大小为Hk*Wk*Ci即3*3*4=36个数。
对应的feature map格式如下图:
对应的filter的格式如下图:
其中n为filter的个数,可以看出维度排布为 (Hk,Wk,Ci,n),但是需要注意的是下图的格式还需要根据Mmad中B矩阵的格式转换。
实际操作中,由于存储空间或者计算能力限制,我们通常会将整个卷积计算分块,一次只搬运并计算一小块数据。
对于A2的feature map来说有两种方案,水平分块和垂直分块。分别对应参数中repeatMode的0和1。
注:下图中的分型矩阵大小为4x4,实际应该为16x16 (对于u8/s8类型为16x32)
repeatMode =0时,每次repeat会改变在filter窗口中读取数据点的位置,然后跳到下一个C0的位置。
repeatMode =1的时候filter窗口中读取数据的位置保持不变,每个repeat在feature map中前进C0个元素。
返回值说明
无
调用示例
该调用示例支持的运行平台为
1 2 3 4 5 6 7 8 9 10 11 |
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; uint8_t padList[4] = {padLeft, padRight, padTop, padBottom}; AscendC::LoadData(featureMapA2, featureMapA1, { padList, H, W, 0, 0, 0, -1, -1, strideW, strideH, Kw, Kh, dilationW, dilationH, 1, 0, fmRepeat, 0, (half)(0)}); |