PyPTO vf.reduce_min 寄存器最小值归约算子详解:从掩码筛选到索引回传的完整实现
人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载导读vf.reduce_min是 PyPTO 向量函数库Vector Functionvf中用于寄存器内in-register最小值归约的核心原语对应硬件vcmin全寄存器归约与vcgmindatablock 粒度归约指令。它能够在单个寄存器内完成掩码筛选 → 求最小值 → 回写结果与首个最小值索引的全流程是 softmax、min-pooling、动态规划等需要跨通道/跨行求极值的算子中高频使用的基础构件。阅读本文后你将掌握reduce_min的语义、参数与边界行为NaN、±0、空掩码并能在 Ascend 950PR/950DT 上直接落地 FP32 与 INT64 两种可运行示例。产品支持情况产品形态支持状态Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品不支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品不支持从代码仓库的平台配置也能印证这一点vcgmin指令能力仅出现在 Ascend950DT 与 Ascend950PR 的模拟平台配置如Ascend950DT_9572.ini、Ascend950PR_9579.ini中而 A2/A3 系列配置中未声明该指令与文档的产品支持情况完全一致。功能说明reg_tensor最小值归约的执行语义为遍历源寄存器src中所有被谓词寄存器preg选中的有效元素求出其中的最小值将最小值写入目标寄存器的第一个元素dst[0]将第一个最小值所在的下标写入dst[1]其余元素全部置零。归约过程中值与索引的保存方式如下图所示其中索引语义需要注意当存在多个相等的最小值时保存的是首次出现下标最小的那个索引例如src [5, 3, 7, 3]时dst[0] 3、dst[1] 1。函数原型reduce_min(src, preg, datablock: bool False, merge_mode: Optional[MergeMode] None)该接口在源码中的声明位于 python/pypto_pro/language/_vf_api.py#L628-L650docstring 中明确标注其对应硬件指令为vcmin / vcgmin并将行为形式化为dstReg_0 min_{i ∈ active} srcReg_i参数说明参数输入/输出说明src输入源操作数reg_tensor。源操作数src与目的操作数dst的数据类型保持一致。支持的数据类型为DT_INT16、DT_UINT16、DT_FP16、DT_INT32、DT_UINT32、DT_FP32、DT_INT64、DT_UINT64。preg输入mask_reg 谓词掩码寄存器。当所有元素均不参与计算mask 为空时将该数据类型的最大值写入dst[0]。datablock输入可选决定接口工作模式。True时按 datablock 粒度归约对应vcgmin指令默认False对应vcmin指令。当datablockTrue时每个 datablock 独立归约32 位宽DT_INT32、DT_UINT32、DT_FP32类型每 16 个元素为一个 datablock16 位宽DT_INT16、DT_UINT16、DT_FP16类型每 32 个元素为一个 datablock各 datablock 分别求最小值并将结果依次写入dst的最低位。merge_mode输入可选对应 MergeMode 类型。-pypto_pro.language.MergeMode.ZEROING默认preg未筛选的元素在dst中置 0。-pypto_pro.language.MergeMode.MERGING当前不支持。参数底层实现源码佐证在 IR 层vf.reduce_min注册为VFOp类别算子携带dst、src、mask三个操作数以及datablockbool与merge_modeint两个属性见 framework/src/interface/ir/op/vf_ops.cpp#L247-L255REGISTER_OP(vf.reduce_min) .set_op_category(VFOp) .set_description(Min reduction across all lanes (vcmin/vcgmin)) .add_argument(dst, Destination register) .add_argument(src, Source register) .add_argument(mask, Mask register) .set_attrbool(datablock) .set_attrint(merge_mode) .f_deduce_type(DeduceVFFromDstArg);其中f_deduce_type(DeduceVFFromDstArg)表明目标寄存器dst的数据类型由源寄存器src推导而来二者保持一致这正是src 与 dst 类型一致约束的机制来源。后端生成阶段该算子注册到 CCE 后端发射器见 framework/src/interface/pypto_pro/backend/backend_cce_vf_ops.cpp#L5836由后端将datablock属性翻译为vcmin或vcgmin两条不同的硬件指令。在 Python 前端解析层reduce_min被注册为单源操作数调用见 python/pypto_pro/language/parser/_call_parser.py#L512确保调用时参数个数与类型检查与声明一致。约束说明datablockTrue时支持的数据类型收窄为DT_INT16、DT_UINT16、DT_FP16、DT_INT32、DT_UINT32、DT_FP32。即DT_INT64、DT_UINT64仅支持全寄存器归约模式datablockFalse。返回值说明返回目标 reg_tensor支持的数据类型与src一致归约结果写入第一个元素dst[0]索引写入dst[1]。需特别关注的边界行为多最小值并列存在多个最小值时将第一个下标最小最小值的索引保存在dst[1]中。NaN 输入如果输入数据存在 NaN将该数据类型的 NaN 写入dst[0]并将第一个 NaN 的索引保存在dst[1]中。符号零min(-0, 0) -0即负零在比较中优先于正零。空掩码当preg未选中任何元素时将对应数据类型的最大值如DT_FP32的Inf、DT_INT32的INT32_MAX写入dst[0]。调用示例基本调用示例DT_FP32以下示例展示完整的加载 → 归约 → 存储链路通过vf.create_mask生成全 1 掩码vf.load_align将 tile 数据对齐加载为寄存器reduce_min求最小值再vf.store_align写回 tileimport os import pypto_pro.language as pl import torch import torch_npu pl.vector_function def example_vf(src_tile, dst_tile): preg_all vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_FP32) src0 vf.load_align(src_tile, 0) min0 vf.reduce_min(src0, preg_all) vf.store_align(dst_tile, min0, preg_all) pl.jit() def example_kernel( a: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_FP32], out: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_FP32], ): tf pl.TileType(shape[1, 64], dtypepl.DT_FP32, target_memorypl.MemorySpace.Vec) in_a_grp pl.make_tile_group(typetf, addrs0x0, mutex_ids[0]) in_a in_a_grp.current() t_out_grp pl.make_tile_group(typetf, addrs0x100, mutex_ids[1]) t_out t_out_grp.current() with pl.section_vector(): pl.load(in_a, a, [0, 0]) example_vf(in_a, t_out) pl.store(out, t_out, [0, 0]) def test_example(): device_id int(os.environ.get(TILE_FWK_DEVICE_ID, 0)) device fnpu:{device_id} core_nums 1 torch.npu.set_device(device) a torch.randn([1, 64], devicedevice, dtypetorch.float32) out torch.empty([1, 64], devicedevice, dtypetorch.float32) example_kernelNone, core_nums torch.npu.synchronize() torch.testing.assert_close(out[0, 0], torch.min(a), rtol1e-5, atol1e-5) if __name__ __main__: test_example() print(PASSED)示例中的关键点out[0, 0]对应归约结果dst[0]与torch.min(a)做数值比对rtol/atol1e-5验证最小值语义设备号通过环境变量TILE_FWK_DEVICE_ID指定默认 0核数为 1输入[1, 64]的 tile 恰好对应 64 个 FP32 元素的寄存器归约注意reduce_min只使用dst[0]与dst[1]其余位置按ZEROING语义被置零。INT64 数据类型示例DT_INT64是reduce_min的特色能力同类归约接口如reduce_sum/reduce_max亦支持注意此类型不能与datablockTrue组合使用import os import pypto_pro.language as pl import torch import torch_npu pl.vector_function def example_vf_int64(src_tile, dst_tile): preg vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_INT64) reg_a vf.load_align(src_tile, 0) reg_out vf.reduce_min(reg_a, preg) vf.store_align(dst_tile, reg_out, preg) pl.jit() def example_kernel_int64( a: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_INT64], out: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_INT64], ): tf pl.TileType(shape[1, 32], dtypepl.DT_INT64, target_memorypl.MemorySpace.Vec) in_a_grp pl.make_tile_group(typetf, addrs0, mutex_ids[0]) in_a in_a_grp.current() t_out_grp pl.make_tile_group(typetf, addrs256, mutex_ids[1]) t_out t_out_grp.current() with pl.section_vector(): pl.load(in_a, a, [0, 0]) example_vf_int64(in_a, t_out) pl.store(out, t_out, [0, 0]) def test_example_int64(): device_id int(os.environ.get(TILE_FWK_DEVICE_ID, 0)) device fnpu:{device_id} core_nums 1 torch.npu.set_device(device) a torch.randint(-100, 100, [1, 32], devicedevice, dtypetorch.int64) out torch.zeros([1, 32], devicedevice, dtypetorch.int64) example_kernel_int64None, core_nums torch.npu.synchronize() torch.testing.assert_close(out[0, 0], torch.min(a), rtol0, atol0) if __name__ __main__: test_example_int64() print(PASSED)INT64 示例的两个细节tile 形状为[1, 32]64 位类型每个元素占 8 字节32 个元素正好对应一个寄存器的数据宽度torch.testing.assert_close使用rtol0, atol0精确比对因为整数最小值归约结果必须是位级精确的。与相邻归约接口的对照reduce_min属于 PyPTO 归约族reduction 目录与以下接口共享相同的签名与掩码语义便于对比记忆vf.reduce_max求最大值对应vcmax / vcgmaxdatablockTrue时每 datablock 求最大值写入dst最低位vf.reduce_sum求和对应vcadd / vcgadd注意其累加顺序与浮点舍入相关实际应用时可通过文档中的reduce_sum_accum_order图理解累加次序对结果精度的影响。三者均以dst[0]承载归约值且datablockTrue时的数据类型约束一致16 位宽类型每 32 元素一个 datablock32 位宽类型每 16 元素一个 datablock。典型应用场景与注意事项应用场景在矢量计算中reduce_min适合将按行/按组求极小值操作下沉到寄存器级完成例如softmax / log-softmax 中先求最大值reduce_max再做指数归一化最大值更利于数值稳定最小值归约则常用于 min-max 归一化的下界计算池化层 min-pooling 的列/行窗口约简动态规划或图算法中跨状态维度的最小值松弛。注意事项掩码是语义核心preg决定参与归约的元素集合务必与src的数据类型匹配生成create_mask的dtype参数与src一致空掩码、NaN、±0 三类边界行为需在算子正确性验证中单独用例覆盖datablockTrue模式下输出是多个datablock 结果依次写入dst低位此时dst不再是单值语义读取结果时需要按 16/32 元素步长解析当前仅在 Ascend 950PR/950DT 上可用跨产品移植前需先核对目标平台的指令集支持。赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐PyPTO pypto.argmin:多维张量归约索引算子的 API 约束与源码实现详解PyPTO pypto.argmin:多维张量归约索引算子的 API 约束与源码实现详解 pypto.argmin 是 PyPTOParallel Tenso人工智能编译器模型编译高性能计算深度学习CANNPyPTO pypto.argmaxTile 级最大值索引归约接口的语义、约束与源码实现解析PyPTO pypto.argmaxTile 级最大值索引归约接口的语义、约束与源码实现解析 本篇基于 PyPTOParallel Tensor/Tile人工智能编译器模型编译高性能计算深度学习CANNPyAsc 算子开发实战asc.language.basic.reduce_min 最小值归约 API 详解PyAsc 算子开发实战asc.language.basic.reduce_min 最小值归约 API 详解 在昇腾 AI 处理器的向量算子开发中从一批数编译器编程语言人工智能CANN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Front-End Checklist 实战:把链接 PDF 控制在 60 MB 以内,保住索引与排名

Front-End Checklist 实战:把链接 PDF 控制在 60 MB 以内,保住索引与排名

【免费下载链接】Front-End-Checklist 🗂 The essential checklist for modern web development, for humans and AI agents 项目地址: https://gitcode.com/gh_mirrors/fr/Front-End-Checklist 点击查看 免费下载 本文基于 Front-End Checklist 仓库中…

2026/9/20 3:34:23 阅读更多 →
基于 AI Gateway + Azure Functions 构建 Foundry Agent 的统一 PDP 治理边界:ADR-0026 决策模式与参考实现解析

基于 AI Gateway + Azure Functions 构建 Foundry Agent 的统一 PDP 治理边界:ADR-0026 决策模式与参考实现解析

人工智能AI AgentAI 安全治理策略引擎Agent 沙箱认证鉴权 【免费下载链接】agent-governance-toolkit AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. Covers 10/10 …

2026/9/21 8:11:27 阅读更多 →
PeekPili播放器三内核解析:MPV、MDK、EXO硬解与流畅度调优实战

PeekPili播放器三内核解析:MPV、MDK、EXO硬解与流畅度调优实战

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

2026/9/21 8:10:02 阅读更多 →

最新新闻

企业网站做电脑营销避坑指南:选哪家好别只看价格,看这套设计规范

企业网站做电脑营销避坑指南:选哪家好别只看价格,看这套设计规范

企业网站做电脑营销避坑指南:选哪家好别只看价格,看这套设计规范 改个需求建站公司拖一周,这种憋屈事谁没经历过?很多老板找企业网站做电脑营销,问得最多的一句话就是“哪家好”。其实,网站好不好用,营销转不转化,核心不在你付了多少钱,而在前端代码写得够不够规范,设计逻辑是否支撑你的业务目标。…

2026/9/21 8:00:00 阅读更多 →
做品管圈网站哪家好?3步避开被黑挂马陷阱

做品管圈网站哪家好?3步避开被黑挂马陷阱

做品管圈网站哪家好?3步避开被黑挂马陷阱 网站上线三天,后台突然多了个奇怪的脚本,页面弹出一堆博彩广告,SEO排名一夜清零。如果你正面临这种“网站被黑挂马不知道怎么办”的噩梦,先别慌着删库重装。很多站长在找做品管圈网站哪家好时,只盯着价格和功能,却忽略了最底层的代码安全与架构选型。今天咱们不聊虚的,…

2026/9/21 7:44:43 阅读更多 →
Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」

Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」

AI 应用前端 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用…

2026/9/21 7:41:44 阅读更多 →
gatsby-source-graphql 插件全解析:将任意第三方 GraphQL API 缝合进 Gatsby 数据层

gatsby-source-graphql 插件全解析:将任意第三方 GraphQL API 缝合进 Gatsby 数据层

前端静态站点Web框架 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby 点击查看 免费下载 本篇技术指南以 gatsby-source-graphql 插件的 CHANGELOG 版…

2026/9/21 7:41:44 阅读更多 →
Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案

Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案

Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案 【免费下载链接】lightweight-charts Performant financial charts built with HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/li/lightweight-charts 本指南以 Lightweig…

2026/9/21 7:41:44 阅读更多 →
FoundationDB 存储基准测试上 RAM Disk:mako_storage_bench.sh 在 okteto 开发 Pod 上的 tmpfs 实践指南

FoundationDB 存储基准测试上 RAM Disk:mako_storage_bench.sh 在 okteto 开发 Pod 上的 tmpfs 实践指南

分布式数据库KV存储数据库后端 【免费下载链接】foundationdb FoundationDB - the open source, distributed, transactional key-value store 项目地址: https://gitcode.com/gh_mirrors/fo/foundationdb 点击查看 免费下载 mako_storage_bench.sh 是 FoundationD…

2026/9/21 7:41:44 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →