ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PyPTO-Pro 向量算子优化:用 `vf.mul_dst_add` 融合乘加消除冗余 VEC 指令

PyPTO-Pro 向量算子优化:用 `vf.mul_dst_add` 融合乘加消除冗余 VEC 指令 PyPTO-Pro 向量算子优化用vf.mul_dst_add融合乘加消除冗余 VEC 指令【免费下载链接】pypto-gymPyPTO-Gym 是基于 PyPTO 编程框架构建的算子与模型样例仓库项目地址: https://gitcode.com/cann/pypto-gym导读本文讲解 CANN pypto-gym 仓库中性能调优知识卡片 vec-03 的核心方法当热点pl.vector_function中相邻的x * weight bias未被编译器自动融合时如何用 PyPTO-Pro 公开的vf.mul_dst_add替换vf.mulvf.add两条指令从而减少指令发射与中间寄存器占用。你将掌握该融合指令的参数语义与vf.mul_add_dst的差异、适用与禁用边界、可嵌入已核验 VF 的 before/after 代码以及采用前必须完成的正确性与同条件性能验证流程。卡片定位一张 VEC 计算型优化卡本方法登记于 知识卡片索引 的 Active 表item_id为vec-03bound_hint为compute适用于存在 x 乘 weight 加 bias、编译结果未自动融合、中间乘积无其他消费者且 dtype 与 mask 兼容的场景。按索引规则调优时只能从 Active 表获取候选不通过扫描目录自动采用卡片Draft 与 Retired 不作为候选。与 vec-03 相邻的 VEC 计算卡还包括 vec-02 减少/批量/就近执行 Cast 与 vec-08 归约累加链多路展开三者共同覆盖了减少 VEC 指令条数这一大类优化方向。卡片本身遵循 卡片模板 组织frontmatter 中的applicability说明适用条件target_api_gate说明设备与 API 复核门槛正文按何时用 → 何时不适用 → 原理 → 怎么改 → 性能与验证指标 → 技术限制与风险 → 参考资料展开。本文沿用该骨架并补充仓库上下文。何时用诊断特征在动手改写前先用当前算子的源码、生成物与 profiler 数据核对以下三条特征全部命中才考虑本方法热点 VF 中存在相邻的x * weight bias表达式且x、weight、bias三者 shape、dtype 与 mask 兼容aiv_vec_ratio偏高乘与加是主要有效计算且中间乘积没有其他消费者即product只被后续add使用一次trace 或编译结果确认这两条操作没有被编译器自动融合——若编译器已生成等价融合指令则本方法没有收益。历史经验线只能当候选信号AscendC 历史经验以Compute 占总时间 60%作为筛选线并观察到 A5 上 high-level vector intrinsic 的 mask/repeat/sync 固定开销可能盖过有效计算。卡片明确强调这两点在 PyPTO-Pro 中只能当作候选信号——是否已自动融合、VF 启动与最终收益均要查当前生成物/trace不得把历史经验线当成 PyPTO-Pro 的硬合同。何时不适用以下情形需要权衡风险经验阈值仅作诊断参考不能自动决定取舍目标原值、两个源操作数或加数的次序不符合vf.mul_dst_add的隐式 dst 语义参数顺序见下一节中间乘积有其它消费者例如同时参与统计或调试输出、dtype 或 mask 不兼容编译器已经生成等价的融合指令改写不会减少指令涉及跨核可见性、合同要求保留的中间结果等边界融合会破坏外部语义。原理vf.mul_dst_add的隐式 dst 语义PyPTO-Pro 的vf.mul_dst_add(src0, src1, preg)映射硬件vmadd语义为当前目标寄存器 × src0 src1即dst dst * src0 src1。关键点在于Python 赋值的左值目标变量同时代表调用前的目标输入与调用后的结果因此目标寄存器必须先初始化。回到乘法加法的场景若x已由vf.load_align载入那么x vf.mul_dst_add(weight, bias, preg)的语义就是x x * weight bias。与vf.mul_add_dst的参数语义不同卡片特别警告vf.mul_dst_add与vf.mul_add_dst参数语义不同不能混用。对照 vec-08 卡片 中的说明vf.mul_add_dst(a, b, mask)的语义是dst a * b dst适合acc a * b形式的累加器而vf.mul_dst_add是dst dst * a b目标原值是乘数。二者一个把目标当作累加项、一个把目标当作乘法项颠倒使用会静默产生错误结果。lane 推导的边界A5 AscendC 方案通过GetVecLen()/sizeof(dtype)推导 lane避免把 FP32 的 64 或 block 元素数当成跨 dtype、跨代常量。卡片明确不能把 AscendC 的GetVecLen()当成本卡的公开 PyPTO-Pro Python 参数。固定 lane 只能来自 950 支持表、dtype 专用 TilingKey/常量与生成物验证不能从 FP32 示例外推动态长度一律通过 tiling 传入并用vf.update_mask生成实际有效元素数对应的 mask。怎么改before / after以下为嵌入片段使用已核验的公开pl.*/vf.*API但必须放入已核验的 VF 与外层 Tile 上下文不能脱离上下文直接当作独立 kernel 运行。import pypto_pro.language as pl from pypto_pro.language import Vf as vf pl.vector_function def mul_add_vf(x_tile, weight_tile, bias_tile, out_tile, valid: pl.DT_INT64): preg vf.update_mask(valid, dtypepl.DT_FP32) x vf.load_align(x_tile, 0) weight vf.load_align(weight_tile, 0) bias vf.load_align(bias_tile, 0) # before: # product vf.mul(x, weight, preg) # out vf.add(product, bias, preg) # afterx 是已初始化的隐式 dst语义为 x x * weight bias x vf.mul_dst_add(weight, bias, preg) vf.store_align(out_tile, x, preg)外层 kernel 上下文外层 kernel 使用pl.jit(auto_mutexTrue)、Vec Tile/TileGroup、pl.load/pl.store调用该 VF。参照 vec-01 卡片 给出的完整结构示意调用 VF 的外层形态大致为pl.jit(auto_mutexTrue) def mul_add_kernel(...): tt pl.TileType(shape[1, 64], dtypepl.DT_FP32, target_memorypl.MemorySpace.Vec, valid_shape[-1, -1]) x_group pl.make_tile_group(typett, addrs[...], mutex_ids[...]) # weight_group / bias_group / out_group 同理 with pl.section_vector(): x_tile x_group.next() # ... pl.set_validshape(x_tile, [1, valid]) pl.load(x_tile, x, [0, 0]) # ... mul_add_vf(x_tile, weight_tile, bias_tile, out_tile, valid) pl.store(dst, out_tile, [0, 0])多 tile 循环沿用相同结构并轮转 group不能用三个单make_tile冒充流水 bufferauto_mutex只管理核内互斥跨核依赖须单独同步。注意上述外层代码为结构示意实际采用时须按真实 Tensor、shape、地址、tail 与外层循环重新设计并由当前工具链编译、完整正确性测试与设备数值验证共同确认。性能与验证指标方向性线索AscendC 外部历史案例的 high-levelMulAdd→ MicroAPIMulDstAdd曾报告约-40%aiv_time。卡片明确标注这是unverified_external_historical方向性线索原始报告与测试条件待补不是 PyPTO-Pro 本卡已实测值不能写入任何交付结论。本卡实测方法实际采用时跑完整正确性测试并在同 manifest、同目标 kernel、同采集协议下比较Task Duration(us)按 性能调优 Skill 的闭环baseline 与候选需冻结设备、seed、warm-up、repeats、精确Op Name与计时范围quick 采集不能替代 final formal compare。机制核对结合 trace/生成物确认vf.mulvf.add两条指令确实被替换为融合指令并检查融合后的寄存器 spill。技术限制与风险参数顺序是最大风险点必须逐项核对——目标原值是乘数src0是另一乘数src1是加数参数颠倒会静默产生错误结果正确性测试未必能立刻暴露尤其当weight与bias数值相近时。只有中间乘积无其他消费者、dtype/mask 兼容时才能融合。使用pl.DYNAMIC/tiling 传入有效长度不硬编码 lane 数mask 由实际 valid 元素数生成不能复用 FP32 示例推导其它 dtype。尾段单次 lane 32 往往不值得单独启 VF仅是启动开销启发式不要无条件删除尾路径必须用本 case 和当前芯片实测决定。修改后必须跑全量正确性与同条件性能回归并按照 Skill 的账本流程记录卡片 ID、文件位置与本轮结论。参考资料本卡知识卡片 vec-03vf.mul_dst_add融合乘加卡片库入口与 Active 表知识卡片索引对比语义知识卡片 vec-08 归约累加链多路展开含vf.mul_add_dst的dst a*b dst语义与 MERGING 能力缺口相邻方法知识卡片 vec-01 Vec Tile / VF 内融合消除 GM 往返、知识卡片 vec-02 减少、批量或就近执行 Cast执行闭环PyPTO-Pro 性能调优 Skill 与 优化项实验闭环PyPTO-Pro 官方核对线索位于 PyPTO-Pro 源码仓库不在本仓库内python/pypto_pro/language/_vf_api.py::Vf.mul_dst_add官方 STpython/tests/st/pypto_pro/frontend/vf_api/test_vf_basic_ops.py::_vf_kernel_11_copy_madd_0【免费下载链接】pypto-gymPyPTO-Gym 是基于 PyPTO 编程框架构建的算子与模型样例仓库项目地址: https://gitcode.com/cann/pypto-gym创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表