LoadDataWithStride【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况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展开然后再从展开后的二维矩阵中选取指定数据块搬入对应内存位置。与LoadData卷积数据搬运接口的差异在于本接口仅支持Ascend 950PR/Ascend 950DT产品支持配置输出矩阵K轴方向偏移量dstStride的能力且必须配置该参数调用之前必须使用辅助配置接口SetLoadDataRepeatWithStride配置dstStride参数。此外相比于LoadData卷积数据搬运本接口内部不包含针对其他芯片版本的兼容性实现减少了兼容造成的额外开销性能表现有所优化。LoadDataWithStride支持的数据通路为L1 Buffer-L0A Buffer、L1 Buffer-L0B Buffer。函数原型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 LoadDataWithStride(const LocalTensorT dst, const LocalTensorT src, const LoadData3DParamsV2U loadDataParams)参数说明表1模板参数说明参数名称含义T源操作数和目的操作数的数据类型。支持的数据类型请参考数据类型。defaultConfig控制是否在接口内部设置相关属性。 IsResetLoad3dConfig类型。IsResetLoad3dConfig结构定义如下struct IsResetLoad3dConfig {bool isSetFMatrix true;bool isSetPadding true;};isSetFMatrix配置为true表示在接口内部设置FeatureMap的属性描述包括l1H、l1W、padList参数介绍参考表3设置为false表示该接口传入的FeatureMap的属性描述不生效开发者需要通过SetFmatrix进行设置。isSetPadding配置为true表示在接口内部设置Pad属性描述即padValue参数参数介绍参考表3设置为false表示该接口传入的Pad属性不生效开发者需要通过SetLoadDataPaddingValue进行设置。该参数的默认值如下constexpr IsResetLoad3dConfig IS_RESER_LOAD3D_DEFAULT_CONFIG {true, true};特性细节可参考Feature Map、Pad属性描述寄存器设置。ULoadData3DParamsV2中padValue的数据类型。当dst、src使用基础数据类型时U和dst、src的数据类型T需保持一致否则编译失败。最后一个模板参数仅用于上述数据类型检查用户无需关注。表2通用参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor。数据连续排列顺序由目的操作数所在物理存储位置决定具体约束如下• L0A Buffer(TPosition: A2)NZ格式。• L0B Buffer(TPosition: B2)ZN格式。src输入源操作数类型为LocalTensor。数据连续排列顺序由目的操作数所在物理存储位置决定L1 Buffer(TPosition: A1/B1)NC1HWC0格式。loadDataParams输入LoadData参数结构体类型为LoadData3DParamsV2具体参考表3。表3LoadData3DParamsV2结构体内参数说明参数名称含义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。对于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为正整数。注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不启用注该参数在目的操作数的物理存储位置为L0A BufferTPosition: A2且源操作数为b8/b16/b32类型时有效。在目的操作数的物理存储位置为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的属性描述。数据类型数据通路为L1 Buffer(TPosition::A1)-L0A Buffer(TPosition::A2)时支持数据类型为int8_t、uint8_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t、int32_t、uint32_t、float。数据通路为L1 Buffer(TPosition::B1)-L0B Buffer(TPosition::B2)时支持数据类型为half、bfloat16_t、int32_t、uint32_t、float。返回值说明无约束说明非转置场景下L1 Buffer-L0B Buffer通路不支持。L1 Buffer-L0B Buffer通路下会自动进行转置不需要配置enTranspose此时enTranspose参数无效。当目的地址位于L0A Buffer/L0B Buffer时地址必须512字节对齐。当源地址位于L1 Buffer时地址必须32字节对齐。必须使用辅助配置接口SetLoadDataRepeatWithStride配置dstStride参数。调用示例本接需与SetLoadDataRepeatWithStride接口配合使用展示代码示例片段// LoadDataWithStride指令完成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 矩阵转置并且将其中每一个分形转置。 AscendC::LoadData3DParamsV2T loadDataParams; // 设置loadDataParams相关参数 ... // 使用SetLoadDataRepeatWithStride接口设置LoadDataWithStride接口的repeat参数 AscendC::LoadDataRepeatParamWithStride repeatParams; repeatParams.repeatTime 1; // height/width方向上的迭代次数 repeatParams.repeatStride 1; // height/width方向上前后迭代起始位置的距离 repeatParams.repeatMode 0; // 迭代方向0迭代沿height; 1迭代沿width repeatParams.dstStride CeilDivision(m, fractalShape[0]); // 输出矩阵K轴方向偏移 AscendC::SetLoadDataRepeatWithStride(repeatParams); AscendC::LoadDataWithStride(a2Local, a1Local, loadDataParams);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考