是什么
Pass又称transform,每一个transform要么把现有程序转换并优化为一个等价的程序,要么把程序lower到下层。
Pass和Schedule的区别在于,前者包括一些Schedule Primitives(调度原语),其用于生成IR,而后者是提供了修改IR的方法。
TVM中的Pass有两种:
- Relay层的Pass。relay/transforms/包括很多优化图结构用的Pass,包括fusion(图融合),常量折叠(constant folding)和死代码删除(dead-code elimination)等。属于前端优化。
- TIR层的Pass。tir/transforms包括偏向编译器方面的优化,比如prefetch注入,unrollLoop等。属于后端优化。
实现上,Pass分为:
- Module-Level Pass
- 利用全局信息进行优化
- 可以删减Function,如DSE Pass
- 核心Pass函数是PackedFunc类型
- Function-Level Pass
- 对Module中的每个Function进行优化,只有局部信息
- 不允许删减Function
Pass的转化逻辑可以简化为:IRModule -> Pass -> … -> IRModule
这里拿tests/python/relay/test_pass_fold_constant.py里的单测作为例子: