You are viewing a plain text version of this content. The canonical link for it is here.
Posted to discuss-archive@tvm.apache.org by JC Li via TVM Discuss <no...@discuss.tvm.ai> on 2020/04/29 07:09:03 UTC

[TVM Discuss] [Questions] Why FoldConstant optimization needs schedule ops?


I'm stumbled by the same confusion when tracing the FoldConstant optimization pass. Some of my debug print shows the process as below. 

I don't know why (**anyone, please explain if you know**) but Relay kicks the 'whole compilation process' by using the Interpreter (interpreter.cc). 
* 'EtaExpand' Pass is explicitly listed out in FoldConstant its own Sequential pass. 
* 'FuseOps' Pass is triggered by ConstEvaluate(expr) function in ConstantFolder class. 
* 'InferType' Pass is triggered as a dependent pass from 'FuseOps'.
* Then CompileEngineImpl::JIT(key) is called to do JIT compilation which kicks off backend lower_call() to select from TOPI schedule implementations.
* The process goes on with lower level IR passes, such as tir.ThreadSync, tir.SplitHostDevice etc. 

According to Relay document, the 'Interpreter' is for 'debug' purpose mainly, or a quick and dirty implementation. 

```
transform.cc SequentialNode::operator(), pass name:FoldConstant
transform.cc SequentialNode::operator(), pass name:EtaExpand
transform.cc SequentialNode::operator(), pass name:FuseOps
transform.cc SequentialNode::operator(), resolved dependency pass name:InferType
transform.cc SequentialNode::operator(), pass name:InferType
interpreter.cc VisitExpr_(CallNode*): Invoke() -> calls JIT(key)
CompileEngineImpl::JIT(key)
Inside compile_engine.cc VisitExpr_(CallNode)
 Calling into Python relay.backend.lower_call()
tvm/python/tvm/relay/backend/compile_engine.py, select_implementation(), op.name= multiply
  valid implementation  0 :  injective.cpu plevel= 10
  selected best_plevel_implementation:  injective.cpu
Use implementation injective.cpu for op multiply
tvm/python/tvm/relay/backend/_backend.py: lower function:  fused_multiply
lower phase 0
lower phase 1
lower phase 2
lower phase 3
produce T_multiply {
  T_multiply[ramp(0, 1, 16)] = (x16(placeholder[0])*placeholder[ramp(0, 1, 16)])
}

transform.cc SequentialNode::operator(), pass name:_transform
transform.cc SequentialNode::operator(), pass name:tir.ThreadSync
transform.cc SequentialNode::operator(), pass name:tir.ThreadSync
transform.cc SequentialNode::operator(), pass name:tir.InferFragment
transform.cc SequentialNode::operator(), pass name:tir.LowerThreadAllreduce
transform.cc SequentialNode::operator(), pass name:tir.BindDeviceType
transform.cc SequentialNode::operator(), pass name:tir.SplitHostDevice
transform.cc SequentialNode::operator(), pass name:_transform
transform.cc SequentialNode::operator(), pass name:tir.LowerWarpMemory
transform.cc SequentialNode::operator(), pass name:tir.LowerDeviceStorageAccessInfo
transform.cc SequentialNode::operator(), pass name:tir.LowerIntrin
transform.cc SequentialNode::operator(), pass name:_transform
transform.cc SequentialNode::operator(), pass name:_transform
transform.cc SequentialNode::operator(), pass name:tir.LowerTVMBuiltin
transform.cc SequentialNode::operator(), pass name:tir.LowerDeviceStorageAccessInfo
transform.cc SequentialNode::operator(), pass name:tir.LowerIntrin
transform.cc SequentialNode::operator(), pass name:tir.CombineContextCall
runtime::Module Build(): target.build.llvm
```





---
[Visit Topic](https://discuss.tvm.ai/t/why-foldconstant-optimization-needs-schedule-ops/5259/4) to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click here](https://discuss.tvm.ai/email/unsubscribe/6c3589eb326ab766da8da6cd99259f89bc9418bc4d9501ba487a291913206c70).