理论
预备知识
- 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


1811

被折叠的 条评论
为什么被折叠?



