尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GridUnnormal 算子深度解析:CANN ops-cv 中 GridSample 链路的坐标反归一化实现与 GE 图模式调用
GridUnnormal 算子深度解析CANN ops-cv 中 GridSample 链路的坐标反归一化实现与 GE 图模式调用【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv导读GridUnnormal 是 CANN ops-cv 开源算子库中服务于 GridSample 链路的坐标反归一化unnormalize算子它以归一化采样坐标grid与同形状的尺寸辅助张量assist为输入逐元素输出pos_base的小数偏移diff与整数采样位置position为后续双线性/双三次采样的取点与插值提供基础。本文以 image/grid_unnormal/README.md 为骨架结合算子原型、Infershape、Tiling、Kernel 与测试代码系统讲解其计算公式、参数约束、产品支持范围、源码级实现原理以及 GE IR 图模式调用样例帮助开发者理解并正确使用这一 GE 图内部算子。产品支持情况GridUnnormal 算子在不同硬件产品上的支持情况如下以仓库 README 为准产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品√从源码结构看算子 Kernel 与 Tiling 均位于arch35目录op_kernel/arch35、op_host/arch35对应 DAV_3510 架构即 Ascend 950 系列的寄存器编程实现这与 README 中 Ascend 950 系列“√”的支持状态一致。功能说明GridSample 链路中的坐标反归一化算子定位GridUnnormal 是 GridSample 链路中的坐标反归一化算子处理的是把归一化采样坐标还原为输入图像上的真实浮点采样位置这一环节。其输入包含两部分grid归一化采样坐标元素取值通常落在[-1, 1]区间assist与grid同 shape 的尺寸辅助张量每元素对应输入在某维上的尺寸值例如图像的高或宽。算子输出两个结果pos_base的小数部分diff以及pos_base的下取整结果positionint32 整数采样位置两者可直接作为后续插值采样的基础。计算公式对每个元素独立计算t (grid 1) * 0.5 pos_base align_corners ? t * (assist - 1) : t * assist - 0.5 position floor(pos_base) diff pos_base - floor(pos_base)其中floor按向负无穷取整语义执行不能用向零截断trunc替代。这一约束在 Kernel 实现中有直接体现grid_unnormal.h 中定义了kCastF32ToI32Floor其RoundMode显式指定为CAST_FLOOR保证负数坐标按 floor 语义下取整。两种align_corners模式分别对应 GridSample 语义中的两种坐标对齐约定align_corners true输入输出张量角点像素中心对齐坐标映射为t * (assist - 1)align_corners false默认不做角点对齐坐标映射为t * assist - 0.5。数值验证golden 实现golden.py 提供了两套参考实现用于交叉验证_grid_unnormal_golden_compute采用与 README 等价的代数变形pos_base ((grid 1) * assist - 1) / 2_grid_unnormal_third_party_compute则严格按 README 公式逐字实现pos_base normalized * assist - 0.5并通过 torch 的torch.floor计算下取整结果。测试容差配置中diff输出使用cross_check标准float32/float16 均为 L1 级别position输出使用binary_equal整数逐位相等标准。参数说明参数名输入/输出/属性描述数据类型数据格式grid输入归一化采样坐标。支持 4D 静态 shape、动态 shape 和编译期未知 rankrank 确定时必须为 4 且末维为 2支持总元素数为 0 的空 Tensor。float16、float32NDassist输入每元素对应的输入尺寸辅助值。必须与gridshape、dtype 完全一致不支持广播rank 确定时必须为 4 且末维为 2。float16、float32NDdiff输出pos_base的小数部分shape 与grid一致dtype 与grid一致。float16、float32NDposition输出pos_base的下取整结果shape 与grid一致。int32NDalign_corners属性可选属性默认false。为true时按t * (assist - 1)计算为false时按t * assist - 0.5计算。bool-上述参数定义在算子原型 grid_unnormal_proto.h 中通过REG_OP(GridUnnormal)声明与 grid_unnormal_def.cpp 中的 OpDef 注册完全一致输入输出均为REQUIREDalign_corners为OPTIONAL且默认false。dtype 组合由 2 行 dtype 表描述grid/assist/diff {fp16, fp32}position {int32, int32}即 diff 跟随 grid 的 dtypeposition 固定为 int32。约束说明grid与assist的 shape、dtype 必须一致不支持广播rank 确定时grid与assist必须为 4D Tensorshape 为[batch, height, width, 2]末维 2 表示坐标分量仅支持 ND 格式非连续 Tensor 作为用户可见接口不涉及diff的 dtype 跟随gridposition固定为 int32中间计算使用 fp32fp16 输入会提升到 fp32 计算diff再回写为 fp16总元素数为 0 的空 Tensor 支持空进空出设备侧不访问数据非有限输入NaN/Inf以及floor(pos_base)超出 int32 表示范围不属于本算子支持域本算子为 GE 图内部算子不提供 aclnn、torch、TensorFlow、ONNX、Caffe 对外接口。这些约束在 Infershape 与 Tiling 代码中均有对应检查grid_unnormal_infershape.cpp 会校验 rank 必须为 4、末维必须为 2未知维度除外、grid 与 assist 的已知维度必须逐维相等grid_unnormal_tiling_arch35.cpp 在编译期进一步校验存储 shape 完全一致且两个输入 dtype 必须相等L150-L156。golden.py 的注释也明确指出该 OpDef 为 aclnn_exclude未交付 torch_npu 绑定也未交付 TensorFlow/ONNX 解析器与融合 pass。动态 shape 支持细节编译期未知 rank 通过-2标记表示Infershape 中IsUnknownRank检查shape-GetDimNum() 1 shape-GetDim(0) -2时直接放行动态 shape 场景下末维-1UNKNOWN_DIM被允许只要不等于 2 之外的其他已知值Tiling 阶段再基于实际存储 shape 计算总元素数算子声明中DynamicRankSupportFlag(true)、DynamicShapeSupportFlag(true)、DynamicCompileStaticFlag(true)grid_unnormal_def.cpp确认了上述能力的编译期开启状态。调用说明GE IR 图模式调用GridUnnormal 作为 GE 图内部算子通过构图方式在图中使用。README 给出的调用方式为调用方式调用样例说明图模式调用test_geir_grid_unnormal通过本目录的算子原型构图方式调用 GridUnnormal 算子。调用样例核心流程test_geir_grid_unnormal.cpp 演示了完整的 GE IR 图模式调用流程关键步骤包括创建算子节点op::GridUnnormal(gridUnnormal_1)基于 grid_unnormal_proto.h 生成的op::GridUnnormal类构造输入占位节点op::Data(grid).set_attr_index(0)与op::Data(assist).set_attr_index(1)通过update_input_desc_x声明 FORMAT_ND、DT_FLOAT 的 4D 描述绑定输入gridUnnormal.set_input_grid(grid)、gridUnnormal.set_input_assist(assist)设置属性gridUnnormal.set_attr_align_corners(false)声明输出描述update_output_desc_diffDT_FLOAT与update_output_desc_positionDT_INT32构图执行graph.SetInputs(inputs).SetOutputs(outputs)后经Session-AddGraph(graphId, graph)与Session-RunGraph(graphId, input, output)完成执行其中全局配置ge.exec.deviceId0、ge.graphRunMode1。样例数值推演样例配置为align_corners falsegrid与assist均为DT_FLOAT、shape[1, 6, 5, 2]grid 每元素填0.3f、assist 每元素填5.0f期望输出t (0.3 1) * 0.5 0.65 pos_base 0.65 * 5 - 0.5 2.75 position floor(2.75) 2 (int32) diff 2.75 - 2 0.75即diff输出全为 0.75floatposition输出全为 2int32。这个手算推演与 golden.py 的 torch 参考实现可以相互印证可直接作为自测基准。源码实现原理Kernel 实现RegBase 寄存器编程范式grid_unnormal.cpp 是 kernel 入口采用 ops-cv 非模板extern C约定dtype 由DTYPE_GRID编译期实例化fp16/fp32 各一份align_corners走 tilingdata 运行时分支。入口通过REGISTER_TILING_DEFAULT注册默认 Tiling随后调用NsGridUnnormal::GridUnnormalKernelDTYPE_GRID完成初始化与计算。grid_unnormal.h 中GridUnnormalKernelT的实现要点数据搬运GM↔UB 使用TQueDataCopyPadCopyIn/CopyOut每个核心按coreStart_/coreLen_处理属于自己的元素区间双缓冲kBufNum 2隐藏搬运与计算延迟向量计算在__VEC_SCOPE__内用 MicroAPI 寄存器算子RegTensor/MaskReg/Adds/Muls/Mul/Sub/Cast完成逐元素计算。t (grid 1) * 0.5通过Adds加 1 再Muls乘 0.5 实现align_corners为 true 时先Adds(aReg, -1)再Mul为 false 时先Mul再Adds(-0.5)模板参数AlignCorners编译期展开统一 fp32 中间计算fp16 输入由LoadOneTensorForDtypeT载入即升为 fp32StoreOneTensorForDtypeT存回时再降为 fp16——与 README中间计算使用 fp32的约束对应floor 语义保证position使用Castint32_t, float, kCastF32ToI32FloorRoundMode 为CAST_FLOOR保证向负无穷下取整随后通过Castfloat, int32_t还原浮点 floor 值做Sub得到diff寄存器位宽向量寄存器 256Bfp32 通道每拍 64 元素kFp32PerLoop 64repeatTimes按 64 元素对齐循环。Tiling 实现扁平化分核 UB 切分grid_unnormal_tiling_arch35.cpp 实现 host 侧 Tiling策略为纯 elementwise按总元素数扁平分核通过PlatformAscendC获取 AIV 核数coreNum与 UB 大小ubSizeGetPlatformInfo校验存储 shape 与 dtype 后计算总元素数totalGetInputInfo依据 UB 容量与每元素字节数BytesPerElem两个输入 diff 输出按 dtype 字节计、position 按 int32 计均乘双缓冲数 2计算ubFactor并向下对齐到 64 元素整数倍CalcUbFactor预留 8KB UB 余量按perCore ceil(total / coreNum)向上取整均分到各核usedCores收窄为实际需要的核数并设置SetBlockDimFillNormalTiling空 Tensortotal 0走 FillEmptyTilingtotalNum0、blockDim1、workspace 为 0实现空进空出、设备侧不访问数据。TilingData 结构定义在 grid_unnormal_tiling_data.htotalNum总元素数、perCoreNum每核元素数、ubFactor单次 UB tile 元素数、alignCorners0/1 分支标志。算子配置与编译产物op_host/config/ascend950/grid_unnormal_binary.json 描述了 ascend950 平台预编译产物的规格为 fp16 与 fp32 两种 dtype 各生成一份二进制GridUnnormal_1d9cf9915315ae9f8e867b978473f984与GridUnnormal_f7372211154d6f1cad01274230b0fdf9输入输出 shape 均为-2编译期未知 rank动态 shape 入口align_corners属性在编译产物中值为 null运行时决定。同目录下的grid_unnormal_simplified_key.ini提供简化 key 配置。测试验证仓库为 GridUnnormal 提供了 host 侧与 kernel 侧两层单元测试Infershape/Tiling 单测test_grid_unnormal_infershape.cpp 验证形状与 dtype 推导逻辑test_grid_unnormal_tiling.cpp 验证 Tiling 数据与分核结果Kernel 单测test_grid_unnormal.cpp 配合 gen_data.py 生成输入数据、compare_data.py 与 golden 结果比对验证设备侧实际计算结果golden 参考golden.py 提供 torch 参考实现float32/float16 输出按 L1 交叉校验、int32 输出按逐位相等校验。总结GridUnnormal 作为 GridSample 链路的坐标反归一化算子以两输入grid/assist、两输出diff/position、一个可选属性align_corners的简洁接口在 Ascend 950arch35平台上以统一 fp32 中间精度、CAST_FLOOR下取整语义、扁平化分核 Tiling 与 RegBase 寄存器编程实现了高效且行为可预期的坐标还原。理解其计算公式与约束4D、末维为 2、shape/dtype 一致、ND 格式、floor 语义是正确使用的前提如需在图中集成该算子可参考 test_geir_grid_unnormal.cpp 的 GE IR 构图方式并通过 golden.py 的参考实现做数值验证。【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

BlendFaceBgPartTwo 算子深度解析:基于 CANN ops-cv 的 Alpha 人脸背景融合实现与图模式调用

BlendFaceBgPartTwo 算子深度解析:基于 CANN ops-cv 的 Alpha 人脸背景融合实现与图模式调用

BlendFaceBgPartTwo 算子深度解析:基于 CANN ops-cv 的 Alpha 人脸背景融合实现与图模式调用 【免费下载链接】ops-cv 本项目是CANN提供的图像处理、目标检测相关的算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-cv 本…

📅 2026/9/18 13:30:21
tsParticles Curl Noise 路径插件实战:用旋度噪声为粒子生成流体般丝滑运动

tsParticles Curl Noise 路径插件实战:用旋度噪声为粒子生成流体般丝滑运动

tsParticles Curl Noise 路径插件实战:用旋度噪声为粒子生成流体般丝滑运动 【免费下载链接】tsparticles tsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animate…

📅 2026/9/18 13:25:21
IntelliJ IDEA 四层命名重构:根目录、项目名、模块名与包名

IntelliJ IDEA 四层命名重构:根目录、项目名、模块名与包名

1. 先把四层命名关系理清,不然改一个炸三个IntelliJ IDEA 里的"改名"之所以让很多人头疼,根本原因在于:项目根目录名、项目名、模块名、包名是四套独立的命名体系,它们在磁盘、IDE 配置、构建脚本里各存一份&#xff0c…

📅 2026/9/18 13:25:21
MORE NEWS

更多资讯

📰

斐讯N1 Armbian 内核怎么选?写入速度翻20倍的性能优化完整指南

斐讯N1 Armbian 内核怎么选?写入速度翻20倍的性能优化完整指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, …

📰

PyPTO 张量运算与转置实战指南:pypto.matmul 维度约束、广播、reshape 与 `.T` 陷阱全解析

PyPTO 张量运算与转置实战指南:pypto.matmul 维度约束、广播、reshape 与 .T 陷阱全解析 【免费下载链接】pypto-gym PyPTO-Gym 是基于 PyPTO 编程框架构建的算子与模型样例仓库 项目地址: https://gitcode.com/cann/pypto-gym 本篇技术指南基于 tensor-ops.…

📰

Web Starter Kit 完全解析:Google 官方多端网站脚手架的 10 大核心功能

Web Starter Kit 完全解析:Google 官方多端网站脚手架的 10 大核心功能 【免费下载链接】web-starter-kit Web Starter Kit - a workflow for multi-device websites 项目地址: https://gitcode.com/gh_mirrors/webs/web-starter-kit Web Starter Kit&#x…

📰

Excel函数公式大全实战:分类应用与常见坑

简介:这份Excel函数公式大全及举例(PDF)是一份面向办公人员、数据分析初学者及需要系统掌握Excel函数的用户的实用速查手册,帮助解决函数种类多、记不住、不会套用等常见问题。资源共1个PDF文件,整体大小约1.33MB&…

📰

DeepSeek多层次注意力机制破解教学效果评估难题的完整技术方案

简介:一份面向教育技术研究者、AI产品经理及教学评估方案设计人员的DeepSeek教学效果智能评估完整技术方案。文档基于多层次注意力机制,围绕学习过程数据采集、时序结构化存储、注意力权重计算、学习专注度提取、难点定位及能力成长轨迹可视化等核心环节…

📰

cwc-workshops harness目录深挖:probes、replay与verify.py的实现原理

cwc-workshops harness目录深挖:probes、replay与verify.py的实现原理 【免费下载链接】cwc-workshops 项目地址: https://gitcode.com/GitHub_Trending/cw/cwc-workshops 🎮 cwc-workshops 的 agent-battle 工作坊用 Claude 托管 Agent 驱动 Mi…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬