cann/asc-devkit Conv2D接口文档(已废弃) # Conv2D废弃【免费下载链接】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 训练系列产品支持功能说明该接口废弃并将在后续版本移除请不要使用该接口。计算给定输入张量和权重张量的2-D卷积输出结果张量。Conv2D卷积层多用于图像识别使用过滤器提取图像中的特征。函数原型template typename T, typename U __aicore__ inline void Conv2D(const LocalTensorT dst, const LocalTensorU featureMap, const LocalTensorU weight, Conv2dParams conv2dParams, Conv2dTilling tilling)入参中的tiling结构需要通过如下切分方案计算接口来获取template typename T __aicore__ inline Conv2dTilling GetConv2dTiling(Conv2dParams conv2dParams)参数说明表1接口参数说明参数名称类型说明dst输出目的操作数。Atlas 训练系列产品支持的TPosition为CO1CO2Atlas 推理系列产品AI Core支持的TPosition为CO1CO2结果中有效张量格式为[Cout/16, Ho, Wo, 16]大小为Cout * Ho * WoHo与Wo可以根据其他数据计算得出。Ho floor((H pad_top pad_bottom - dilation_h * (Kh - 1) - 1) / stride_h 1)Wo floor((W pad_left pad_right - dilation_w * (Kw - 1) - 1) / stride_w 1)由于硬件要求Ho*Wo需为16倍数在申请dst Tensor时shape应向上16对齐实际申请shape大小应为Cout * round_howo。round_howo ceil(Ho * Wo /16) * 16。featureMap输入输入张量Tensor的TPosition为A1。输入张量feature_map的形状格式是[C1, H, W, C0]。C1*C0为输入的channel数要求如下•当feature_map的数据类型为half时C016。•当feature_map的数据类型为int8_t时C032。• C1取值范围[1,4]输入的channel的范围[163264128]。H为高取值范围[1,40]。W为宽取值范围[1,40]。weight输入卷积核权重张量Tensor的TPosition为B1。卷积核张量weight的形状格式是[C1, Kh, Kw, Cout, C0]。C1*C0为输入的channel数对于C0要求如下•当feature_map的数据类型为half时C016。•当feature_map的数据类型为int8_t时C032。• C1取值范围[1,4]。• kernel_shape输入的channel数需与fm_shape输入的channel数保持一致。Cout为卷积核数目取值范围[163264128]Cout必须为16的倍数。Kh为卷积核高值的范围[1,5]。Kw表示卷积核宽值的范围[1,5]。conv2dParams输入输入矩阵形状等状态参数类型为Conv2dParams。结构体具体定义为struct Conv2dParams {uint32_t imgShape[CONV2D_IMG_SIZE]; // [H, W]uint32_t kernelShapeIn[CONV2D_KERNEL_SIZE]; // [Kh, Kw]uint32_t stride[CONV2D_STRIDE]; // [stride_h, stride_w]uint32_t cin; // cin C0 * C1;uint32_t cout;uint32_t padList[CONV2D_PAD]; // [pad_left, pad_right, pad_top, pad_bottom]uint32_t dilation[CONV2D_DILATION]; // [dilation_h, dilation_w]uint32_t initY;uint32_t partialSum;};tilling输入分形控制参数类型为Conv2dTilling。结构体具体定义为struct Conv2dTilling {const uint32_t blockSize 16; // # M block size is always 16LoopMode loopMode LoopMode::MODE_NM;uint32_t c0Size 32;uint32_t dTypeSize 1;uint32_t strideH 0;uint32_t strideW 0;uint32_t dilationH 0;uint32_t dilationW 0;uint32_t hi 0;uint32_t wi 0;uint32_t ho 0;uint32_t wo 0;uint32_t height 0;uint32_t width 0;uint32_t howo 0;uint32_t mNum 0;uint32_t nNum 0;uint32_t kNum 0;uint32_t mBlockNum 0;uint32_t kBlockNum 0;uint32_t nBlockNum 0;uint32_t roundM 0;uint32_t roundN 0;uint32_t roundK 0;uint32_t mTileBlock 0;uint32_t nTileBlock 0;uint32_t kTileBlock 0;uint32_t mIterNum 0;uint32_t nIterNum 0;uint32_t kIterNum 0;uint32_t mTileNums 0;bool mHasTail false;bool nHasTail false;bool kHasTail false;uint32_t kTailBlock 0;uint32_t mTailBlock 0;uint32_t nTailBlock 0;uint32_t mTailNums 0;};表2Conv2DParams结构体内参数说明参数名称类型说明imgShapevectorint输入张量feature_map的形状格式是[H, W]。• H为高取值范围[1,40]。• W为宽取值范围[1,40]。kernelShapevectorint卷积核张量weight的形状格式是[Kh, Kw]。• Kh为高取值范围[1,5]。• Kw为宽取值范围[1,5]。stridevectorint卷积步长格式是[stride_h, stride_w]。• stride_h表示步长高值的范围[1,4]。• stride_w表示步长宽值的范围[1,4]。cinint分形排布参数Cin C1 * C0Cin为输入的channel数C1取值范围[1,4]。•当feature_map的数据类型为float时C08。输入的channel的范围[8162432]。•当feature_map的数据类型为half时C016。输入的channel的范围[16324864]。•当feature_map的数据类型为int8_t时C032。输入的channel的范围[326496128]。coutintCout为卷积核数目取值范围[163264128]Cout必须为16的倍数。padListvectorintpadding行数/列数格式是[pad_left, pad_right, pad_top, pad_bottom]。• pad_left为feature_map左侧pad列数范围[0,4]。pad_right为feature_map右侧pad列数范围[0,4]。• pad_top为feature_map顶部pad行数范围[0,4]。• pad_bottom为feature_map底部pad行数范围[0,4]。dilationvectorint空洞卷积参数格式[dilation_h, dilation_w]。• dilation_h为空洞高范围[1,4]。• dilation_w为空洞宽范围[1,4]。膨胀后卷积核宽为dilation_w * (Kw - 1) 1高为dilation_h * (Kh - 1) 1。initYuint32_t表示dst是否需要初始化。•取值0不使用biasL0C Buffer需要初始化dst初始矩阵保存有之前结果新计算结果会累加前一次Conv2D计算结果。•取值1不使用biasL0C Buffer不需要初始化dst初始矩阵中数据无意义计算结果直接覆盖dst中的数据。partialSumuint32_t当dst参数所在的TPosition为CO2时通过该参数控制计算结果是否搬出。•取值0搬出计算结果•取值1不搬出计算结果可以进行后续计算表3Conv2dTilling结构体内参数说明参数名称类型说明blockSizeuint32_t固定值恒为16一个维度内存放的元素个数。loopModeLoopMode遍历模式结构体具体定义为enum class LoopMode {MODE_NM 0,MODE_MN 1,MODE_KM 2,MODE_KN 3};c0Sizeuint32_t一个block的字节长度范围[16或者32]。dtypeSizeuint32_t传入的数据类型的字节长度范围[1, 2]。strideHuint32_t卷积步长-高范围:[1,4]。strideWuint32_t卷积步长-宽范围:[1,4]。dilationHuint32_t空洞卷积参数-高范围[1,4]。dilationWuint32_t空洞卷积参数-宽范围[1,4]。hiuint32_tfeature_map形状-高范围[1,40]。wiuint32_tfeature_map形状-宽范围[1,40]。houint32_tfeature_map形状-高范围[1,40]。wouint32_tfeature_map形状-宽范围[1,40]。heightuint32_tweight形状-高[1,5]。widthuint32_tweight形状-宽[1,5]。howouint32_tfeature_map形状大小为ho * wo。mNumuint32_tM轴等效数据长度参数值范围[1,4096]。nNumuint32_tN轴等效数据长度参数值范围[1,4096]。kNumuint32_tK轴等效数据长度参数值范围[1,4096]。roundMuint32_tM轴等效数据长度参数值且以blockSize为倍数向上取整范围[1,4096]。roundNuint32_tN轴等效数据长度参数值且以blockSize为倍数向上取整范围[1,4096]。roundKuint32_tK轴等效数据长度参数值且以c0Size为倍数向上取整范围[1,4096]。mBlockNumuint32_tM轴Block个数mBlockNum mNum / blockSize范围[1,4096]。nBlockNumuint32_tN轴Block个数nBlockNum nNum / blockSize范围[1,4096]。kBlockNumuint32_tK轴Block个数kBlockNum kNum / blockSize范围[1,4096]。mIterNumuint32_t遍历M轴维度数量范围[1,4096]。nIterNumuint32_t遍历N轴维度数量范围[1,4096]。kIterNumuint32_t遍历K轴维度数量范围[1,4096]。mTileBlockuint32_tM轴切分块个数范围[1,4096]。nTileBlockuint32_tN轴切分块个数范围[1,4096]。kTileBlockuint32_tK轴切分块个数范围[1,4096]。kTailBlockuint32_tK轴尾块个数范围[1,4096]。mTailBlockuint32_tM轴尾块个数范围[1,4096]。nTailBlockuint32_tN轴尾块个数范围[1,4096]。kHasTailboolK轴是否存在尾块。mHasTailboolM轴是否存在尾块。nHasTailboolN轴是否存在尾块。mTileNumsuint32_tM轴切分块个数的长度范围[1,4096]。mTailNumsuint32_tM轴尾块个数的长度范围[1,4096]。数据类型表4feature_map、weight和dst的数据类型组合feature_map.dtypeweight.dtypedst.dtypeint8_tint8_tint32_thalfhalffloathalfhalfhalf返回值说明无约束说明该接口当前不支持WKw并且HKh的场景其将产生不可预期的结果。操作数地址对齐要求请参见通用地址对齐约束。调用示例该接口已废弃请使用Mmad接口替代。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考