新闻详情

新闻详情

首页 / 资讯中心 / 详情

oil-gas-ops-prospect昇腾算子Tiling切分实战:UB预算、32B对齐与核间均分一文讲透

发布时间:2026/10/1 21:12:32来源:尧图网络
oil-gas-ops-prospect昇腾算子Tiling切分实战:UB预算、32B对齐与核间均分一文讲透
oil-gas-ops-prospect昇腾算子Tiling切分实战UB预算、32B对齐与核间均分一文讲透【免费下载链接】oil-gas-ops-prospect面向油气勘探oil gas exploration领域的昇腾自定义算子库。仓名即 oil-gas-ops油气算子 prospect勘探目标面向地震成像、全波形反演等勘探计算场景项目地址: https://gitcode.com/cann/oil-gas-ops-prospectoil-gas-ops-prospect是面向油气勘探场景的昇腾自定义算子库覆盖地震成像、全波形反演等计算场景。本文带你读懂它的 tiling 切分算法设计如何用UB 预算算出单拍 tile 上限、为什么坚持32B 对齐、以及核间均分如何保证每个元素恰好被一个 AIV 核处理一次——这是写出高性能昇腾算子的三块基石。一、Tiling 是什么为什么算子要先切分在昇腾 NPU 上一个算子任务通常由几十到上百个 AI 核心AIV/Cube并行完成。Tiling切分就是host 侧在算子执行前把大张量拆成小块并规划好哪些核干哪一段的过程。切分得好核与核之间不抢数据、不重不漏切分得不好就会出现空转核、地址不对齐导致的性能腰斩甚至精度问题。oil-gas-ops-prospect库中的 4 个算子可在 manifest.tsv 中查看全部算子清单算子类型切分策略complex_mul复数逐点乘一维元素均分 双缓冲complex_mul_grad复数乘反向同上复用公共算法fused_bias_softmax高阶 Softmax按行均分大核/小核分档fused_softmax_gradSoftmax 反向VEC/MIX 路径选择 行切分一个有意思的工程细节这 4 个算子的切分核心都被抽成了不依赖 CANN 平台头的纯函数好处是单元测试在没有 NPU 卡的机器上也能直接跑逐行验证算法正确性。二、UB 预算3464 这个数是怎么算出来的以complex_mul为例。UBUnified Buffer统一缓冲是 AI 核心的片上高速内存是算子性能的油箱。910B 的 AIV 核心 UB 为 192KB而项目里只取176KB 作为预算给 tiling 传递和系统开销留出余量预算定义og_elementwise_tiling.h 中UB_BUDGET_BYTES 176 * 1024槽位系数complex_mul_tiling_core.h 中UB_SLOT_FACTOR 13为什么是13 份这来自 kernel 侧的方案 C多路拼接 double buffer入队缓冲 inQue : depth 2 × 4 路 8 份 出队缓冲 outQue : depth 2 × 2 路 4 份 计算暂存 tmp : 1 份 ───────────────────────────── 合计 13 份 tileUB 里同时存活 13 份同样大小的 tile于是单拍上限为TILE_FLOATS_CAP 176KB ÷ (13 × 4B) ≈ 3464 个 float 再按 32B 对齐向下取整注意complex_mul_grad走同一套算法唯一差别就是声明自己的槽位系数。这种公共算法 每算子只声明系数的复用方式避免了 host 侧切分代码在每个算子里复制一遍。小 tensor 也有讲究当总元素数小于一拍时tile 会收缩到刚好覆盖但绝不低于对齐粒度大 tensor 则直接吃满上限。这套逻辑在PickTileFloats中实现og_elementwise_tiling.h。三、32B 对齐DataCopy 的搬运红线昇腾的DataCopy/DataCopyPad等搬运指令要求地址和长度按32 字节对齐否则走慢速路径甚至报错。项目的处理非常克制fp32 下ALIGN_FLOATS 832B ÷ 4B见 og_elementwise_tiling.hfp16/bf16 下对齐元素数为 1632B ÷ 2B见 fused_softmax_grad_tiling_core.h对齐方向分两种各有用途函数方向用途AlignDown向下取整tile 上限、小 tensor 收缩保证不超 UBAlignUp/padS、padD向上取整行宽 padding保证搬运完整 32B 块fused_bias_softmax中的ComputePadding函数fused_bias_softmax_tiling_core.h就是典型把行宽width补齐到 32B 整数倍得到对齐后行宽padLineNum与填充数paddingNum。一个容易踩的坑是fused_softmax_grad的 MIX 路径当 MNK 三个维度恰好相等时硬件的 CFG_NORM 迭代会写出 NaN项目的解法是把 K 再垫 16 个元素走已验证的对齐路径fused_softmax_grad_tiling_core.h。这种对齐不仅是性能问题还可能是正确性问题的案例值得新手记住。四、核间均分每个元素恰好被处理一次切分的终极目标所有核的处理区间无重叠、无空洞地恰好铺满整个张量。kernel 侧的均分逻辑非常简洁og_elementwise_kernel.hper ceil(总元素数 ÷ 核数)再向上对齐到 8 的倍数 start 核编号 × per len min(per, 总元素数 − start) // 越界核拿到 len 0直接返回每核的起点start天然是per的倍数而per又是 832B的倍数所以每核起始地址自动满足 32B 对齐——对齐与均分在这里是同一个动作完成的。这套不变量不是靠看一眼代码觉得对而是被单元测试穷举验证的test_complex_mul_tiling.cpp 中的ExpectExactCoverage会对 0、7、8、100、320 等刁钻的 total × 1/2/8/40 核数组合逐元素断言被恰好处理 1 次LargeShapesAreFullyCovered用真实地震 shape1×1×192×320×320 19,660,800 元素校验区间紧邻、覆盖总和等于总数退化输入负数、0 核、空张量也各有断言兜底对新手来说每个元素恰好被一个核处理一次这句话值得贴在墙上它是所有切分算法的验收标准。五、进阶行切分、大核小核与路径选择元素级均分之外另外两个 Softmax 算子展示了更精细的切分思路1️⃣fused_bias_softmax按行均分 大核小核分档Softmax 只能按行最后一个维度独立计算所以切分单位是行而非元素。切分流程先用 UB 预算算出每拍最多能装几行(UB − 32K Softmax 预留) ÷ 每行字节数。每行字节数按入队张量 ×2双缓冲预取 计算中转 1 份计价公式见ComputeMaxByteLinefused_bias_softmax_tiling_core.h行均分到核totalLine ÷ aivNum每核一份余数行分给大核各多处理 1 行ComputeRowSplit避免尾核空转核数取每核一行 tile、尽量 1 拍的最少核数——因为小 payload 用满 48 个 AIV 会让 Softmax 变成启动开销主导反而比原生实现还慢2️⃣fused_softmax_grad先选路径再谈切分它的 tiling key 直接决定 kernel 走哪条硬件路径fp32/fp16 → 纯向量VEC路径因为 half 精度落盘的量化误差会超出 fp32 的精度契约bf16 →MIX 路径Cube 矩乘 AIV 向量行宽按 16B/元素的 UB 模型计算每拍行数也就是说切分算法的输入不只是 shape还有dtype 决定的硬件路径——这是设计 tiling 时最容易被新手忽略的维度。六、无卡验证让 tiling 算法先过 UT这套设计最实用的地方在于可测试性。host 侧的 tiling 入口依赖 CANN 的TilingContext/PlatformAscendC在无卡的 UT 环境里构造不出来因此项目把算法核心抽成纯函数头文件各算子的*_tiling_core.h平台参数核数、UB 大小由测试直接注入。结果就是TILE_FLOATS_CAP × 13 × 4B ≤ 176KB这类预算不变量、32B 对齐断言、覆盖性不变量全部在 CPU 上就能回归。UT 入口见 tests/ascendc/ophost/CMakeLists.txt各算子用例在 tests/ut/op_host/ 下。写在最后回顾oil-gas-ops-prospect的 tiling 设计三条经验可以迁移到任何昇腾算子开发先算预算再定 tile把 UB 里同时存活的所有 buffer 份数列清楚双缓冲 × 路数 × 深度 暂存单拍上限自然水到渠成对齐粒度统一为 32B向上对齐做 padding、向下对齐做收缩均分步长取对齐倍数一次动作同时满足性能与正确性切分算法必须可无卡 UT用恰好覆盖一次的穷举断言兜底比上线后排查数据竞争便宜得多想继续深入可以从公共算法 og_elementwise_tiling.h 读起再到各算子的*_tiling_core.h看差异最后对照 kernel 侧 og_elementwise_kernel.h 的SplitByCore理解 host 与 device 两侧如何咬合。【免费下载链接】oil-gas-ops-prospect面向油气勘探oil gas exploration领域的昇腾自定义算子库。仓名即 oil-gas-ops油气算子 prospect勘探目标面向地震成像、全波形反演等勘探计算场景项目地址: https://gitcode.com/cann/oil-gas-ops-prospect创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenRig:本地大模型服务编排的轻量级运行时框架 2026/10/2 0:03:34

OpenRig:本地大模型服务编排的轻量级运行时框架

1. OpenRig 是什么?它不是 Codex,也不是 Node.js 工具链的附属品OpenRig 这个名字在当前技术社区里确实容易引发混淆——它既不是 Codex 的官方 CLI 客户端,也不是 Node.js 生态中某个广为人知的标准工具。我第一次看到这个词是在一个 GitHub…

阅读更多 →
企业AI转型实战指南:从场景选择到落地避坑的完整路线图 2026/10/2 0:03:34

企业AI转型实战指南:从场景选择到落地避坑的完整路线图

1. 先搞清楚:企业AI转型到底在转什么1.1 别被“转型”两个字吓住,它其实就三件事我做了十多年企业数字化项目,见过太多老板一上来就说“我们要All in AI”,结果半年烧掉几百万,连个水花都没看见。问题出在哪&#xff1…

阅读更多 →
MySQL实战运维:从部署、连接到性能调优与故障排查 2026/10/2 0:03:14

MySQL实战运维:从部署、连接到性能调优与故障排查

从 Windows 笔记本上的本地开发库,到 Linux 服务器上的生产集群,再到 Docker 容器和 NAS 上跑着的业务库,MySQL 管理这件事,我断断续续做了十几年,经手的实例少说也有上百个。很多刚接触的同学以为 MySQL 就是装完、连…

阅读更多 →
夸克网盘1TB免费扩容领取全攻略:新老用户实操流程与避坑指南 2026/10/2 0:03:14

夸克网盘1TB免费扩容领取全攻略:新老用户实操流程与避坑指南

直接说结论:夸克网盘这波空间扩容活动是实打实能领到的,而且新老用户都有份。我身边好几个同事按照下面这套流程操作,最快的两分钟就把1TB空间拿到手了,连客户端重启都没做就显示容量到账。这篇文章我不整那些虚头巴脑的东西&…

阅读更多 →
LightC 如何判断卸载残留?14项信号置信度评分算法源码级解读 2026/10/2 0:02:47

LightC 如何判断卸载残留?14项信号置信度评分算法源码级解读

LightC 如何判断卸载残留?14项信号置信度评分算法源码级解读 【免费下载链接】light-c A free, minimalist, lightweight, and high-performance C-drive cleanup tool. 项目地址: https://gitcode.com/gh_mirrors/li/light-c 你是否好奇免费极简的 LightC C…

阅读更多 →
Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案 2026/10/2 0:02:41

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉