资讯详情

CANN opbase L0 层 Pad 算子接口全解:基于 paddings 的多维零填充实战指南

📅 2026/9/19 5:58:53 | 华诺云谱 👁 阅读
CANN opbase L0 层 Pad 算子接口全解:基于 paddings 的多维零填充实战指南
CANN opbase L0 层 Pad 算子接口全解基于 paddings 的多维零填充实战指南【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbasePad 是 CANN opbase 基础框架库 L0 层基础张量操作接口之一用于按 paddings 指定的各维度填充大小对输入 tensor 进行补边填充填充值为 0。本文围绕 L0/Pad.md 展开完整讲解该接口的产品支持范围、函数原型、参数约束、返回值语义与调用方式并结合仓库中的接口注册、执行器机制与单元测试用例帮助读者在实际算子开发中正确使用 l0op::Pad 完成补维、对齐与边界扩展等场景。接口定位L0 层基础张量操作在 CANN opbase 框架中L0 接口是面向张量基础操作的轻量级算子封装统一位于namespace l0op命名空间之下。从 基础张量操作接口列表 可以看到L0 层与 Pad 并列的基础操作还包括 Cast、Contiguous、IsNullptr、ReFormat、Reshape、Slice、TransData、Transpose、ViewCopy 等它们共同构成算子开发中最常用的张量形态变换工具箱。根据 docs/README.md 对 L0 接口命名规则的说明L0 接口名为${op_type}${format}${dtype}的组合形式其中${op_type}为算子名${format}为算子输入/输出数据格式${dtype}为算子输入/输出数据类型。例如l0op::AddNd表示 Add 算子输入均按 ND 计算l0op::MatMulNzFp162Fp16表示 MatMul 算子按 NZ 格式计算且输入输出均为 fp16。Pad 接口同样遵循这一规则具体可用的接口名以aclnn_kernels/pad.h中的声明为准该声明位置在 1_opdev_api_introduction.md 中标注完整接口清单可参见 0_opdev_api_list.md。功能说明Pad 的核心功能为将输入 tensor 按照 paddings 的大小对各个维度进行填充填充值为 0。从参数语义可以推断paddings 形状为[self.dim, 2]即对输入 tensor 的每一个维度分别指定“该维度起始侧头部的填充大小”与“该维度末尾侧尾部的填充大小”因此输出 tensor 在第 i 维的长度可以推断为output.shape[i] self.shape[i] paddings[i][0] paddings[i][1]其中paddings[i][0]表示第 i 维起始侧的 0 填充行数paddings[i][1]表示第 i 维末尾侧的 0 填充行数。整个过程只改变张量形状与边界内容不改变原始数据区域的取值。该能力在算子开发中的典型用途包括为卷积、池化等窗口类算子补充边界将不同形状的张量统一补零到目标尺寸以满足合并计算或广播需求在自定义算子内部实现“补维”后再进行后续形态变换。产品支持情况Pad 接口在当前仓库所标注的产品支持情况如下产品支持情况Ascend 950PR / Ascend 950DT不支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品支持Atlas 训练系列产品支持函数原型const aclTensor* Pad(const aclTensor* self, const aclTensor* paddings, aclOpExecutor* executor)该函数返回指向填充结果的aclTensor*指针。三个参数均为输入其中executor负责承载算子计算流程由上层执行器框架创建并传入。参数说明参数输入/输出说明self输入待填充的输入 tensor数据类型支持 FLOAT16、FLOAT、INT16、UINT16、INT32、INT64、BFLOAT16、INT8。数据格式支持 ND。paddings输入输入 tensor 每个维度被填充的大小形状为 [self.dim, 2]数据类型支持 INT32、INT64。数据格式支持 ND。executor输入op 执行器包含了算子计算流程。需要注意数据类型的产品适用范围限制BFLOAT16 和 INT8 仅适用于如下产品Atlas A2 训练系列产品 / Atlas A2 推理系列产品Atlas A3 训练系列产品 / Atlas A3 推理系列产品即在 Atlas 910 训练系列产品与 Atlas 推理系列产品上使用 Pad 时输入self的数据类型应限定为 FLOAT16、FLOAT、INT16、UINT16、INT32、INT64 之一不应使用 BFLOAT16 与 INT8。关于paddings的构造它是一个形状为[self.dim, 2]的张量或可转换为张量的 int 数组每行两个值分别对应某一维头部与尾部的填充量。self.dim必须与输入 tensor 的维度数一致paddings 的值应满足非负的整数语义。executor参数的语义为“op 执行器包含了算子计算流程”。在仓库的 L0 接口调用实践中执行器通常通过CREATE_EXECUTOR()宏创建宏定义说明见 CREATE_EXECUTOR.md返回 RAII 风格的唯一指针对象在测试代码 test_acl_op_api.cpp 中可以看到标准用法auto uniqueExecutor CREATE_EXECUTOR(); aclOpExecutor* executor nullptr; uniqueExecutor.ReleaseTo(executor);返回值说明Pad 返回被填充了 0 的 tensor即一个数据类型与输入self保持一致、各维度长度按照 paddings 扩展后的新 tensor。其返回类型仍为const aclTensor*由调用方持有并管理生命周期。约束说明原文档明确标注该接口的约束为无。即在数据类型需同时满足 self 与 paddings 各自的类型限制与数据格式ND满足前述参数说明的前提下对张量维度数、填充量大小等没有额外限制使用相对灵活。调用示例原文档给出的最小调用方式如下// 调用l0op::Pad对self进行补维 l0op::Pad(self, paddings, executor);结合仓库中 L0 接口的完整调用惯例参考 Cast.md 中展示的执行器创建与结果校验模式以及 test_acl_op_api.cpp 中的CREATE_EXECUTOR()用法一个可直接落地的完整示例可以组织为// 1. 创建op执行器 auto uniqueExecutor CREATE_EXECUTOR(); // 2. 构造输入tensor与paddings示意self为2维张量shape为[3, 4] // paddings形状为[2, 2]例如第0维头部填充1、尾部填充1 // 第1维头部填充0、尾部填充2则输出shape为[5, 6] // aclTensor* self ...; // aclTensor* paddings ...; // 3. 调用l0op::Pad对self进行补维填充值为0 auto padRes l0op::Pad(self, paddings, uniqueExecutor.get()); CHECK_RET(padRes ! nullptr, ACLNN_ERR_PARAM_NULLPTR);其中CHECK_RET为仓库常见的返回值校验宏用于在算子开发中拦截空指针等异常结果。与框架底层的印证执行器与张量封装Pad 作为 L0 接口其运行依赖 opbase 框架的两类基础能力一是 aclTensor 张量封装。self、paddings以及返回值均为const aclTensor*张量的 shape、dtype、format 等信息由aclTensor统一携带Pad 执行时从中读取各维度长度并据此计算填充后的输出形状。仓库中张量 API 的声明与实现集中在 acl_meta.h、kernel_tensor.cpp 等位置测试中通过aclCreateTensor(shape.data(), shape.size(), aclDataType::ACL_FLOAT, ...)创建 ND 格式张量的方式可作为构造参考。二是 aclOpExecutor 执行器。executor参数承载算子的完整计算流程L0 接口将算子参数绑定到执行器后统一分发执行。执行器相关的对外声明可参见 op_executor.h其实现位于 op_executor.cpp而执行器的创建入口aclnnInit/aclnnFinalize声明在 aclnn_base.h是算子运行前的初始化前提。此外从 1_opdev_api_introduction.md 中的接口清单可以看到Pad 与 Cast、Contiguous、Reshape、Slice、Transpose 等同属 L0 层张量操作声明位于aclnn_kernels/pad.h。这意味着 Pad 的实际对外形态可能按“算子类型 格式 数据类型”生成多个重载如 ND 格式下的浮点与整型版本具体可用接口名以安装产物中该头文件的实际声明为准。相关接口与延伸阅读Pad 常与 L0 层的其他形态变换接口配合使用构成完整的张量预处理链路Cast张量数据类型转换可与 Pad 搭配完成类型对齐后再填充Contiguous将非连续张量转换为连续存储Reshape张量形状重排Slice张量切片与 Pad 互为逆操作语义一个裁剪、一个填充Transpose维度置换。进一步了解 L0 层整体设计可阅读 1_opdev_api_introduction.md 与 basic_l0_Interface.md若需在完整算子开发工程中使用 Pad可参考 docs/README.md 中关于 L0 接口命名规则与调用规范的说明。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。