Load3D
产品支持情况
功能说明
Load3D用于完成image to column操作,将多维feature map转为二维矩阵。支持如下数据通路:A1->A2; B1->B2。
函数原型
-
Load3Dv1接口
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接口
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)
参数说明
表 1 模板参数说明
|
|
控制是否在Load3Dv1/Load3Dv2接口内部设置相关属性。 IsResetLoad3dConfig类型。IsResetLoad3dConfig结构定义如下: struct IsResetLoad3dConfig {
bool isSetFMatrix = true;
bool isSetPadding = true;
};
isSetFMatrix配置为true,表示在接口内部设置FeatureMap的属性描述(包括l1H、l1W、padList,参数介绍参考表3、表4);设置为false,表示该接口传入的FeatureMap的属性描述不生效,开发者需要通过SetFmatrix进行设置。 isSetPadding配置为true,表示在接口内部设置Pad属性描述(即padValue参数,参数介绍参考表3、表4);设置为false,表示该接口传入的Pad属性不生效,开发者需要通过SetLoadDataPaddingValue进行设置。可参考样例调用示例。 constexpr IsResetLoad3dConfig IS_RESER_LOAD3D_DEFAULT_CONFIG = {true, true};
|
|
LoadData3DParamsV1/LoadData3DParamsV2中padValue的数据类型。
|
表 2 通用参数说明
|
数据连续排列顺序由目的操作数所在TPosition决定,具体约束如下:
|
||
|
上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。 |
表 3 LoadData3DParamsV1结构体内参数说明
表 4 LoadData3DParamsV2结构体内参数说明
padding 列表 [padding_left, padding_right, padding_top, padding_bottom],每个元素取值范围:[0,255]。默认为{0, 0, 0, 0}。 |
|
源操作数的通道数,取值范围:channelSize∈[1, 63] 。 针对以下型号,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 A2 训练系列产品/Atlas A2 推理系列产品 |
|
该指令在目的操作数width维度的传输长度,如果不覆盖最右侧的分形,对于half类型,应为16的倍数,对于int8_t/uint8_t应为32的倍数;覆盖的情况则无倍数要求。取值范围: kExtension∈[1, 65535] 。 |
|
该指令在目的操作数height维度的传输长度,如果不覆盖最下侧的分形,对于half/int8_t/uint8_t,应为16的倍数;覆盖的情况则无倍数要求。取值范围:mExtension∈[1, 65535] 。 |
|
该指令在目的操作数width维度的起点,对于half类型,应为16的倍数,对于int8_t/uint8_t应为32的倍数。取值范围[0, 65535] 。默认为0。 |
|
该指令在目的操作数height维度的起点,如果不覆盖最下侧的分形,对于half/int8_t/uint8_t,应为16的倍数;覆盖的情况则无倍数要求。取值范围[0, 65535] 。默认为0。 |
|
是否启用转置功能,对整个目标矩阵进行转置,支持数据类型为 bool,仅在目的TPosition为A2,且源操作数为half类型时有效。默认为false。
|
|
是否使能small k特性,每个分形矩阵大小为16*4,支持数据类型为 bool,默认为false。当前产品形态,该特性已不再支持。
|
|
表示LoadData3DV2指令从左矩阵还是右矩阵获取FeatureMap的属性描述,与SetFmatrix配合使用,当前只支持设置为false,默认值为false。
|
约束说明
-
操作数地址对齐要求请参见通用地址对齐约束。
-
LoadData3DParamsV1 cSize特性的开启,需要保证A1/B1中的feature map为 4 channel对齐。
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个元素。

返回值说明
无