news 2026/10/16 6:20:04

asc-devkit 中 Conv3DBackpropInput Tiling 的 SetStride 接口解析:从调用示例到 Stride 校验与 Shape 推导

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
asc-devkit 中 Conv3DBackpropInput Tiling 的 SetStride 接口解析:从调用示例到 Stride 校验与 Shape 推导
  • 人工智能
  • 深度学习
  • 算子库
  • CANN
  • Ascend

【免费下载链接】asc-devkit

本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。

项目地址:https://gitcode.com/cann/asc-devkit
点击查看免费下载

导读

本文聚焦 asc-devkit 开源仓库中 3D 卷积反向传播(Conv3DBackpropInput,又称 Conv3DTranspose / deconvolution)Tiling 阶段的核心参数设置接口SetStride。文章以 SetStride.md 文档为骨架,结合仓库中 Tiling 基类实现、Tiling 派生实现 与 单元测试,完整讲解该接口的函数原型、参数语义、取值范围校验、底层存储结构,以及它在完整 Tiling 流程中的调用位置与作用。读完本文,读者可以准确使用SetStride配置 Conv3DBackpropInput 算子的步长,并理解 Stride 参数如何参与输出 Shape 推导、backprop padding 计算与 Tiling 数据生成。

一、接口概览:函数原型与参数语义

SetStride是 asc-devkit 中ConvBackpropApi命名空间下Conv3DBpInputTiling类提供的 Tiling 参数设置接口,用于设置 3D 卷积正向过程中的步长(Stride)信息。其函数原型为:

void SetStride(int64_t strideD, int64_t strideH, int64_t strideW)

参数说明如下表所示:

参数名输入/输出描述
strideD输入卷积正向过程中 Depth(深度)方向 Stride 的大小
strideH输入卷积正向过程中 Height(高度)方向 Stride 的大小
strideW输入卷积正向过程中 Width(宽度)方向 Stride 的大小

返回值:无(void)。

该接口本身无额外约束(原文档"约束说明"为"无"),但 Stride 取值会经过 CheckAttrs 等 Tiling 参数校验逻辑的检查,具体取值范围与限制见下文第三节。

1.1 接口在类体系中的位置

SetStride声明于 conv3d_bp_input_tiling_base.h,属于Conv3DBpInputTilingBase公共接口的一部分。该类还提供了与之配套的参数设置接口:

  • SetWeightShape(cout, cin, d, h, w):设置卷积核 Shape;
  • SetInputShape(n, c, d, h, w):设置输入特征图 Shape(同时会把算子类型标记为kConv3DBackpropInput);
  • SetGradOutputShape(n, c, d, h, w):设置反向传播梯度输出 Shape;
  • SetPadding(padFront, padBack, padUp, padDown, padLeft, padRight):设置正向卷积 Padding;
  • SetDilation(dilationD, dilationH, dilationW):设置膨胀系数;
  • SetOutputPadding(outputPadD, outputPadH, outputPadW):设置输出 Padding(仅 Conv3DTranspose 场景可用)。

派生类Conv3DBpInputTiling在 conv3d_bp_input_tiling.h 中继承该接口,并在GetTiling/Compute流程中消费这些参数。

1.2 底层存储:stride 落入 attrInfo 结构

从源码实现看,SetStride的实质是将三个步长参数写入 Tiling 基类的attrInfo(Conv3DBpAttr结构体,定义于 conv3d_bp_tiling_base.h):

void Conv3DBpInputTilingBase::SetStride(int64_t strideD, int64_t strideH, int64_t strideW) { this->attrInfo.strideH = strideH; this->attrInfo.strideW = strideW; this->attrInfo.strideD = strideD; }

Conv3DBpAttr中 stride 相关字段默认值为1:

int64_t strideD = 1; int64_t strideH = 1; int64_t strideW = 1;

也就是说,即使不调用SetStride,Tiling 流程也会按 stride 均为 1 的默认值进行 Shape 推导与 Tiling 计算;显式调用SetStride则用于覆盖默认值。

二、调用示例与完整使用流程

原文档给出的调用示例如下:

auto ascendcPlatform = platform_ascendc::PlatformAscendCManager::GetInstance(); ConvBackpropApi::Conv3DBpInputTiling conv3DBpDxTiling(*ascendcPlatform); conv3DBpDxTiling.SetStride(strideD, strideH, strideW);

其中platform_ascendc::PlatformAscendCManager::GetInstance()获取昇腾平台信息单例,Conv3DBpInputTiling的构造函数会读取实际 SoC 的 L1/L0A/L0B/L0C/UB 等内存容量,供后续 Tiling 分块计算使用(见 conv3d_bp_input_tiling_base.cpp)。

2.1 完整的 Tiling 配置序列

SetStride通常与 Shape、Padding、Dilation 等设置接口配合使用,最终调用GetTiling生成 Tiling 数据。仓库单元测试 test_conv3d_backprop_input_api_tiling_func.cpp 给出了典型的配置序列:

Conv3DBpInputTiling conv3dDx(*ascendcPlatform); conv3dDx.SetWeightShape(512, 512, 1, 1, 1); conv3dDx.SetInputShape(1, 512, 5, 32, 32); conv3dDx.SetGradOutputShape(1, 512, 5, 32, 32); conv3dDx.SetDilation(1, 1, 1); conv3dDx.SetStride(256, 256, 256); // 非法取值,CheckAttrs 应返回 false EXPECT_EQ(false, conv3dDx.CheckAttrs()); conv3dDx.SetStride(1, 1, 1); // 恢复合法取值 conv3dDx.SetPadding(256, 256, 0, 0, 0, 0); EXPECT_EQ(false, conv3dDx.CheckPadRange());

而在网络级测试 test_conv3d_backprop_input_api_tiling_network.cpp 中,一个合法的完整流程如下:

conv3dDx.SetWeightShape(3, 64, 3, 3, 3); conv3dDx.SetInputShape(16, 64, 22, 130, 130); conv3dDx.SetGradOutputShape(16, 3, 20, 128, 128); conv3dDx.SetStride(1, 1, 1); // ... SetPadding / SetDilation 等 int64_t ret1 = conv3dDx.GetTiling(tilingData);

2.2 GetTiling 的返回值语义

GetTiling返回int64_t:成功返回0,参数校验或 Tiling 计算失败返回-1(见 conv3d_bp_input_tiling.cpp)。调用方应检查该返回值以判断 Tiling 是否生成成功。

三、Stride 的取值范围与校验规则

虽然SetStride接口本身不设约束,但生成的 Stride 值会在Compute()→CheckInputParam()中被严格校验。校验分两个层级:

3.1 基类层级的通用校验(CheckInputAttr)

conv3d_bp_input_tiling_base.cpp 中要求 stride 必须为正数:

if (this->attrInfo.strideH <= 0 || this->attrInfo.strideW <= 0 || this->attrInfo.strideD <= 0) { TILING_LOG_ERROR("Illegal attrs have set: strideH=%ld, strideW=%ld, strideD=%ld, which must > 0.", ...); return false; }

单元测试 Input_Attr_Check 验证了strideH = 0时CheckInputAttr返回false。

3.2 派生类层级的范围校验(CheckAttrs)

派生类 conv3d_bp_input_tiling.cpp 中CheckAttrs对 stride 施加更严格的取值范围约束:

参数支持范围依据
strideH[1, 63]DIM_LOW=1、STRIDES_DIM_HW_UP=63
strideW[1, 63]DIM_LOW=1、STRIDES_DIM_HW_UP=63
strideD[1, 255]DIM_LOW=1、STRIDES_DIM_DEPTH_UP=255

取值范围常量定义于 conv3d_bp_tiling_util.h:

const int32_t DIM_LOW = 1; const int32_t STRIDES_DIM_HW_UP = 63; const int32_t STRIDES_DIM_DEPTH_UP = 255;

此外CheckAttrs还要求strideD不大于卷积核深度orgkD(stride_d > kernel_d时直接报错),这是从 3D 反卷积的滑动语义出发的硬性限制。测试用例 Invalid_attrs 中SetStride(256, 256, 256)正是由于超出上述范围而使CheckAttrs返回false。

3.3 Stride 与其他参数的联动约束

CheckOutputHeight(conv3d_bp_input_tiling.cpp)要求:

mod((fmapHPadding - filterHDilation), strideH) <= padDown

即高度方向加 padding 后的特征图尺寸与膨胀后卷积核尺寸之差,对strideH取模的结果不能超过padDown,否则输出高度无法整除步长。这体现了 stride 必须与 padding、dilation、kernel size 协同满足整除约束。

四、Stride 在 Tiling 计算中的核心作用

Stride 一旦写入attrInfo,将在 Tiling 计算的多处被消费,是反卷积 Shape 推导与 backprop padding 计算的基石。

4.1 参与输出 Shape 反推(InferShape)

对于 Conv3DTranspose 场景(未调用SetInputShape时opType_为kConv3DTranspose),InferShape(conv3d_bp_input_tiling.cpp)利用 stride 反推出输入特征图尺寸:

int64_t di = (shapeInfo.orgDo - 1) * attrInfo.strideD - attrInfo.padFront - attrInfo.padBack + attrInfo.dilationD * (shapeInfo.orgkD - 1) + attrInfo.outputPadD + 1; int64_t hi = (shapeInfo.orgHo - 1) * attrInfo.strideH - attrInfo.padUp - attrInfo.padDown + attrInfo.dilationH * (shapeInfo.orgkH - 1) + attrInfo.outputPadH + 1; int64_t wi = (shapeInfo.orgWo - 1) * attrInfo.strideW - attrInfo.padLeft - attrInfo.padRight + attrInfo.dilationW * (shapeInfo.orgkW - 1) + attrInfo.outputPadW + 1;

4.2 参与 Shape 一致性校验(CheckCalPads)

在常规 Conv3DBackpropInput 场景下,CheckCalPads(conv3d_bp_input_tiling.cpp)用 stride 按正向卷积公式推导期望的输出尺寸,并与SetGradOutputShape设置的梯度输出 Shape 比对:

int64_t doExpect = (shapeInfo.orgDi + attrInfo.padFront + attrInfo.padBack - filterDDilation) / attrInfo.strideD + 1; int64_t hoExpect = (shapeInfo.orgHi + attrInfo.padUp + attrInfo.padDown - filterHDilation) / attrInfo.strideH + 1; int64_t woExpect = (shapeInfo.orgWi + attrInfo.padLeft + attrInfo.padRight - filterWDilation) / attrInfo.strideW + 1;

若推导出的(doExpect, hoExpect, woExpect)与用户设置的梯度输出 Shape 不一致,Tiling 直接返回失败。因此调用SetStride时,stride 取值必须与输入/输出 Shape、kernel、padding、dilation 整体自洽。

4.3 参与 backprop padding 计算

反卷积的"反向 padding"由 CalModifyBackpropPadD 与 CalModifyBackpropPadHW 计算,其中大量使用 stride:

// 尾端反向 padding 公式(H/W 同理) int64_t padTailAfter = CalBackpropPadAfter(shapeInfo.orgDi, shapeInfo.orgDo, attrInfo.strideD, attrInfo.padFront); // 等价于 inputDim - outputDim * stride + pad

计算得到的backpropPadHead/Tail/Up/Down/Left/Right会随最终 Tiling 数据下发到算子侧,用于控制梯度累加时各维度的裁剪范围。

4.4 参与 Kernel 侧 Tiling 分块决策

Stride 还会影响算子侧的分块与访存策略:

  • SetSingleCoreInfo(conv3d_bp_input_tiling.cpp)使用attrInfo.strideH/attrInfo.strideD计算houtCopyLine、doutCopyLine等拷贝行数,进而评估 L2 Cache 占用是否超过经验阈值;
  • CalFmapH(conv3d_bp_input_tiling.cpp)中hoExpand = (orgHo - 1) * strideH + 1用于约束 M 方向可展开的高度;
  • SetInitOutput(conv3d_bp_input_tiling.cpp)中doModulo、hoModulo用 stride 取模,决定是否需要初始化输出(initOutputFlag)。

4.5 写入最终 Tiling 数据

Tiling 数据生成阶段,SetFinalTiling会把 stride 原样写入 Tiling 结构体,供算子侧 kernel 读取:

tiling.conv3DDxTiling.set_strideH(this->attrInfo.strideH); tiling.conv3DDxTiling.set_strideW(this->attrInfo.strideW); tiling.conv3DDxTiling.set_strideD(this->attrInfo.strideD);

对应代码见 conv3d_bp_input_tiling_base.cpp。同时PrintTilingData会通过日志输出strideH/strideW/strideD供调试定位(conv3d_bp_input_tiling_base.cpp)。

五、实践要点与常见错误

综合文档、源码与测试,使用SetStride时有以下几个实践要点:

  1. 调用顺序:建议在SetWeightShape/SetInputShape/SetGradOutputShape之后、GetTiling之前调用SetStride,确保校验阶段能拿到完整的 Shape 上下文。基类SetGroup的注释也提示"应在设置 Shape 之后调用"(conv3d_bp_input_tiling_base.cpp),Stride 同理。

  2. 取值范围:H/W 方向限制在[1, 63],D 方向限制在[1, 255],且strideD <= kernelD。超过范围时CheckAttrs返回false,GetTiling返回-1。

  3. Shape 自洽:stride 必须与 input/gradOutput Shape、kernel、padding、dilation 满足 4.2 节的正向卷积公式,否则CheckCalPads校验失败。在确定 stride 前,可先用公式outSize = (inSize + padBefore + padAfter - dilation*(k-1) - 1) / stride + 1预推输出尺寸。

  4. Conv3DTranspose 场景:若使用 Conv3DTranspose(不调用SetInputShape),SetStride与SetOutputPadding、SetDilation共同决定InferShape反推出的输入尺寸,且CheckTransposeOutputtingRange要求outputPad严格小于同维度的 stride 或 dilation。

  5. 调试手段:开启 Tiling 日志(如测试文件中的#define ENABLE_TILING_DEBUG)后,PrintTilingData会输出 stride、padding、backprop pad 等全部关键参数,便于定位参数错误。

六、相关代码路径索引

以下是本文引用的核心文件,便于读者深入阅读:

文件说明
docs/zh/api/SIMD-API/adv_api/convolution_compute/Conv3DBackpropInput_Tiling/SetStride.mdSetStride 接口文档(本文主体来源)
include/adv_api/conv_backprop/conv3d_bp_input_tiling_base.hSetStride 等公共接口声明
include/adv_api/conv_backprop/conv3d_bp_input_tiling.hConv3DBpInputTiling 派生类声明
include/adv_api/conv_backprop/conv3d_bp_tiling_base.hattrInfo/shapeInfo 结构定义
impl/adv_api/tiling/conv_backprop/conv3d_bp_input_tiling_base.cppSetStride 实现与通用参数校验
impl/adv_api/tiling/conv_backprop/conv3d_bp_input_tiling.cppstride 校验、Shape 推导、Tiling 计算
impl/adv_api/tiling/conv_backprop/conv3d_bp_tiling_util.hstride 取值范围等常量定义
tests/api/adv_api/tiling/conv_backprop/test_conv3d_backprop_input_api_tiling_func.cpp功能级单元测试(含非法 stride 校验)
tests/api/adv_api/tiling/conv_backprop/test_conv3d_backprop_input_api_tiling_network.cpp网络级集成测试(含完整调用序列)

总结

SetStride是 asc-devkit 中 Conv3DBackpropInput / Conv3DTranspose Tiling 配置链上不可或缺的一环:它通过attrInfo结构将strideD/strideH/strideW注入 Tiling 计算流程,驱动输出 Shape 推导、backprop padding 计算与核内分块决策,并最终随Conv3DBackpropInputTilingData下发到算子侧。使用该接口时需特别注意 H/W 方向[1, 63]、D 方向[1, 255]且不超过 kernel 深度的取值范围限制,以及 stride 与 Shape、padding、dilation 之间的整除自洽约束——这些规则均有源码校验逻辑与单元测试背书,可在 conv3d_bp_input_tiling.cpp 与 test_conv3d_backprop_input_api_tiling_func.cpp 中直接验证。

  • 人工智能
  • 深度学习
  • 算子库
  • CANN
  • Ascend

【免费下载链接】asc-devkit

本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。

项目地址:https://gitcode.com/cann/asc-devkit
点击查看免费下载
上一篇:PostHog Web Analytics 架构与开发指南:从前端 Tiles 到 HogQL 查询与 Sessions 表
下一篇:Flipper Zero Sub-GHz 完全指南:SUB 文件格式、频率限制与信号分析实战

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 6:19:00

PharmaPy 干法制粒二次开发教程(16):细粉占比与 CQA 工艺窗口——把 CQA/CPP 链成模型,扫描 SCF×间隙×辊速定位 QbD 设计空间

PharmaPy 干法制粒二次开发教程&#xff08;16&#xff09;&#xff1a;细粉占比与 CQA 工艺窗口——把 CQA/CPP 链成模型&#xff0c;扫描 SCF间隙辊速定位 QbD 设计空间版本声明块 工具/软件&#xff1a;本项目二次开发的 CQA/CPP 扫描函数&#xff08;本系列二次开发示例&am…

作者头像 李华
网站建设 2026/10/16 6:18:46

双节锂电池主动均衡系统设计:MP2642GR-Z与TM4C1299NCZAD协同方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 6:16:15

Unity WebGL构建报错unityLinker.exe与IL2cpp.exe排查全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 6:16:09

Apollo-11 复现工程:AGC 模拟器与 DSKY 交互实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 6:10:44

LinkSwift 网盘直链下载脚本完整指南:九大网盘免费解析直链

LinkSwift 网盘直链下载脚本完整指南&#xff1a;九大网盘免费解析直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

作者头像 李华