CANN/asc-devkit LoadData卷积数据搬运

📅 2026/7/4 8:27:54
CANN/asc-devkit LoadData卷积数据搬运
# LoadData卷积数据搬运【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况LoadData卷积数据搬运 v1接口Ascend 950PR/Ascend 950DT不支持Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品支持Kirin X90不支持Kirin 9030不支持LoadData卷积数据搬运 v2接口和LoadData卷积数据搬运 v2 Pro接口Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持Kirin X90支持Kirin 9030不支持功能说明头文件路径为basic_api/kernel_operator_mm_intf.h。LoadData卷积数据搬运本质上是用于将NC1HWC0格式的Feature Map完成Image to Column展开然后再从展开后的二维矩阵中选取指定数据块搬入对应内存位置。见图1。由于LoadData搬运过程中是以512字节的数据分形为单位进行搬运的因此LoadData也可以用于普通矩阵计算所需的2D格式数据的搬运。如何使用LoadData进行2D格式数据的搬运可以参考关键特性说明。LoadData卷积数据搬运仅支持如下数据通路L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer。实现原理可参考伪代码LoadData卷积数据搬运伪代码。图1LoadData to L0A Buffer功能示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/4d58be33f1da028b6d716e1e6e7b8d9755ae049c/docs/api/figures/load3d_l1tol0a_demo.png LoadData-to-L0A Buffer功能示意图?utm_sourcegitcode_repo_files)函数原型LoadData卷积数据搬运 v1接口template typename T, const IsResetLoad3dConfig defaultConfig IS_RESER_LOAD3D_DEFAULT_CONFIG, typename U PrimTT, typename Std::enable_ifStd::is_samePrimTT, U::value, bool::type true __aicore__ inline void LoadData(const LocalTensorT dst, const LocalTensorT src, const LoadData3DParamsV1U loadDataParams)LoadData卷积数据搬运 v2接口template typename T, const IsResetLoad3dConfig defaultConfig IS_RESER_LOAD3D_DEFAULT_CONFIG, typename U PrimTT, typename Std::enable_ifStd::is_samePrimTT, U::value, bool::type true __aicore__ inline void LoadData(const LocalTensorT dst, const LocalTensorT src, const LoadData3DParamsV2U loadDataParams)LoadData卷积数据搬运 v2 Pro接口template typename T __aicore__ inline void LoadData(const LocalTensorT dst, const LocalTensorT src, const LoadData3DParamsV2Pro loadDataParams)参数说明表1模板参数说明参数名称含义T源操作数和目的操作数的数据类型。支持的数据类型请参考数据类型。defaultConfig控制是否在LoadData卷积数据搬运 v1/LoadData卷积数据搬运 v2接口内部设置相关属性。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进行设置。可参考样例SetFmatrix调用示例。该参数的默认值如下constexpr IsResetLoad3dConfig IS_RESER_LOAD3D_DEFAULT_CONFIG {true, true};特性细节可参考Feature Map、Pad属性描述寄存器设置。ULoadData3DParamsV1/LoadData3DParamsV2中padValue的数据类型。•当dst、src使用基础数据类型时U和dst、src的数据类型T需保持一致否则编译失败。•当dst、src使用TensorTrait类型时U和dst、src的数据类型T的LiteType需保持一致否则编译失败。最后一个模板参数仅用于上述数据类型检查用户无需关注。表2通用参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor。数据连续排列顺序由目的操作数所在物理存储位置决定不同产品型号的具体格式约束请参考约束说明。src输入源操作数类型为LocalTensor。数据连续排列顺序由目的操作数所在物理存储位置决定• L1 BufferTPosition: A1/B1NC1HWC0格式。loadDataParams输入LoadData参数结构体类型为• LoadData3DParamsV1具体参考表3。• LoadData3DParamsV2具体参考表4。• LoadData3DParamsV2Pro具体参考表5。上述结构体参数定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。表3LoadData3DParamsV1结构体内参数说明参数名称含义padListpadding列表 [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 aleftTopW配置为-a。leftTopH该指令在源操作数上h维度的起点取值范围leftTopH∈[-255, 32767]。默认为0。如果padding_top aleftTopH配置为-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迭代模式。•模式0每次迭代增加卷积核窗口中的点对应在目的矩阵上往w维度方向增长。•模式1每次迭代增加滑动窗口左上坐标对应在目的矩阵上往h维度方向增长。取值范围repeatMode∈[0, 1]。默认为0。repeatTime迭代次数每一次源操作数和目的操作数的地址都会改变。取值范围repeatTime∈[1, 255]。cSize配置是否开启cSize 4b16 / cSize 8b8优化取值范围cSize∈[0, 1]。默认为0。padValuePad填充值的数值数据类型需要与src保持一致。默认为0。若不想开启padding可将padList设为全0。表4LoadData3DParamsV2结构体内参数说明参数名称含义padListpadding列表 [padding_left, padding_right, padding_top, padding_bottom]每个元素取值范围[0, 255]。默认为{0, 0, 0, 0}。l1H源操作数height取值范围l1H∈[0, 32767]。默认为0。l1H 0表示不执行搬运该接口将被视为NOP空操作。l1W源操作数width取值范围l1W∈[0, 32767]。默认为0。l1W 0表示不执行搬运该接口将被视为NOP空操作。channelSize源操作数的通道数取值范围channelSize∈[0, 65535]。默认为0。不同产品型号支持的channelSize取值不同具体请参考约束说明。注channelSize 0表示不执行搬运该接口将被视为NOP空操作。kExtension该指令在目的操作数width维度的传输长度如果不覆盖最右侧的分形对于b32类型应为8的倍数对于b16类型应为16的倍数对于b8类型应为32的倍数对于b4类型应为64的倍数覆盖的情况则任何数据类型都无倍数要求。取值范围kExtension∈[0, 65535]。默认为0。注kExtension 0表示不执行搬运该接口将被视为NOP空操作。mExtension该指令在目的操作数height维度的传输长度如果不覆盖最下侧的分形对于b4、b8、b16类型应为16的倍数b32类型无要求覆盖的情况则任何数据类型都无倍数要求。取值范围mExtension∈[0, 65535]。默认为0。注mExtension 0表示不执行搬运该接口将被视为NOP空操作。kStartPt该指令在目的操作数width维度的起点对于b32类型应为8的倍数对于b16类型应为16的倍数对于b8类型应为32的倍数对于b4类型应为64的倍数取值范围[0, 65535]。默认为0。mStartPt该指令在目的操作数height维度的起点取值范围[0, 32767]。默认为0。strideW卷积核在源操作数width维度滑动的步长取值范围strideW∈[0, 63]。默认为1。strideH卷积核在源操作数height维度滑动的步长取值范围strideH∈[0, 63]。默认为1。filterW卷积核width取值范围filterW∈[0, 255]。默认为1。注filterW0且filterSizeWfalse时表示不执行搬运该接口将被视为NOP空操作。filterH卷积核height取值范围filterH∈[0, 255]。默认为1。注filterH0且filterSizeHfalse时表示不执行搬运该接口将被视为NOP空操作。dilationFilterW卷积核width膨胀系数取值范围dilationFilterW∈[0, 255]。默认为1。dilationFilterH卷积核height膨胀系数取值范围dilationFilterH∈[0, 255]。默认为1。enTranspose是否启用转置功能对整个目标矩阵进行转置支持数据类型为bool默认为false。• true启用• false不启用不同产品型号下enTranspose的有效条件不同具体请参考约束说明。注在目的操作数的物理存储位置为L0B BufferTPosition: B2时本参数无效。enSmallK是否开启small k特性每个分形矩阵大小为16*4支持数据类型为bool默认为false。当前产品形态该特性已不再支持。padValuePad填充值的数值数据类型需要与src保持一致。若不想开启padding可将padList设为全0。默认为0。filterSizeW是否在filterW的基础上将卷积核width增加256个元素。true增加false不增加。默认为false。filterSizeH是否在filterH的基础上将卷积核height增加256个元素。true增加false不增加。默认为false。fMatrixCtrl表示LoadData卷积数据搬运 v2指令从左矩阵还是右矩阵获取FeatureMap的属性描述与SetFmatrix配合使用默认值为false。当前只支持设置为false。• true从右矩阵中获取FeatureMap的属性描述• false从左矩阵中获取FeatureMap的属性描述。表5LoadData3DParamsV2Pro结构体内参数说明参数名称含义channelSize源操作数的通道数取值范围channelSize∈[0, 65535]。对于halfchannelSize除16的余数应当为04或8。对于int8_t和uint8_tchannelSize除32的余数应当为048或16。对于int4b_tchannelSize为81632N*64N*648N*6416N*6432N为正整数。enTranspose是否启用转置功能对整个目标矩阵进行转置支持数据类型为bool仅在目的TPosition为A2且源操作数为half类型时有效。默认为false。• true启用• false不启用。enSmallK是否开启small k特性每个分形矩阵大小为16*4支持数据类型为bool默认为false。注当前产品形态该特性已不再支持。filterSizeW是否在filterW的基础上将卷积核width增加256个元素。true增加false不增加。filterSizeH是否在filterH的基础上将卷积核height增加256个元素。true增加false不增加。fMatrixCtrl表示LoadData卷积数据搬运 v2指令从左矩阵还是右矩阵获取FeatureMap的属性描述与SetFmatrix配合使用当前只支持设置为false默认值为false。• true从右矩阵中获取FeatureMap的属性描述• false从左矩阵中获取FeatureMap的属性描述。extConfig组合参数uint64_t类型默认值为0extConfig ((uint64_t)mStartPt 48)| ((uint64_t)kStartPt 32)| ((uint64_t)mExtension 16)| (uint64_t)kExtension;filterConfig组合参数uint64_t类型默认值为0X10101010101filterConfig ((uint64_t)dilationFilterH 40)| ((uint64_t)dilationFilterW 32)| ((uint64_t)filterH 24)| ((uint64_t)filterW 16)| ((uint64_t)strideH 8)| (uint64_t)strideW;数据类型LoadData卷积数据搬运 v1接口Atlas 推理系列产品AI Core支持的数据类型为int8_t、uint8_t、half。Atlas 训练系列产品支持的数据类型为int8_t、uint8_t、half。LoadData卷积数据搬运 v2接口、LoadData卷积数据搬运 v2 Pro接口Ascend 950PR/Ascend 950DT支持数据类型为int8_t、uint8_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t、int32_t、uint32_t、float。Atlas A3 训练系列产品/Atlas A3 推理系列产品TPosition为A1/A2时支持数据类型为int4b_t、int8_t、uint8_t、half、bfloat16_t、int32_t、uint32_t、float。TPosition为B1/B2时支持数据类型为half、bfloat16_t、int32_t、uint32_t、float。Atlas A2 训练系列产品/Atlas A2 推理系列产品TPosition为A1/A2时支持数据类型为int4b_t、int8_t、uint8_t、half、bfloat16_t、int32_t、uint32_t、float。TPosition为B1/B2时支持数据类型为half、bfloat16_t、int32_t、uint32_t、float。Atlas 200I/500 A2 推理产品TPosition为A1/A2时支持数据类型为int4b_t、int8_t、uint8_t、half、bfloat16_t、int32_t、uint32_t、float。TPosition为B1/B2时支持数据类型为half、bfloat16_t、int32_t、uint32_t、float。Atlas 推理系列产品AI Core支持的数据类型为int4b_t、int8_t、uint8_t、half。Kirin X90产品TPosition为A1/A2时支持数据类型为int8_t、half。TPosition为B1/B2时支持数据类型为int8_t、half。返回值说明无约束说明非转置场景下L1 Buffer-L0B Buffer通路不支持。L1 Buffer-L0B Buffer通路下会自动进行转置不需要配置enTranspose此时enTranspose参数无效。针对Ascend 950PR/Ascend 950DT必须使用辅助配置接口SetLoadDataRepeat配置dstStride参数若不开启repeat模式接口内repeat相关参数使用默认构造值。针对如下产品型号Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品L1 Buffer-L0B Buffer通路不支持b4/b8类型数据转置场景下L1 Buffer-L0A Buffer通路不支持b8数据类型。当l1H/l1W/channelSize/kExtension/mExtension中的任意一个值为0时该指令不会被执行。当filterW为0且filterSizeW为false或者当filterH为0且filterSizeH为false时该指令不会被执行。当目的地址位于L0A Buffer/L0B Buffer时地址必须512字节对齐。当源地址位于L1 Buffer时地址必须32字节对齐。指令执行占用的流水为PIPE_MTE1。LoadData3DParamsV1 cSize特性的开启需要保证A1/B1中的feature map为4 channel对齐。数据连续排列顺序由目的操作数所在物理存储位置决定具体约束如下针对Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品L0A BufferTPosition: A2ZZ格式L0B BufferTPosition: B2ZN格式。针对Ascend 950PR/Ascend 950DTL0A BufferTPosition: A2NZ格式L0B BufferTPosition: B2ZN格式。LoadData3DParamsV2结构体中channelSize的取值约束如下针对Atlas 推理系列产品AI Core对于halfchannelSize可取值为4816N*164N*168对于int8_t/uint8_tchannelSize可取值为481632N*324N*328N*3216对于int4b_tchannelSize可取值为81632N*64N*648N*6416N*6432。N为正整数。针对Ascend 950PR/Ascend 950DT、Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas 200I/500 A2 推理产品、Kirin X90对于uint32_t/int32_t/floatchannelSize可取值为4N*8N*84对于half/bfloat16channelSize可取值为48N*16N*16 4N*168对于int8_t/uint8_tchannelSize可取值为481632*NN*324N*328N*3216对于int4b_tchannelSize可取值为81632N*64N*648N*6416N*6432。N为正整数。LoadData3DParamsV2结构体中enTranspose的有效条件如下针对Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品在目的操作数的物理存储位置为L0A BufferTPosition: A2且源操作数为b16/b32类型时有效。针对Ascend 950PR/Ascend 950DT在目的操作数的物理存储位置为L0A BufferTPosition: A2且源操作数为b8/b16/b32类型时有效。关键特性说明使用LoadData卷积数据搬运完成矩阵计算所需2D格式数据的搬运对于NC1HWC0格式的数据当N为1卷积核width和height为1padding为0卷积核在源操作数width维度和height维度滑动的步长为1卷积核width和height膨胀系数为1此时经过image to column展开后的数据排布可以看成矩阵计算过程中L1 Buffer上的NZ分形排布因此该场景下可以使用LoadData卷积数据搬运接口进行矩阵计算所需2D格式数据的搬运示意图如下所示非转置场景首先L1 Buffer-L0B Buffer通路不支持非转置场景而对于L1 Buffer-L0A Buffer通路根据不同的产品形态有不同的分形排布转换针对Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品LoadData卷积数据搬运会自动完成分形的变换从L1 Buffer上的NZ分形排布转换成L0A Buffer中所需的ZZ分形排布如下b16类型场景的示意图所示针对Ascend 950PR/Ascend 950DTL1 Buffer上的分形排布就是L0A Buffer中所需的NZ分形排布LoadData卷积数据搬运不会进行分形排布转换如下b16类型场景的示意图所示转置场景针对Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品LoadData卷积数据搬运仅在b16/b32数据类型下支持转置enTransposeTrue按照类型详细说明对于b16场景每个分形大小是16×16。L1 Buffer-L0A Buffer通路下转置场景下除了每个分形矩阵自身会被转置每个分形矩阵在整个二维特征图中的位置也会被转置转置示意图如下L1 Buffer-L0B Buffer通路下LoadData卷积数据搬运接口会自动完成转置不需要配置enTranspose参数enTranspose参数此时无效转置示意图如下对于b32场景每个分形大小是16×8。L1 Buffer-L0A Buffer通路下需要配置enTranspose参数来开启转置功能转置示意图如下L1 Buffer-L0B Buffer通路下LoadData卷积数据搬运接口会自动完成转置不需要配置enTranspose参数enTranspose参数此时无效转置示意图如下针对Ascend 950PR/Ascend 950DTLoadData卷积数据搬运在b8/b16/b32数据类型下均支持转置其中L1 Buffer-L0A Buffer通路通过开启enTranspose参数开启转置L1 Buffer-L0B Buffer通路下会自动完成转置不需要配置enTranspose参数enTranspose参数此时无效。下面按照类型详细说明。对于b8场景每个分形大小是16×32。L1 Buffer-L0A Buffer通路下转置场景下2个连续的16×32的分形拼接为一个32×32的方块矩阵再进行转置并拆分为2个16×32的分形转置示意图如下L1 Buffer-L0B Buffer通路下LoadData卷积数据搬运接口会自动完成转置不需要配置enTranspose参数enTranspose参数此时无效转置示意图如下对于b16场景每个分形大小是16×16。L1 Buffer-L0A Buffer通路下转置场景下除了每个分形矩阵自身会被转置每个分形矩阵在整个二维特征图中的位置也会被转置转置示意图如下L1 Buffer-L0B Buffer通路下LoadData卷积数据搬运接口会自动完成转置不需要配置enTranspose参数enTranspose参数此时无效转置示意图如下对于b32场景每个分形大小是16×8。L1 Buffer-L0A Buffer通路下转置场景示意图如下L1 Buffer-L0B Buffer通路下LoadData卷积数据搬运接口会自动完成转置不需要配置enTranspose参数enTranspose参数此时无效转置示意图如下Repeat ModeLoadData卷积数据搬运接口可以通过配置mExtension和kExtension来完成多个方向的数据块搬运我们把这里的多块数据的搬运看成一次迭代支持通过配置repeat mode能实现在M方向height或者K方向width进行repeat搬运也就是说调用一次LoadData卷积数据搬运接口可以完成多次迭代的数据搬运如下图所示其中repeatStride和repeatTime还有沿哪个方向repeat我们通过SetLoadDataRepeat配置。针对如下产品型号Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品M方向repeat示意图需要注意的是当我们调用LoadData卷积数据搬运接口在M方向进行repeat搬运时如果我们开启转置则重复过程中的所有分块矩阵将被视为一个整体大矩阵并按照我们前文所述的转置场景进行处理。以b32场景为例下图给出了在M方向进行repeat搬运时的转置示意图其中repeatMode0repeatStride2repeatTime3。K方向repeat示意图当我们调用LoadData卷积数据搬运接口在K方向进行repeat搬运时如果我们开启转置则重复过程中的所有分块矩阵也将被视为一个整体大矩阵并按照我们前文所述的转置场景进行处理。以b32场景为例下图给出了在K方向进行repeat搬运时的转置示意图其中repeatMode1repeatStride2repeatTime3。针对Ascend 950PR/Ascend 950DTM方向repeat示意图当我们调用LoadData卷积数据搬运接口在M方向进行repeat搬运时如果我们开启转置则重复过程中的所有分块矩阵将被视为一个整体大矩阵并按照我们前文所述的转置场景进行处理。以b32场景为例下图给出了在M方向进行repeat搬运时的转置示意图其中repeatMode0repeatStride2repeatTime3dstStride3。K方向repeat示意图当我们调用LoadData卷积数据搬运接口在K方向进行repeat搬运时如果我们开启转置则重复过程中的所有分块矩阵也将被视为一个整体大矩阵并按照我们前文所述的转置场景进行处理。以b32场景为例下图给出了在K方向进行repeat搬运时的转置示意图其中repeatMode1repeatStride2repeatTime3dstStride3。Feature Map、Pad属性描述寄存器设置LoadData卷积数据搬运接口具备两个特殊寄存器Feature Map属性描述和Pad属性描述寄存器作为Image to Column展开时的参数。当我们进行矩阵计算时出于高性能搬运考虑往往会从GM搬运大块数据到L1 Buffer即在L1 Buffer中缓存一块较大的数据然后通过for循环进行L1 Buffer-L0 Buffer的搬入并进行Mmad计算。当通过LoadData卷积数据搬运接口进行L1 Buffer-L0 Buffer的搬入时对于Feature Map属性和Pad属性我们通常只需要设置一次不需要反复进行设置因此我们提供了IsResetLoad3dConfig这个模板参数用于手动管理这两个属性减少反复设置带来的指令性能开销。IsResetLoad3dConfig结构定义如下struct IsResetLoad3dConfig { bool isSetFMatrix true; bool isSetPadding true; };isSetFMatrix配置为true表示在LoadData卷积数据搬运接口内部设置FeatureMap的属性描述包括l1H、l1W、padList参数介绍参考表4设置为false表示该接口传入的FeatureMap的属性描述不生效开发者需要通过SetFmatrix进行手动管理设置。isSetPadding配置为true表示在接口内部设置Pad属性描述即padValue参数参数介绍参考表4设置为false表示该接口传入的Pad属性不生效开发者需要通过SetLoadDataPaddingValue进行设置。LoadData卷积数据搬运接口数据格式说明要求输入的feature map和filter的格式是NC1HWC0其中C0是最低维度而且C0是固定值为16对于u8/s8类型为32C1C/C0。为了简化场景以下场景假设输入的feature map的channel为4即Ci4。输入feature maps在A1中的形状为Hi,Wi,Ci经过LoadData处理后在A2的数据形状为Wo*Ho, Hk*Wk*Ci。其中Wo和Ho是卷积后输出的shapeHk和Wk是filter的shape。直观地来看img2col的过程就是filter在feature map上扫过将对应feature map的数据展开成输出数据的每一行的过程。filter首先在W方向上滑动Wo步然后在H方向上走一步然后重复以上过程最终输出Wo*Ho行数据。下图中红色和黄色的数据分别代表第一行和第二行。数字表示原始输入数据filter和输出数据三者之间的关联关系。可以看到LoadData首先在输入数据的Ci维度搬运对应于00的4个数然后搬运对应于01的四个数最终这一行的大小为Hk*Wk*Ci即3*3*436个数。对应的feature map格式如下图图2feature map格式![](https://raw.gitcode.com/cann/asc-devkit/raw/4d58be33f1da028b6d716e1e6e7b8d9755ae049c/docs/api/figures/feature-map格式.png feature-map格式?utm_sourcegitcode_repo_files)对应的filter的格式如下图其中n为filter的个数可以看出维度排布为Hk,Wk,Ci,n但是需要注意的是下图的格式还需要根据Mmad中B矩阵的格式转换。图3filter的格式![](https://raw.gitcode.com/cann/asc-devkit/raw/4d58be33f1da028b6d716e1e6e7b8d9755ae049c/docs/api/figures/filter的格式.png filter的格式?utm_sourcegitcode_repo_files)实际操作中由于存储空间或者计算能力限制我们通常会将整个卷积计算分块一次只搬运并计算一小块数据。图4卷积计算分块![](https://raw.gitcode.com/cann/asc-devkit/raw/4d58be33f1da028b6d716e1e6e7b8d9755ae049c/docs/api/figures/卷积计算分块.png 卷积计算分块?utm_sourcegitcode_repo_files)对于A2的feature map来说有两种方案水平分块和垂直分块。分别对应参数中repeatMode的0和1。注下图中的分形矩阵大小为4x4实际应该为16x16对于u8/s8类型为16x32repeatMode 0时每次repeat会改变在filter窗口中读取数据点的位置然后跳到下一个C0的位置。图5repeatMode 0时的filter窗口![](https://raw.gitcode.com/cann/asc-devkit/raw/4d58be33f1da028b6d716e1e6e7b8d9755ae049c/docs/api/figures/repeatMode-0-时的filter窗口.png repeatMode-0-时的filter窗口?utm_sourcegitcode_repo_files)repeatMode 1的时候filter窗口中读取数据的位置保持不变每个repeat在feature map中前进C0个元素。图6repeatMode 1时的filter窗口![](https://raw.gitcode.com/cann/asc-devkit/raw/4d58be33f1da028b6d716e1e6e7b8d9755ae049c/docs/api/figures/repeatMode-1-时的filter窗口.png repeatMode-1-时的filter窗口?utm_sourcegitcode_repo_files)调用示例如下示例中A矩阵转置shape为[k,m]b32数据类型下GM-L1 Buffer-L0A Buffer数据排布分别是ND、NZ和ZZ。但是L1 Buffer-L0A Buffer的时候无法调用LoadDataWithTranspose指令对进行转置因为在K轴方向两个连续的分形并不能合并为一个16*16的方块示意图如下此时可以调用LoadData卷积数据搬运接口实现A矩阵转置。调用LoadData卷积数据搬运 v2接口时在写入L0A Buffer之前会先分别将A矩阵高度和宽度轴向16、8对齐接着该指令会将整个A矩阵进行转置并且每一个分形也转置最终写入到L0A Buffer的A矩阵是ZZ排布示例代码片段如下仅展示样例中的部分代码完整示例请参考load_data_l12l0样例。// LoadData卷积数据搬运 v2接口完成img2col的过程可知img2col后A矩阵高度为ho * wo根据ho和wo的计算公式代入卷积核宽度、卷积核滑动步长、卷积核膨胀系数等参数可知A矩阵的高度为CeilAlign(k, fractalShape[0])img2col后A矩阵宽度为ci * kh * kw代入kh1kw1可知A矩阵的宽度为CeilAlign(m, fractalShape[1])。最后配置loadDataParams.enTranspose true将整个A矩阵转置并且将其中每一个分形转置 // 使用LoadData卷积数据搬运接口实现NZ2ZZ AscendC::LoadData3DParamsV2T loadDataParams; // 源操作数height loadDataParams.l1H 1; // 源操作数width loadDataParams.l1W CeilAlign(k, fractalShape[0]); // 源操作数的通道数 // img2col的结果矩阵高度为ho * wo根据ho和wo的计算公式代入卷积核宽度、卷积核滑动步长、卷积核膨胀系数等参数可知ho * wo loadDataParams.l1H * loadDataParams.l1W // img2col的结果矩阵宽度为ci * kh * kw代入kh1kw1可知结果矩阵的宽度为ciloadDataParams.channelSize m loadDataParams.channelSize CeilAlign(m, fractalShape[1]); // 该指令在目的操作数width维度的传输长度如果不覆盖最右侧的分形对于half类型应为16的倍数对于int8_t/uint8_t应为32的倍数覆盖的情况则无倍数要求。 loadDataParams.kExtension CeilAlign(m, fractalShape[1]); // 该指令在目的操作数height维度的传输长度如果不覆盖最下侧的分形对于half/int8_t/uint8_t应为16的倍数覆盖的情况则无倍数要求。 loadDataParams.mExtension CeilAlign(k, fractalShape[1] * fractalNum); // 卷积核在源操作数width维度滑动的步长 loadDataParams.strideW 1; // 卷积核在源操作数height维度滑动的步长 loadDataParams.strideH 1; // 卷积核width loadDataParams.filterW 1; // 卷积核height loadDataParams.filterH 1; // 卷积核width膨胀系数 loadDataParams.dilationFilterW 1; // 卷积核height膨胀系数 loadDataParams.dilationFilterH 1; loadDataParams.filterSizeW false; loadDataParams.filterSizeH false; loadDataParams.enTranspose true; loadDataParams.fMatrixCtrl false; AscendC::LoadData(a2Local, a1Local, loadDataParams);关于如何使用LoadData卷积数据搬运进行2D数据搬运请参考load_data_l12l0样例中的对应场景。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考