ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PyPTO vf 寄存器类型转换全解析:astype / bit_cast / truncate 的底层原理与实战

PyPTO vf 寄存器类型转换全解析:astype / bit_cast / truncate 的底层原理与实战 PyPTO vf 寄存器类型转换全解析astype / bit_cast / truncate 的底层原理与实战【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pyptoPyPTOParallel Tensor/Tile Operation的 SIMD 寄存器计算reg_computation体系中vf.astype、vf.bit_cast、vf.truncate三个接口覆盖了向量寄存器RegTensor上全部的类型转换需求数值语义转换、按位重解释与向零取整。本文以 docs/zh/api/pro_api/SIMD-API/reg_computation/type_conversion/index.md 为主线结合仓库中的接口声明与示例代码系统讲解三个接口的语义差异、参数行为、支持的数据类型矩阵以及可直接运行的调用示例帮助你写出符合硬件约束、行为可预期的高效向量内核。类型转换接口总览三个接口三种语义在 PyPTO 的向量函数pl.vector_function中RegTensor 是向量指令的操作对象而数据类型转换是浮点量化、精度对齐、位运算前的必经环节。type_conversion目录下三个接口分别解决三类问题接口语义典型场景vf.astype数值类型转换vcvt 指令FP32→FP16、BF16→FP4、FP32→INT32 等真实数值换算vf.bit_cast按位重解释仅改类型标签对浮点寄存器执行按位与/或/异或vf.truncate向零取整vtrc ROUND_Z丢弃小数部分、保留浮点数据类型三者最关键的区别在于astype会真实改变元素的值如 257.0 转为 uint8 后变成 1bit_cast保持比特模式完全不变而truncate只做小数截断、数据类型不变。从源码声明看三个接口均定义于 python/pypto_pro/language/_vf_api.pyastype位于 L709、bit_cast位于 L1466、truncate位于 L1864并且在 python/pypto_pro/language/parser/_call_parser.py 的解析表中分别注册L506-L541是 vf API 的一等公民。产品支持情况根据三个接口文档中一致的「产品支持情况」声明Ascend 950PR / Ascend 950DT支持三个接口全部支持含 FP8/FP4 低精度转换Atlas A3 训练/推理系列不支持Atlas A2 训练/推理系列不支持。即类型转换接口是 Ascend 950 系列特有的向量能力编写代码前需先确认目标设备。仓库中 python/pypto_pro/language/_vf_api.py L722 也明确标注 FP8/FP4 conversion support (Ascend 950PR/950DT only)。vf.astype通用数值类型转换vf.astype是三者中功能最丰富、参数最多的接口用于将源操作数的数据类型转换为目标数据类型覆盖浮点转整数、浮点转浮点、整数转浮点、整数转整数四类转换。函数原型与参数astype(src, preg, dtype: DType, layout: Optional[CastLayout] None, round_mode: Optional[VFRoundMode] None, saturate: Optional[SaturateMode] None, mode: Optional[MergeMode] None) - dst参数输入/输出说明src输入源操作数reg_tensor。preg输入mask_reg按源操作数筛选有效元素。dtype输入必选目标寄存器数据类型如pl.DT_FP16、pl.DT_INT32。目标类型与源类型不同必须显式指定。layout输入可选CastLayout。源与目的位宽不同时控制位宽小的元素在寄存器中的排布CastLayout.ZERO放偶数索引默认、CastLayout.ONE放奇数索引FP4 类型额外支持CastLayout.TWO/CastLayout.THREE4 倍扩展/缩窄时使用。round_mode输入可选VFRoundMode浮点舍入模式默认VFRoundMode.CAST_RINT。saturate输入可选SaturateModeOFF默认非饱和或ON饱和。mode输入可选MergeMode。当前设备仅支持MergeMode.ZEROINGpreg 未筛选元素在 dst 中置 0MERGING不支持。layout、mask 与位宽的关系不同数据类型对应元素在 preg 中的位宽不一致类型转换时 mask_reg 按源操作数筛选有效元素。当源和目的位宽不同时单条指令的计算量以位宽更大的数据类型为准layout决定位宽小的元素在寄存器中的排布16 位宽 → 32 位宽小位宽元素按layout展开到 32 位寄存器中的偶数/奇数半区图 1 展示了 mask_reg 与 layout 同时作用下的转换过程32 位宽 → 16 位宽每两个有效位宽元素压缩到一个 32 位寄存器图 2FP4 特例DT_FP4E2M1、DT_FP4E1M2与DT_BF16之间的转换指令按每 2 个元素为一对读写大转小时 preg 有效位以偶数位为准图 3、图 4。相关的四张转换过程示意图astype_b16_to_b32_conversion.jpg、astype_b32_to_b16_conversion.jpg、astype_fp4x2_e2m1_to_bf16_conversion.jpg、astype_bf16_to_fp4x2_e2m1_conversion.jpg存放在 docs/zh/api/pro_api/figures 目录可对照理解位宽变化时的元素排布。支持的数据类型转换矩阵astype支持的数据类型转换组合非常多以下按转换类别整理完整表格请参见 astype.md 的「约束说明」表1 支持的数据类型转换节选srcdstDT_INT4DT_INT16、DT_FP16、DT_BF16DT_INT8DT_INT16、DT_FP16、DT_INT32DT_UINT8DT_UINT16、DT_FP16、DT_UINT32DT_FP4E2M1 / DT_FP4E1M2DT_BF16DT_HF8DT_FP16、DT_FP32DT_FP8E8M0DT_BF16DT_FP8E5M2 / DT_FP8E4M3FNDT_FP32DT_FP16DT_INT4、DT_INT8、DT_UINT8、DT_HF8、DT_INT16、DT_BF16、DT_INT32、DT_FP32DT_BF16DT_FP4E2M1、DT_FP4E1M2、DT_FP8E8M0、DT_FP16、DT_INT32、DT_FP32DT_FP32DT_HF8、DT_FP8E5M2、DT_FP8E4M3FN、DT_INT16、DT_FP16、DT_BF16、DT_INT32、DT_INT64DT_INT64DT_INT32、DT_FP32从源码 docstringpython/pypto_pro/language/_vf_api.py L722-L735可以确认FP8/FP4 低精度转换路径与文档表完全一致二者互为印证。不同场景下的参数可用性表2 浮点转整数节选srcdstlayoutsaturatemoderound_modeDT_FP16DT_INT4ZERO/ONE/TWO/THREEOFF/ONZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP16DT_INT8ZERO/ONEOFF/ONZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP16DT_INT16UNKNOWNOFF/ONZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP16DT_INT32ZERO/ONEUNKNOWNZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_BF16DT_INT32ZERO/ONEOFF/ONZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP32DT_INT16 / DT_INT64ZERO/ONEOFF/ONZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP32DT_INT32UNKNOWNOFF/ONZEROINGCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNC表3 浮点转浮点节选srcdstlayoutsaturateround_modeDT_HF8DT_FP16ZERO/ONEUNKNOWNUNKNOWNDT_HF8DT_FP32ZERO/ONE/TWO/THREEUNKNOWNUNKNOWNDT_FP8E4M3FN / DT_FP8E5M2DT_FP32ZERO/ONE/TWO/THREEUNKNOWNUNKNOWNDT_FP8E8M0DT_BF16ZERO/ONEUNKNOWNUNKNOWNDT_FP4E2M1 / DT_FP4E1M2DT_BF16ZERO/ONE/TWO/THREEUNKNOWNUNKNOWNDT_FP16DT_HF8ZERO/ONEOFF/ONCAST_ROUND/CAST_HYBRIDDT_FP16DT_BF16UNKNOWNUNKNOWNCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_BF16DT_FP4E2M1 / DT_FP4E1M2ZERO/ONE/TWO/THREEUNKNOWNCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP32DT_FP8E4M3FN / DT_FP8E5M2ZERO/ONE/TWO/THREEOFF/ONCAST_RINTDT_FP32DT_FP16ZERO/ONEOFF/ONCAST_ODD/CAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_FP32DT_BF16ZERO/ONEOFF/ONCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNC表4 整数转浮点节选srcdstlayoutsaturateround_modeDT_INT4DT_FP16 / DT_BF16ZERO/ONE/TWO/THREEUNKNOWNUNKNOWNDT_INT8 / DT_UINT8DT_FP16ZERO/ONEUNKNOWNUNKNOWNDT_INT16DT_FP16UNKNOWNUNKNOWNCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_INT16DT_FP32ZERO/ONEUNKNOWNUNKNOWNDT_INT32DT_FP32UNKNOWNUNKNOWNCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNCDT_INT64DT_FP32ZERO/ONEUNKNOWNCAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNC表5 整数转整数节选srcdstlayoutsaturatemoderound_modeDT_INT4DT_INT16ZERO/ONE/TWO/THREEUNKNOWNZEROINGUNKNOWNDT_INT8DT_INT16ZERO/ONEUNKNOWNZEROINGUNKNOWNDT_INT8DT_INT32ZERO/ONE/TWO/THREEUNKNOWNZEROINGUNKNOWNDT_INT16DT_INT4 / DT_UINT8ZERO/ONE(/TWO/THREE)OFF/ONZEROINGUNKNOWNDT_INT16DT_INT32 / DT_UINT32ZERO/ONEUNKNOWNZEROINGUNKNOWNDT_INT32DT_UINT8ZERO/ONE/TWO/THREEOFF/ONZEROINGUNKNOWNDT_INT32DT_INT16 / DT_UINT16ZERO/ONEOFF/ONZEROINGUNKNOWNDT_INT32DT_INT64ZERO/ONEUNKNOWNZEROINGUNKNOWNDT_UINT32DT_UINT8ZERO/ONE/TWO/THREEOFF/ONZEROINGUNKNOWNDT_INT64DT_INT32ZERO/ONEOFF/ONZEROINGUNKNOWNUNKNOWN 的含义layout为 UNKNOWN 表示源与目的位宽相同、无需指定可省略saturate为 UNKNOWN 表示该路径不涉及饱和/非饱和选择可省略round_mode为 UNKNOWN 表示该路径不涉及精度损失可省略。饱和与不饱和模式的边界行为饱和/不饱和是astype最容易踩坑的点文档明确给出了四种场景下的行为差异场景不饱和模式饱和模式浮点转整数输入超过输出类型最值时截断为目标格式数据宽度保留最低有效位例如 half 输入 257 → uint8_t 输出 1输入 ±inf 返回输出类型对应最值输入 nan 返回 0。输入超过最值时返回输出类型最值例如 half 输入 257 → uint8 输出 255half 输入 -inf → uint8_t 输出 0输入 nan 返回 0。浮点转浮点输入 nan 输出 nan输入 ±inf 输出 ±inf。输入 nan 输出 0输入超过最值时返回输出类型最值。整数转浮点不支持不饱和模式输入 nan 输出 0输入超过最值返回输出类型最值。该场景默认饱和模式无需配置。整数转整数输入截断为目标数据宽度例如 int32_t 输入 256 → uint8_t 输出 0。输入超出目标数据范围时饱和为目标数据最值。浮点转浮点的特殊约束务必留意输出为FP32时只支持不饱和模式不饱和模式下输出为FP8E4M3FN时该类型无 inf 表示溢出输出为 nan饱和模式下输出为FP8E5M2/FP8E4M3FN时输入 nan 默认输出 0若CTRL[50] 1b1则输出 nanFP4E2M1/FP4E1M2 没有 inf 和 nan 的定义BF16→FP4 转换中输入 inf 或超出 FP4 最值范围时返回对应符号的 FP4 最值输入 nan 时 FP4 输出 0FP8E8M0输入 BF16 ±inf 或绝对值超出 FP8E8M0 最大值时返回最大值0b11111110输入 BF16 nan 输出 FP8E8M0 nan 0b11111111。整数转整数的特殊约束对于窄类型如 INT16转宽类型如 UINT32只支持饱和模式输入负数会被饱和成 0。vf.astype 实战五种典型转换的内核写法文档提供了六个可直接运行的示例BF16→FP32、FP32→FP16、FP32→INT32、FP32→FP8E4M3FN、BF16→FP4E2M1、FP16→HF8、INT64这里选取最具代表性的五种讲解模式其余示例可在 astype.md 中查看完整代码。模式一BF16 → FP32窄转宽需指定 layoutimport 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) reg_a vf.load_align(src_tile, 0) reg_bf16 vf.astype(reg_a, preg, dtypepl.DT_BF16, layoutpl.CastLayout.ZERO) reg_f32 vf.astype(reg_bf16, preg, dtypepl.DT_FP32) vf.store_align(dst_tile, reg_f32, 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, a.to(torch.bfloat16).to(torch.float32), rtol1e-3, atol1e-3) if __name__ __main__: test_example() print(PASSED)要点FP32 寄存器64 个元素转 BF16 后只占偶数位置CastLayout.ZERO再转回 FP32 即可与原始数据对比验证 round-trip 正确性。模式二FP32 → FP16含舍入的浮点转浮点结构与模式一完全相同区别仅在转换参数上reg_f16 vf.astype(reg_a, preg, dtypepl.DT_FP16, layoutpl.CastLayout.ZERO)。验证时使用a.to(torch.float16).to(torch.float32)与输出对比rtol1e-3, atol1e-3证明转换遵循 FP16 舍入语义。模式三FP32 → INT32指定 round_mode 的浮点转整数pl.vector_function def example_vf_round(src_tile, dst_tile): preg vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_FP32) reg_a vf.load_align(src_tile, 0) reg_i vf.astype(reg_a, preg, dtypepl.DT_INT32, round_modepl.VFRoundMode.CAST_RINT) reg_f vf.astype(reg_i, preg, dtypepl.DT_FP32) vf.store_align(dst_tile, reg_f, preg)验证采用torch.testing.assert_close(out, a.to(torch.int32).to(torch.float32), rtol0, atol1.0)容忍 ±1 的舍入差异说明CAST_RINT是四舍五入语义而非截断。模式四FP32 → FP8E4M3FN量化场景layout round_mode saturate 齐用pl.vector_function def example_vf_fp8(src_tile, dst_tile): preg vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_FP32) reg_a vf.load_align(src_tile, 0) reg_f8 vf.astype(reg_a, preg, dtypepl.DT_FP8E4M3FN, layoutpl.CastLayout.ZERO, round_modepl.VFRoundMode.CAST_RINT, saturatepl.SaturateMode.ON) reg_f32 vf.astype(reg_f8, preg, dtypepl.DT_FP32) vf.store_align(dst_tile, reg_f32, preg)验证时只对比偶数索引列out[:, ::2]与expected[:, ::2]这正是 layout 排布FP8 存于偶数位置在结果上的体现——窄类型转换后奇数位置是无效元素。模式五BF16 → FP4E2M1FP4 特例每 2 个元素一对读写_FP4_E2M1_VALUES np.array([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0], dtypenp.float32) _FP4_E2M1_EVEN_MASK np.array([True, False, True, False, True, False, True, False]) pl.vector_function def example_vf_fp4(src_tile, dst_tile): preg vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_BF16) reg_a vf.load_align(src_tile, 0, dtypepl.DT_BF16) reg_f4 vf.astype(reg_a, preg, dtypepl.DT_FP4E2M1, layoutpl.CastLayout.ZERO, round_modepl.VFRoundMode.CAST_RINT) reg_bf16 vf.astype(reg_f4, preg, dtypepl.DT_BF16) vf.store_align(dst_tile, reg_bf16, preg)验证逻辑揭示了 FP4 转换的硬件特性测试在 numpy 中枚举 FP4E2M1 的 8 个可表示值0.0/0.5/1.0/1.5/2.0/3.0/4.0/6.0寻找最近邻且优先偶数索引候选_FP4_E2M1_EVEN_MASK再与out[:, ::2]对比——这与文档中FP4 大转小时 preg 有效位以偶数位为准的说明完全对应。模式六INT64 数据类型示例INT64 是 64 位宽类型转换路径为INT64 → FP32 → INT64astype.md L500-L545 有完整代码。内核使用TileType(shape[1, 32], dtypepl.DT_INT64, ...)Tile 基地址用 256 字节对齐addrs256最终以rtol0, atol0精确断言 round-trip 无损。vf.bit_cast按位重解释零开销的类型标签切换语义与使用形式vf.bit_cast对向量寄存器执行按位类型强转不进行任何数值转换仅改变类型标签比特模式不变。与astype的本质区别在于——astype是真正的数值转换元素值会变bit_cast只重解释。bit_cast(src, dtype: DType) - dst参数输入/输出说明src输入源操作数reg_tensor。dtype输入目标数据类型将 src 重解释为该类型。支持两种使用方式赋值形式dst vf.bit_cast(src, dtypexxx)将 src 按位重解释后赋给新声明的 dst 寄存器嵌套参数形式vf.xor(vf.bit_cast(reg_a, dtypepl.DT_UINT32), vf.bit_cast(reg_b, dtypepl.DT_UINT32), preg)作为其他 vf.xxx 调用的参数满足指令对操作数类型的要求。核心约束源与目标操作数位宽必须相同src与dtype的GetBit()返回值一致否则行为未定义。从源码看bit_cast生成的是 C 侧的RegTensorT引用强转例如vxor(reg_c, (RegTensorfloat)reg_a, (RegTensorfloat)reg_b, preg, MODE_ZEROING)见 python/pypto_pro/language/_vf_api.py L1482-L1488因此它本质上是一条类型注解而非真实指令零开销。实战一赋值形式 — FP32 寄存器按位异或pl.vector_function def example_vf_bit_cast_assign(src_tile_a, src_tile_b, dst_tile): preg_u32 vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_UINT32) reg_a vf.load_align(src_tile_a, 0) reg_b vf.load_align(src_tile_b, 0) reg_a_u32 vf.bit_cast(reg_a, dtypepl.DT_UINT32) reg_b_u32 vf.bit_cast(reg_b, dtypepl.DT_UINT32) reg_c vf.xor(reg_a_u32, reg_b_u32, preg_u32) vf.store_align(dst_tile, reg_c, preg_u32)验证用torch.equal(out.view(torch.int32), a.view(torch.int32) ^ b.view(torch.int32))——把输出与输入均view成 int32 后逐位异或对比精准验证比特模式不变的语义。完整的内核与测试代码含pl.load/pl.store与section_vector上下文见 bit_cast.md L56-L106。实战二嵌套参数形式 — HF8 寄存器按位或HF8 是 8 位存储类型加载后 RegTensor 含 256 个元素将其bit_cast为 DT_UINT8同为 256 元素后即可对 UINT8 寄存器执行vf.or_pl.vector_function def example_vf_hf8_to_uint8(src_tile_a, src_tile_b, dst_tile): preg_b8 vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_UINT8) reg_a vf.load_align(src_tile_a, 0, dtypepl.DT_HF8) reg_b vf.load_align(src_tile_b, 0, dtypepl.DT_HF8) reg_c vf.or_(vf.bit_cast(reg_a, dtypepl.DT_UINT8), vf.bit_cast(reg_b, dtypepl.DT_UINT8), preg_b8) vf.store_align(dst_tile, reg_c, preg_b8)测试侧通过torch_npu.npu_dtype_cast生成 HF8 张量并用a.view(torch.uint8) | b.view(torch.uint8)构造期望值bit_cast.md L146-L163。这是bit_cast最典型的应用浮点类型没有按位运算指令先重解释为等位宽的整数类型再参与位运算。vf.truncate向零取整保留浮点类型vf.truncate将源操作数中的浮点元素截断为整数值保留原数据类型并存入目的操作数dstReg_i trunc(srcReg_i)。例如 3.7 → 3.0、-2.3 → -2.0即丢弃小数部分、向零取整示意图见 truncate_function.jpg。truncate(src, preg, mode: Optional[MergeMode] None) - dst参数输入/输出说明src输入源操作数reg_tensor与 dst 数据类型保持一致支持 DT_FP16、DT_BF16、DT_FP32。preg输入mask_regmask 未筛选的元素在 dst 中置零。DT_FP32 只支持不饱和模式。mode输入可选MergeMode。仅支持MergeMode.ZEROING默认MERGING当前不支持。从源码看truncate映射到硬件vtrc指令的ROUND_Z模式python/pypto_pro/language/_vf_api.py L1867即向零舍入round toward zero与 C 标准库的trunc、PyTorch 的torch.trunc语义一致。约束说明为无——接口本身没有额外的数据类型限制仅需保证 src 为上述三种浮点类型。调用示例完整代码见 truncate.mdpl.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)验证直接使用torch.testing.assert_close(out, torch.trunc(a), rtol1e-5, atol1e-5)与 PyTorch 的torch.trunc一一对应。注意区分truncate与astype的CAST_TRUNC前者保留浮点数据类型只做向零取整3.7 → 3.0仍是 FP32后者是类型转换中的舍入模式选项输出为目标整数/浮点类型。若需要 FP32 → INT32 的截断转换应使用vf.astype(..., dtypepl.DT_INT32, round_modepl.VFRoundMode.CAST_TRUNC)。三个接口的选择决策需求选择理由改变数据类型并保留数值语义FP16↔FP32、量化、INT↔FPvf.astype真正的 vcvt 数值转换支持 layout/round_mode/saturate 完整控制对浮点寄存器做按位运算与/或/异或、位操作vf.bit_cast 整数位运算指令仅改类型标签比特不变零开销满足指令类型要求不改变类型、仅丢弃浮点小数部分vf.truncatevtrc ROUND_Z向零取整保留原类型三个接口之间还可以组合使用典型流水线如astype窄化量化 → 位运算重解释 →astype宽化还原。编写时请始终遵循三条原则先确认设备三个接口仅 Ascend 950PR/950DT 支持A2/A3 系列不可用位宽不同必配 layout源与目的位宽不同时按文档各表选择CastLayout.ZERO/ONEFP4 场景可用 TWO/THREE窄化转换结果只出现在指定半区其余位置无效溢出行为提前约定浮点转整数、浮点转浮点的溢出/nan/inf 行为由saturate决定且不同路径的可用性不同务必对照 astype.md 的约束表选用避免未定义行为。延伸阅读type_conversion 目录索引astype / bit_cast / truncate 三篇接口文档入口reg_tensor三个接口的源/目的操作数类型mask_regpreg 掩码的创建与语义CastLayout、VFRoundMode、SaturateMode、MergeModeastype 各参数的枚举定义接口声明源码python/pypto_pro/language/_vf_api.pyvf API 解析注册python/pypto_pro/language/parser/_call_parser.py。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表