TVM TIR Pass - Lower Intrin/legalization 优化原理和代码解析

理论

预备知识

  • LLVM。LLVM是一个后端编译器组件,支持ARM/x86。在目标平台上,TVM生成的代码会交给LLVM继续编译和优化。
  • LLVM Instrinsic function(LLVM内置函数),简单来说就是LLVM的函数API。一般来讲性能良好。llvm official doc
  • Lower(我翻译成“下译”),指将IR映射成更偏硬件的过程。

是什么

Lower Intrin(sic)是TIR的Pass之一。它将TIR函数映射映射到LLVM的内置函数。

Lower Intrin和legalization(合法化)类似。它们的区别在于是否是直译。前者支持原函数到LLVM内置函数的直接映射,而后者支持在原函数没有对应内置函数时,将原函数转译为内置函数可表达的函数。例如,exp=>llvm.exp属于lower,而因为LLVM没有sigmoid,将sigmoid(x)先转译为1/(1+exp(x)),之后还是要通过exp=>llvm.exp。可见legalization还是要通过下译的。

规定LLVM的内置函数前缀为"llvm.*",这里列举了所有的内置函数。而intrin_rule_llvm.cc里也同样列举了tir算子到内置函数的映射关系。注意,有FLowerIntrinsic注册的算子,其在llvm中自然能找到同名的内置函数。而有FLegalize注册的tir算子,则没有对应关系。

目标平台可以是别的,比如CUDA,不一定是LLVM。

代码解析

来看CallNode的解析:

  PrimExpr VisitExpr_(const CallNode* op) final {
   
   
    if (auto* ptr_op = op->op
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值