hfusion方言Passes¶
-adapt-triton-kernel¶
功能:适配Triton Kernel编译流程。
选项:
-hivmc-version:指定hivmc版本以解决向后兼容性。
-hfusion-add-ffts-addr¶
功能:向函数参数与注解中添加FFTS基地址。
选项:
-force-add-ffts-addr:强制将FFTS基地址插入到指定参数位置;默认值-1表示不插入,0表示插入至首个参数位置。
-hfusion-auto-schedule¶
功能:对融合后的Kernel执行自动调度。
选项:
-block-dim:设置使用的Block数量。-enable-auto-multi-buffer:启用自动多缓冲优化。-enable-deterministic-computing:启用确定性计算。-max-buffer-count-tuning:开启maxBufferCnt参数调优。-enable-count-buffer-dma-opt:开启后,DMA操作占用的缓冲区不会被Vector操作复用。-enable-manage-host-resources:启用Host端函数的资源管理。-cube-tiling-tuning:开启Cube Tiling参数调优。-external-tiling-func-path:自动引入外部Tiling函数。-enable-symbol-analysis:启用Tiling与融合阶段的符号分析。
-hfusion-cache-io¶
功能:缓存输入与输出参数。
-hfusion-cache-io-for-return-arg¶
功能:对直接返回的参数执行缓存处理。
-hfusion-compose-multi-reduce¶
功能:组合多个归约操作,执行合并优化。
选项:
-max-compose:单个操作可合并的最大归约数,-1表示无限制。-max-dist-diff:与共同祖先节点的最大距离差值。-aggressive:激进模式,在Shape松散匹配时自动尝试插入Reshape操作。
-hfusion-constantize-tiling-data¶
功能:在Tiling函数与设备函数之间传播常量Tiling数据。
核心修改:
将常量Tiling数据内联到设备函数中。
从Tiling函数中移除常量Tiling数据。
从设备函数的入参中移除常量Tiling数据,并同步修改对应调用点。
从设备函数的调用方逐层移除常量Tiling数据,向上递归至所有上层调用者。
约束说明:
共享同一Tiling函数的所有设备函数,其Tiling数据参数的顺序必须完全一致。
设备函数入参中的Tiling参数,与Tiling函数的返回值顺序必须完全一致。
转换示例:
转换前:
func.func @tiling_func(%arg0: tensor<?x?xf16>) -> (i64, i64)
attributes {hacc.function_kind = #hacc.function_kind<HOST>} {
%ret0 = "some_calculation"() : () -> i64
%ret1 = arith.constant 42: i64
return %ret0, %ret1: i64, i64
}
func.func @device_kernel_tiling_0(%arg0: tensor<?x?xf16>,
%arg1: i64 {hacc.tiling_data},
%arg2: i64 {hacc.tiling_data}) -> tensor<?x?xf16>
attributes {hacc.function_kind = #hacc.function_kind<DEVICE>, hacc.tiling_func = "tiling_func"} {
"some_use"(%arg1) : (i64) -> ()
"some_use"(%arg2) : (i64) -> ()
%ret0 = "some_op"(%arg0) : (tensor<?x?xf16>) -> tensor<?x?xf16>
return %ret0 : tensor<?x?xf16>
}
func.func @device_kernel_tiling_1(%arg0: tensor<?x?xf16>,
%arg1: i64 {hacc.tiling_data},
%arg2: i64 {hacc.tiling_data}) -> tensor<?x?xf16>
attributes {hacc.function_kind = #hacc.function_kind<DEVICE>, hacc.tiling_func = "tiling_func"} {
"some_use"(%arg1) : (i64) -> ()
"some_use"(%arg2) : (i64) -> ()
%ret0 = "some_op"(%arg0) : (tensor<?x?xf16>) -> tensor<?x?xf16>
return %ret0 : tensor<?x?xf16>
}
func.func @main(%arg0: tensor<?x?xf16>,
%arg1: i64 {hacc.tiling_data},
%arg2: i64 {hacc.tiling_data}) -> tensor<?x?xf16>
attributes {hacc.function_kind = #hacc.function_kind<HOST>} {
%0 = arith.index_castui %arg1 : i64 to index
%1 = scf.index_switch %0 -> tensor<?x?xf16>
case 1 {
%2 = func.call @device_kernel_tiling_1(%arg0, %arg1, %arg2) : (tensor<?x?xf16>, i64, i64) -> tensor<?x?xf16>
scf.yield %2 : tensor<?x?xf16>
}
case 0 {
%2 = func.call @device_kernel_tiling_0(%arg0, %arg1, %arg2): (tensor<?x?xf16>, i64, i64) -> tensor<?x?xf16>
scf.yield %2 : tensor<?x?xf16>
}
default {
%false = arith.constant false
cf.assert %false, "Invalid tiling key"
%2 = ub.poison : tensor<?x?xf16>
scf.yield %2 : tensor<?x?xf16>
}
return %1 : tensor<?x?xf16>
}
转换后:
func.func @tiling_func(%arg0: tensor<?x?xf16>) -> (i64)
attributes {hacc.function_kind = #hacc.function_kind<HOST>} {
%ret0 = "some_calculation"() : () -> i64
return %ret0: i64
}
func.func @device_kernel_tiling_0(%arg0: tensor<?x?xf16>,
%arg1: i64 {hacc.tiling_data}) -> tensor<?x?xf16>
attributes {hacc.function_kind = #hacc.function_kind<DEVICE>, hacc.tiling_func = "tiling_func"} {
"some_use"(%arg1) : (i64) -> ()
%arg2 = arith.constant 32 : i64
"some_use"(%arg2) : (i64) -> ()
%ret0 = "some_op"(%arg0) : (tensor<?x?xf16>) -> tensor<?x?xf16>
return %ret0 : tensor<?x?xf16>
}
func.func @device_kernel_tiling_1(%arg0: tensor<?x?xf16>,
%arg1: i64 {hacc.tiling_data}) -> tensor<?x?xf16>
attributes {hacc.function_kind = #hacc.function_kind<DEVICE>, hacc.tiling_func = "tiling_func"} {
"some_use"(%arg1) : (i64) -> ()
%arg2 = arith.constant 32 : i64
"some_use"(%arg2) : (i64) -> ()
%ret0 = "some_op"(%arg0) : (tensor<?x?xf16>) -> tensor<?x?xf16>
return %ret0 : tensor<?x?xf16>
}
func.func @main(%arg0: tensor<?x?xf16>,
%arg1: i64 {hacc.tiling_data}) -> tensor<?x?xf16>
attributes {hacc.function_kind = #hacc.function_kind<HOST>} {
%0 = arith.index_castui %arg1 : i64 to index
%1 = scf.index_switch %0 -> tensor<?x?xf16>
case 1 {
%2 = func.call @device_kernel_tiling_1(%arg0, %arg1) : (tensor<?x?xf16>, i64) -> tensor<?x?xf16>
scf.yield %2 : tensor<?x?xf16>
}
case 0 {
%2 = func.call @device_kernel_tiling_0(%arg0, %arg1): (tensor<?x?xf16>, i64) -> tensor<?x?xf16>
scf.yield %2 : tensor<?x?xf16>
}
default {
%false = arith.constant false
cf.assert %false, "Invalid tiling key"
%2 = ub.poison : tensor<?x?xf16>
scf.yield %2 : tensor<?x?xf16>
}
return %1 : tensor<?x?xf16>
}
-hfusion-convert-generic-to-named¶
功能:将linalg通用算子转换为linalg命名算子与hfusion命名算子。
-hfusion-decompose¶
功能:分解所有实现了AggregatedOpInterface接口的算子。
选项:
-hfusion-decompose-phase:指定执行的分解阶段。
-hfusion-decompose-multi¶
功能:将组合算子拆解为多个独立的单算子。
-hfusion-downgrade-fp64¶
功能:将fp64精度的常量降级为fp32精度。
-hfusion-drop-symbols¶
功能:从算子中移除Ranked Tensor符号标记。
-hfusion-eliminate-duplicate-funcs¶
功能:消除融合后产生的重复函数。
-hfusion-flatten-ops¶
功能:对linalg与hfusion算子执行展平处理。
选项:
-flatten-mode:设置展平模式,tidy模式会对全函数做全局分析。-skip-host:是否跳过Host端函数的处理。-multi-dynamic-shape:是否合并多个动态Shape。
-hfusion-fold-symbolic-dim¶
功能:将tensor.dim的源操作数替换为hfusion::SymbolicDimOp。
-hfusion-fuse-ops¶
功能:基于HFusion框架融合Tensor上的算子。
选项:
-output-mode:函数输出提取模式,默认为multi,可选single、single-aggr。-fusion-mode:按标签区分融合类型。-always-inline:对提取出的函数启用强制内联。-move-out-to-param:是否将输出Tensor转为入参形式。-max-horizontal-fusion-size:允许的最大水平(无依赖)融合数,-1表示无限制尝试水平融合。-multi-kernel:关闭时强制将计算图融合为单个Kernel;开启时可拆分为多个Kernel。-enable-symbol-analysis:启用符号方言(Symbol Dialect)分析。
-hfusion-hoist-tensor-empty¶
功能:将tensor.empty提升为函数入参,并合并为统一参数。该Pass会把函数内所有tensor.empty操作整合为单个函数入参。
-hfusion-infer-func-fusion-kind¶
功能:自动推断函数的融合类型。
-hfusion-infer-out-shapes¶
功能:为Kernel生成输出Tensor的Shape推导函数。
-hfusion-inline-brc¶
功能:内联广播类算子。
-hfusion-legalize-bf16¶
功能:将BF16类型统一规范化为FP32类型。
-hfusion-legalize-bool¶
功能:输入侧将int8转换为int1,输出侧将int1转换回int8。
-hfusion-normalize-ops¶
功能:对Hfusion算子执行归一化处理。
-hfusion-normalize-slice-ops¶
功能:对Slice算子执行归一化处理。
选项:
-skip-aligned-slice:针对对齐的Slice,跳过FoldInsertSliceToConcat优化模式。
-hfusion-outline-single-op¶
功能:将单个linalg算子提取为独立Kernel。
选项:
-move-out-to-param:是否将输出Tensor转为入参形式。
-hfusion-pack-tiling-data¶
功能:将动态Tiling信息打包封装为结构体。
选项:
-include-symbols:指定转换生效的符号列表,以逗号分隔;为空时默认对所有函数生效。-emit-get-tiling-struct-size-function:开启后生成一个主机函数,返回Tiling数据总量(i64类型)。-pack-tiling-key:开启时将Tiling Key一同打包进结构体;关闭时Tiling Key直接写入指针。
-hfusion-recache-io¶
功能:对IO执行二次缓存。
-hfusion-reorder-ops¶
功能:按广度优先(BFS)顺序重排算子。
-hfusion-simplify-ops¶
功能:简化算子表达式。
-hfusion-tensor-results-to-out-params¶
功能:将Tensor返回值转为函数输出参数。
选项:
-include-symbols:指定转换生效的符号列表,以逗号分隔;为空时默认对所有函数生效。-enable-manage-host-resources:启用Host端函数的资源管理。
-hfusion-unfold-symbolic-dim¶
功能:将hfusion::SymbolicDimOp替换为对应的符号参数。
-hfusion-wrap-host-func¶
功能:为指定的Host端相关函数创建包装器,覆盖主机端Tiling函数、Shape推导函数等场景。
选项:
-remove-unused-arguments:是否移除主机包装函数中未使用的参数。