ARTICLE DETAIL

资讯详情

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

PyPTO vf.truncate 详解:向量寄存器浮点截断指令的语义、实现与实战

PyPTO vf.truncate 详解:向量寄存器浮点截断指令的语义、实现与实战 人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载导读vf.truncate是 PyPTOParallel Tensor/Tile Operation 编程范式Pro 向量编程范式VFVector Function中用于浮点数截断的寄存器级计算接口它将源操作数src中每个浮点元素的小数部分直接丢弃向零取整保留整数部分并维持原浮点数据类型写入目的操作数dst。本指南基于 vf.truncate API 文档 展开并结合仓库中的 Python 接口声明、CCE 后端代码生成实现与 ST 测试用例帮助你完整掌握该指令的参数语义、mask 筛选行为、底层硬件映射vtrc指令以及可直接复用的 Kernel 编写范例。产品支持情况vf.truncate属于 Ascend 950 系列新增的向量寄存器计算能力支持情况如下产品支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品不支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品不支持从仓库实现看该能力由 backend_cce_vf_ops.cpp 中的REGISTER_BACKEND_OP(BackendCCE, vf.truncate)注册到 CCE 后端属于与具体昇腾产品指令集强绑定的 VF 计算算子因此不同代际产品支持度存在差异编写代码前请先确认目标设备的支持情况。功能说明截断的数学语义vf.truncate执行的运算为向零截断round toward zero$$dstReg_i \text{trunc}(srcReg_i)$$即对于每个元素直接丢弃小数部分、仅保留整数部分且目的操作数保持与源操作数相同的浮点数据类型结果仍为浮点数如3.0、-2.0不会转换为整数类型。这与 C 语言中trunc()函数、PyTorch 中torch.trunc()的语义一致。以下为截断运算的直观示意3.7 → 3.0-2.3 → -2.0需要特别留意截断与其它取整方式的区别truncate截断向零取整trunc(-2.3) -2.0trunc(2.7) 2.0floor向下取整floor(-2.3) -3.0ceil向上取整ceil(2.3) 3.0rint四舍五入rint(2.5) 2.0银行家舍入。在仓库的 CCE 后端实现中vf.truncate默认映射为硬件vtrc指令的ROUND_Z舍入模式同时该实现也透出了round_mode关键字支持CAST_RINTROUND_R、CAST_CEILROUND_C、CAST_FLOORROUND_F、CAST_TRUNCROUND_Z四种舍入模式见 EmitVFTruncate 实现在需要其它取整语义时可通过round_mode复用同一指令通路。函数原型truncate(src, preg, mode: Optional[MergeMode] None) - dst对应的 Python 接口声明位于 python/pypto_pro/language/_vf_api.py其 docstring 明确了语义为dst[i] trunc(src[i])映射到硬件vtrc指令的ROUND_Z模式。参数说明参数输入/输出说明src输入源操作数reg_tensor源操作数src与目的操作数dst的数据类型保持一致。支持的数据类型为DT_FP16、DT_BF16、DT_FP32。preg输入mask_regmask 未筛选的元素在dst中置零。DT_FP32类型只支持不饱和模式。mode输入可选对应 MergeMode 类型。-pypto_pro.language.MergeMode.ZEROING默认preg未筛选的元素在dst中置 0。-pypto_pro.language.MergeMode.MERGING当前不支持。参数细节补充1. 数据类型约束vf.truncate仅支持三种 16/32 位浮点类型DT_FP16、DT_BF16、DT_FP32。这一点在 CCE 后端有显式校验backend_cce_vf_ops.cppPRO_CODEGEN_CHECK(ExternalError::INVALID_TYPE, src_dt DataType::FP16 || src_dt DataType::BF16 || src_dt DataType::FP32) vf.truncate src only supports FP16/BF16/FP32, got DTypeStr(src_dt);同时要求src与dst数据类型完全一致backend_cce_vf_ops.cpp否则编译期会直接报错。2. RegTensor 与元素个数src、dst均为vf.reg_tensor向量寄存器单个寄存器总大小固定为 256 字节不同dtype对应不同元素个数详见 reg_tensor 文档dtype元素宽度元素个数DT_FP16/DT_BF1616 bit128DT_FP3232 bit64寄存器在pl.vector_function函数内创建与使用函数结束后自动释放创建后必须通过vf.load_align或vf.full等接口初始化数据否则内容未定义。3. mask 语义与 MergeModepregpredicate mask用于控制逐元素计算的有效性preg未选中的元素在dst中被置零从而实现向量化条件下的部分元素写入。mode参数控制 mask 未选中元素的目标寄存器处理方式参见 MergeMode 定义MergeMode.ZEROING默认未选中位置置 0MergeMode.MERGING保留目标寄存器原值当前设备不支持。后端通过VFZeroingOnly函数对mode做校验仅允许 ZEROING 模式见 backend_cce_vf_ops.cpp若传入 MERGING 会触发编译期报错。底层实现从 vf.truncate 到 vtrc 指令vf.truncate的完整编译链路为Python 侧 VF 接口 → IR Call 节点 → CCE 后端代码生成 → 硬件vtrc指令。在 backend_cce_vf_ops.cpp 中EmitVFTruncate完成参数数量校验要求 3 个参数dst, src, mask、类型校验与舍入模式解析后最终发射codegen.Emit(vtrc( dst , src , round_const , mask , mode ););其中round_const默认为ROUND_Z若用户通过round_mode关键字指定其它舍入模式则映射关系为round_mode发射的舍入常量CAST_RINTROUND_RCAST_CEILROUND_CCAST_FLOORROUND_FCAST_TRUNCROUND_Z由此可知vf.truncate本质上是vtrc指令在ROUND_Z模式下的封装别名该指令同时承载了rint/ceil/floor/trunc一类取整运算的能力。调用示例完整的可运行 Kernel以下示例来自 truncate API 文档演示了从全局内存加载数据、执行截断运算并写回的全流程可直接复制运行import os import pypto_pro.language as pl import torch import torch_npu pl.vector_function def example_vf(src_tile, dst_tile): preg vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_FP32) src_reg vf.load_align(src_tile, 0) dst_reg vf.truncate(src_reg, preg) vf.store_align(dst_tile, dst_reg, preg) 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, torch.trunc(a), rtol1e-5, atol1e-5) if __name__ __main__: test_example() print(PASSED)示例要点拆解VF 函数层example_vf中用vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_FP32)创建全有效 maskvf.load_align将 UB Tile 数据加载为寄存器vf.truncate完成截断vf.store_align将结果写回目的 TileKernel 层example_kernel通过pl.TileType声明[1, 64]的 FP32 Tile对应单寄存器 64 个元素的容量利用pl.make_tile_group申请输入/输出 Tile 地址并在pl.section_vector()向量节内依次执行加载、VF 调用与存储Host 校验层test_example在 NPU 上构造随机输入将 Kernel 输出与torch.trunc(a)做逐元素比对以rtol1e-5, atol1e-5容差验证截断语义的正确性。测试验证仓库中的 ST 用例仓库在 test_vf_basic_ops.py 中提供了kernel_49_truncate_maskgen测试用例覆盖了vf.truncate与vf.mask_gen_with_reg_tensor的组合场景pl.vector_function def _vf_kernel_49_truncate_maskgen_0(in_a, in_b, t_f0, t_f1): preg vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_FP32) reg_a vf.load_align(in_a, 0) reg_b vf.load_align(in_b, 0) reg_dst vf.truncate(reg_a, preg) vf.store_align(t_f0, reg_dst, preg) # Test mask_gen_with_reg_tensor: generate mask from DT_UINT32 reg bit 0 reg_u32 vf.load_align(in_b, 0) gen_mask vf.mask_gen_with_reg_tensor(reg_u32, offset0) reg_sel vf.select(reg_a, reg_b, gen_mask) vf.store_align(t_f1, reg_sel, preg)该用例展示了在实际 Kernel 中vf.truncate的典型用法并顺带验证了由寄存器位生成 mask 的联动场景可作为编写自定义测试时的参考模板。约束与注意事项约束说明该接口无额外约束。数据类型仅支持DT_FP16/DT_BF16/DT_FP32且src与dst类型必须一致mode 限制仅支持MergeMode.ZEROINGMERGING模式在当前设备上不支持饱和模式DT_FP32类型只支持不饱和模式mask 语义preg未筛选的元素在dst中置零因此若希望保留部分元素原值需要先通过其它手段保存目标值而不能依赖 MERGING 模式硬件依赖仅在 Ascend 950PR/950DT 上支持A2/A3 系列产品不可用。相关文档reg_tensor向量寄存器类型mask_reg谓词 mask 寄存器MergeModemask 未选中元素处理模式类型转换目录下其它接口VF 接口定义源码CCE 后端实现源码ST 测试用例赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐PyPTO 寄存器交织指令 vf.interleave 深度指南从 API 语义到昇腾 950 向量单元实现PyPTO 寄存器交织指令 vf.interleave 深度指南从 API 语义到昇腾 950 向量单元实现 vf.interleave 是 PyPTOPa人工智能编译器模型编译高性能计算深度学习CANNPyPTO vf.adds 接口详解向量核中标量加法的寄存器级实现与源码剖析PyPTO vf.adds 接口详解向量核中标量加法的寄存器级实现与源码剖析 本文围绕 PyPTO 中 vf.adds 接口展开讲解它在 Ascend 95人工智能编译器模型编译高性能计算深度学习CANNHelloSilicon 浮点运算完全手册ARM64 浮点寄存器和指令详解HelloSilicon 浮点运算完全手册ARM64 浮点寄存器和指令详解 想要在Apple Silicon Mac上充分发挥ARM64架构的浮点运算性能这示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表