CANNBot Skills HIVM类型转换操作
HIVM 类型转换操作【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills关键词HIVM, vcast, round_mode, cast, bitcast, type conversion概述hir.vcast是 HIVM 方言的逐元类型转换操作支持在不同数据类型之间进行转换。它是 HIVM 中最复杂的向量操作之一提供了丰富的舍入模式round_mode和转换方式cast属性来控制转换行为。Python API 对应tl.cast(),tl.to(), 以及隐式类型转换。IR 操作定义hir.vcast — 逐元类型转换TableGen 定义def VCastOp : HIVM_ElementwiseUnaryOpvcast, [StaticMaxRankTrait2, VectorOnlyTrait0, HIVMOpSameOperandsAndResultRank, DeclareOpInterfaceMethodsExtraBufferOpInterface, BroadcastableOTF ] { let summary Elementwise Vector Type Conversion Op; let description baseClassDescription # [{ Additional constraints: 1. Supports the following conversions: | src | dst | roundingmode | |------|------|---------------------------------------------------| | f32 | f32 | round, rint, floor, ceil, trunc | | f32 | f16 | round, rint, floor, ceil, trunc, odd | | f32 | i64 | round, rint, floor, ceil, trunc | | f32 | i32 | round, rint, floor, ceil, trunc | | f32 | i16 | round, rint, floor, ceil, trunc | | f32 | s64 | round, rint, floor, ceil, trunc | | f32 | bf16 | round, rint, floor, ceil, trunc | | f16 | f32 | rint | | f16 | i32 | round, rint, floor, ceil, trunc | | f16 | i16 | round, rint, floor, ceil, trunc | | f16 | i8 | round, rint, floor, ceil, trunc | | f16 | ui8 | round, rint, floor, ceil, trunc | | f16 | i4 | round, rint, floor, ceil, trunc | | bf16 | f32 | rint | | bf16 | i32 | round, rint, floor, ceil, trunc | | ui8 | f16 | rint | | i8 | f16 | rint | | i8 | i1 | rint | | i16 | f16 | round, rint, floor, ceil, trunc | | i16 | f32 | rint | | i32 | f32 | round, rint, floor, ceil, trunc | | i32 | i64 | rint | | i32 | i16 | rint | | i64 | i32 | rint | | i64 | f32 | round, rint, floor, ceil, trunc | | i4 | f16 | rint | | i1 | f16 | rint | | i1 | f32 | rint | }]; let arguments (ins VariadicAnyShaped:$src, VariadicAnyShaped:$dst, OptionalAnyMemRef:$temp_buffer, DefaultValuedAttrHIVM_RoundModeAttr, RoundMode::RINT:$round_mode, DefaultValuedAttrHIVM_TypeFnAttr, TypeFn::cast_signed:$cast, DefaultValuedAttrDenseI64ArrayAttr, {}:$transpose, DefaultValuedAttrDenseI64ArrayAttr, {}:$broadcast ); let hasVerifier 1; }源码参考HIVMVectorOps.td#L420-L500参数说明参数类型必选默认值说明约束$srcVariadicAnyShaped是-输入向量VectorOnly$dstVariadicAnyShaped是-输出向量与 src 相同 rank$temp_bufferOptionalAnyMemRef否-临时缓冲区-$round_modeHIVM_RoundModeAttr否RINT舍入模式见下方枚举表$castHIVM_TypeFnAttr否cast_signed转换方式见下方枚举表$transposeDenseI64ArrayAttr否{}OTF 转置维度-$broadcastDenseI64ArrayAttr否{}OTF 广播维度-round_mode 属性round_mode控制 vcast 在精度降低时的舍入行为。定义在 HIVMAttrs.td#L378-L406。枚举值字符串表示说明C 语言等价RINT (0)rint向最近整数舍入偶数优先rint()ROUND (1)round向最近整数舍入远离零优先round()FLOOR (2)floor向负无穷方向舍入floor()CEIL (3)ceil向正无穷方向舍入ceil()TRUNC (4)trunc向零方向舍入trunc()ODD (5)odd向奇数舍入Von Neumann 舍入-TRUNCWITHOVERFLOW (6)truncwithoverflow截断并允许溢出-舍入模式选择指南场景推荐模式说明默认转换rint最常用IEEE 754 标准舍入精确向下取整floor用于计算索引精确向上取整ceil用于分配大小F32 → F16 降精度odd保持最大精度避免舍入偏差截断小数部分trunc直接丢弃小数部分cast 属性cast属性控制整数类型转换时的符号处理方式。定义在 HIVMAttrs.td#L431-L446。枚举值值说明cast_signed0有符号转换默认cast_unsigned1无符号转换bitcast2位转换不改变位模式cast 模式说明cast_signed将源整数视为有符号数进行转换。例如i16 → f32时负数会被正确解释。cast_unsigned将源整数视为无符号数进行转换。例如ui8 → f16时所有值被视为正数。bitcast不改变底层位模式仅重新解释类型。例如f32 → i32的 bitcast 保持 32 位不变。unsigned_mode 属性隐含虽然 vcast 本身使用cast属性但 HIVM 还定义了UnsignedMode枚举用于更细粒度的有符号/无符号转换控制枚举值字符串表示说明SI2SI (0)si2si有符号 → 有符号SI2UI (1)si2ui有符号 → 无符号UI2SI (2)ui2si无符号 → 有符号UI2UI (3)ui2ui无符号 → 无符号源码参考HIVMAttrs.td#L408-L425支持的转换路径浮点 → 浮点源类型目标类型支持的 round_modef32f32round, rint, floor, ceil, truncf32f16round, rint, floor, ceil, trunc, oddf32bf16round, rint, floor, ceil, truncf16f32rintbf16f32rint浮点 → 整数源类型目标类型支持的 round_modef32i64round, rint, floor, ceil, truncf32i32round, rint, floor, ceil, truncf32i16round, rint, floor, ceil, truncf16i32round, rint, floor, ceil, truncf16i16round, rint, floor, ceil, truncf16i8round, rint, floor, ceil, truncf16ui8round, rint, floor, ceil, truncf16i4round, rint, floor, ceil, truncbf16i32round, rint, floor, ceil, trunc整数 → 浮点源类型目标类型支持的 round_modei8f16rintui8f16rinti16f16round, rint, floor, ceil, trunci16f32rinti32f32round, rint, floor, ceil, trunci64f32round, rint, floor, ceil, trunci4f16rinti1f16rinti1f32rint整数 → 整数源类型目标类型支持的 round_modei8i1rinti32i64rinti32i16rinti64i32rintIR 示例基本类型转换hivm.hir.vcast ins(%src : memref2x16xbf16) outs(%dst : memref2x16xf32)指定舍入模式hivm.hir.vcast ins(%src : memref2x16xbf16) outs(%dst : memref2x16xf32) round_mode #hivm.round_moderint hivm.hir.vcast ins(%src : memref2x16xbf16) outs(%dst : memref2x16xi32) round_mode #hivm.round_moderound hivm.hir.vcast ins(%src : memref2x16xbf16) outs(%dst : memref2x16xi32) round_mode #hivm.round_modeceil hivm.hir.vcast ins(%src : memref2x16xbf16) outs(%dst : memref2x16xi32) round_mode #hivm.round_modefloorTensor 语义%result hivm.hir.vcast ins(%src : tensor23x77xi32) outs(%dst : tensor23x77xf32) - tensor23x77xf32指定转换方式hivm.hir.vcast ins(%src : memref2x16xi32) outs(%dst : memref2x16xf32) cast #hivm.castcast_signed hivm.hir.vcast ins(%src : memref2x16xi32) outs(%dst : memref2x16xf32) cast #hivm.castcast_unsignedIR 层约束与验证Rank 一致性输入和输出必须具有相同的 rankHIVMOpSameOperandsAndResultRank最大 Rank 限制StaticMaxRankTrait2最多支持 2 维转换路径验证hasVerifier 1操作包含自定义验证器根据硬件版本验证参数合法性round_mode 与转换路径兼容性不是所有 round_mode 都适用于所有转换路径详见上方支持的转换路径表元素类型可以不同vcast 是唯一一个不要求 SameOperandsElementType 的 ElementwiseUnaryOp与其他 IR 操作的关系HIVM 操作上游降级HFusion 降级说明vcast-hfusion.cast {round_mode ...}round_mode 属性直接映射降级示例hivm.hir.vcast ins(%src : memref2x16xbf16) outs(%dst : memref2x16xf32) round_mode #hivm.round_moderint %result hfusion.cast {round_mode #hfusion.round_moderint} %src : memref2x16xbf16 - memref2x16xf32常见问题Q: vcast 和 hivm.hir.bitcast 有什么区别A:hivm.hir.bitcast是独立的位转换操作不改变位模式仅重新解释类型不需要 round_mode。hir.vcast使用cast bitcast时语义类似但 vcast 还支持需要舍入的类型转换。Q: F32 → F16 为什么支持 odd 模式而其他转换不支持A: F32 → F16 是最常见的降精度场景odd 舍入Von Neumann 舍入可以避免统计偏差在量化场景中特别重要。硬件仅为此路径实现了 odd 模式。Q: TRUNCWITHOVERFLOW 和 TRUNC 有什么区别A: TRUNC 在溢出时行为未定义或饱和而 TRUNCWITHOVERFLOW 允许溢出发生而不做饱和处理。后者在需要检测溢出的场景中使用。Q: 为什么有些转换路径只支持 rintA: 从低精度到高精度的转换如 f16 → f32, i16 → f32是精确的不需要舍入因此只使用默认的 rint 模式。从高精度到低精度的转换才需要指定舍入策略。相关文档Python APIdocs_triton_ascend 中的tl.cast()文档源码参考HIVMVectorOps.td - VCastOpHIVMAttrs.td - RoundMode 枚举HIVMAttrs.td - TypeFn 枚举HIVMAttrs.td - UnsignedMode 枚举convert-hivm-to-upstream.mlir【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考