You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by tq...@apache.org on 2026/10/02 11:50:50 UTC
(tvm-site) branch asf-site updated: deploying docs (apache/tvm@b38e214658c11cc6d188c425f20f4f1da51568ea)
This is an automated email from the ASF dual-hosted git repository.
tqchen pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/tvm-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 0059a813759 deploying docs (apache/tvm@b38e214658c11cc6d188c425f20f4f1da51568ea)
0059a813759 is described below
commit 0059a813759ad991a3148d32bd41adc97b569c1a
Author: tvm-bot <95...@users.noreply.github.com>
AuthorDate: Fri Oct 2 11:50:41 2026 +0000
deploying docs (apache/tvm@b38e214658c11cc6d188c425f20f4f1da51568ea)
---
.../import_model.zip | Bin 35138 -> 35138 bytes
.../dlight_gpu_scheduling.zip | Bin 26311 -> 26311 bytes
.../11c11e53c7dace51a8be968ee169ed0d/ir_module.zip | Bin 23756 -> 23756 bytes
.../tir_transformation.zip | Bin 15990 -> 15990 bytes
.../meta_schedule.zip | Bin 24239 -> 24239 bytes
.../mix_python_and_tvm_with_pymodule.zip | Bin 38278 -> 38278 bytes
.../relax_creation.zip | Bin 22298 -> 22298 bytes
.../relax_transformation.zip | Bin 11480 -> 11480 bytes
.../optimize_llm.zip | Bin 53997 -> 53997 bytes
.../bring_your_own_codegen.zip | Bin 36295 -> 36295 bytes
.../e2e_opt_model.zip | Bin 14479 -> 14479 bytes
.../quick_start.zip | Bin 16252 -> 16252 bytes
.../export_and_load_executable.zip | Bin 31408 -> 31408 bytes
.../tir_creation.zip | Bin 24476 -> 24476 bytes
.../cross_compilation_and_rpc.zip | Bin 62286 -> 62286 bytes
.../customize_opt.zip | Bin 20522 -> 20522 bytes
docs/_sources/arch/tvmscript.rst | 23 +-
.../deep_dive/relax/tutorials/relax_creation.rst | 176 +-
.../relax/tutorials/relax_transformation.rst | 312 +-
.../relax/tutorials/sg_execution_times.rst | 6 +-
.../tensor_ir/tutorials/dlight_gpu_scheduling.rst | 556 +-
.../tensor_ir/tutorials/sg_execution_times.rst | 10 +-
.../deep_dive/tensor_ir/tutorials/tir_creation.rst | 92 +-
.../tensor_ir/tutorials/tir_transformation.rst | 269 +-
docs/_sources/get_started/tutorials/ir_module.rst | 328 +-
.../_sources/get_started/tutorials/quick_start.rst | 6 +-
.../get_started/tutorials/sg_execution_times.rst | 6 +-
.../how_to/tutorials/bring_your_own_codegen.rst | 14 +-
.../how_to/tutorials/cross_compilation_and_rpc.rst | 6 +-
docs/_sources/how_to/tutorials/customize_opt.rst | 96 +-
docs/_sources/how_to/tutorials/e2e_opt_model.rst | 2 +-
docs/_sources/how_to/tutorials/import_model.rst | 8 +-
docs/_sources/how_to/tutorials/optimize_llm.rst | 6 +-
.../how_to/tutorials/sg_execution_times.rst | 16 +-
.../reference/api/python/script/ir_builder.rst | 2 +-
.../reference/api/python/script/printer.rst | 4 +-
docs/_sources/sg_execution_times.rst | 34 +-
docs/arch/tvmscript.html | 22 +-
docs/commit_hash | 2 +-
docs/deep_dive/relax/tutorials/relax_creation.html | 188 +-
.../relax/tutorials/relax_transformation.html | 320 +-
.../relax/tutorials/sg_execution_times.html | 6 +-
.../tensor_ir/tutorials/dlight_gpu_scheduling.html | 560 +-
.../tensor_ir/tutorials/sg_execution_times.html | 10 +-
.../tensor_ir/tutorials/tir_creation.html | 96 +-
.../tensor_ir/tutorials/tir_transformation.html | 279 +-
docs/genindex.html | 12 +-
docs/get_started/tutorials/ir_module.html | 338 +-
docs/get_started/tutorials/quick_start.html | 8 +-
docs/get_started/tutorials/sg_execution_times.html | 6 +-
docs/how_to/tutorials/bring_your_own_codegen.html | 14 +-
.../tutorials/cross_compilation_and_rpc.html | 6 +-
docs/how_to/tutorials/customize_opt.html | 102 +-
docs/how_to/tutorials/e2e_opt_model.html | 4 +-
docs/how_to/tutorials/import_model.html | 10 +-
docs/how_to/tutorials/optimize_llm.html | 6 +-
docs/how_to/tutorials/sg_execution_times.html | 16 +-
docs/objects.inv | Bin 26408 -> 26435 bytes
docs/reference/api/doxygen/annotated.html | 78 +-
docs/reference/api/doxygen/base__expr_8h.html | 2 +-
.../api/doxygen/base__expr_8h__dep__incl.svg | 5698 +++++++++----------
docs/reference/api/doxygen/classes.html | 12 +-
docs/reference/api/doxygen/classtvm_1_1Call.html | 2 +-
docs/reference/api/doxygen/classtvm_1_1Op.html | 8 +-
docs/reference/api/doxygen/classtvm_1_1OpDef.html | 4 +-
.../classtvm_1_1PrinterConfigNode-members.html | 10 +-
.../api/doxygen/classtvm_1_1PrinterConfigNode.html | 89 +-
.../classtvm_1_1PrinterConfigNode__coll__graph.svg | 63 +-
...asstvm_1_1PrinterConfigNode__inherit__graph.svg | 63 +-
.../classtvm_1_1TVMScriptPrinter-members.html | 91 -
.../api/doxygen/classtvm_1_1TVMScriptPrinter.html | 207 -
.../classtvm_1_1TVMScriptPrinter__coll__graph.svg | 29 -
...stvm_1_1script_1_1printer_1_1AssertDocNode.html | 2 +-
...stvm_1_1script_1_1printer_1_1AssignDocNode.html | 2 +-
..._1_1script_1_1printer_1_1AttrAccessDocNode.html | 2 +-
...sstvm_1_1script_1_1printer_1_1BreakDocNode.html | 2 +-
...asstvm_1_1script_1_1printer_1_1CallDocNode.html | 2 +-
...sstvm_1_1script_1_1printer_1_1ClassDocNode.html | 2 +-
...tvm_1_1script_1_1printer_1_1CommentDocNode.html | 2 +-
...vm_1_1script_1_1printer_1_1ContinueDocNode.html | 2 +-
...asstvm_1_1script_1_1printer_1_1DictDocNode.html | 2 +-
.../classtvm_1_1script_1_1printer_1_1Doc.html | 2 +-
.../classtvm_1_1script_1_1printer_1_1DocNode.html | 6 +-
...cript_1_1printer_1_1DocNode__inherit__graph.svg | 1022 ++--
...m_1_1script_1_1printer_1_1DocStringDocNode.html | 2 +-
...cript_1_1printer_1_1DocTranslator-members.html} | 10 +-
...tvm_1_1script_1_1printer_1_1DocTranslator.html} | 95 +-
...ipt_1_1printer_1_1DocTranslatorObj-members.html | 109 +
...m_1_1script_1_1printer_1_1DocTranslatorObj.html | 975 ++++
...1_1printer_1_1DocTranslatorObj__coll__graph.svg | 76 +
...printer_1_1DocTranslatorObj__inherit__graph.svg | 76 +
...pt_1_1printer_1_1DocTranslator__coll__graph.svg | 54 +
...1_1printer_1_1DocTranslator__inherit__graph.svg | 54 +
...1_1script_1_1printer_1_1Doc__inherit__graph.svg | 654 +--
.../classtvm_1_1script_1_1printer_1_1ExprDoc.html | 2 +-
...asstvm_1_1script_1_1printer_1_1ExprDocNode.html | 4 +-
...t_1_1printer_1_1ExprDocNode__inherit__graph.svg | 240 +-
...cript_1_1printer_1_1ExprDoc__inherit__graph.svg | 192 +-
...vm_1_1script_1_1printer_1_1ExprStmtDocNode.html | 2 +-
...stvm_1_1script_1_1printer_1_1ExprStringDoc.html | 4 +-
..._1_1script_1_1printer_1_1ExprStringDocNode.html | 2 +-
...lasstvm_1_1script_1_1printer_1_1ForDocNode.html | 2 +-
.../classtvm_1_1script_1_1printer_1_1Frame.html | 268 -
...classtvm_1_1script_1_1printer_1_1FrameNode.html | 437 --
...script_1_1printer_1_1FrameNode__coll__graph.svg | 195 -
...ipt_1_1printer_1_1FrameNode__inherit__graph.svg | 72 -
..._1_1script_1_1printer_1_1Frame__coll__graph.svg | 60 -
...1script_1_1printer_1_1Frame__inherit__graph.svg | 60 -
...vm_1_1script_1_1printer_1_1FunctionDocNode.html | 2 +-
..._1script_1_1printer_1_1IRDocsifier-members.html | 92 -
...asstvm_1_1script_1_1printer_1_1IRDocsifier.html | 236 -
...1_1script_1_1printer_1_1IRDocsifierFunctor.html | 426 --
...1printer_1_1IRDocsifierFunctor__coll__graph.svg | 41 -
...ript_1_1printer_1_1IRDocsifierNode-members.html | 110 -
...vm_1_1script_1_1printer_1_1IRDocsifierNode.html | 754 ---
..._1_1printer_1_1IRDocsifierNode__coll__graph.svg | 141 -
...1printer_1_1IRDocsifierNode__inherit__graph.svg | 92 -
...ript_1_1printer_1_1IRDocsifier__coll__graph.svg | 56 -
...t_1_1printer_1_1IRDocsifier__inherit__graph.svg | 56 -
...classtvm_1_1script_1_1printer_1_1IdDocNode.html | 2 +-
...classtvm_1_1script_1_1printer_1_1IfDocNode.html | 2 +-
...sstvm_1_1script_1_1printer_1_1IndexDocNode.html | 2 +-
...stvm_1_1script_1_1printer_1_1LambdaDocNode.html | 2 +-
...asstvm_1_1script_1_1printer_1_1ListDocNode.html | 2 +-
...lasstvm_1_1script_1_1printer_1_1LiteralDoc.html | 48 +-
...tvm_1_1script_1_1printer_1_1LiteralDocNode.html | 2 +-
...script_1_1printer_1_1NamespaceDoc-members.html} | 22 +-
...stvm_1_1script_1_1printer_1_1NamespaceDoc.html} | 68 +-
...pt_1_1printer_1_1NamespaceDocNode-members.html} | 29 +-
..._1_1script_1_1printer_1_1NamespaceDocNode.html} | 64 +-
...1_1printer_1_1NamespaceDocNode__coll__graph.svg | 126 +
...printer_1_1NamespaceDocNode__inherit__graph.svg | 126 +
...ipt_1_1printer_1_1NamespaceDoc__coll__graph.svg | 115 +
..._1_1printer_1_1NamespaceDoc__inherit__graph.svg | 115 +
...stvm_1_1script_1_1printer_1_1OpCallDocNode.html | 2 +-
...m_1_1script_1_1printer_1_1OperationDocNode.html | 2 +-
...stvm_1_1script_1_1printer_1_1ReturnDocNode.html | 2 +-
...m_1_1script_1_1printer_1_1ScopeDoc-members.html | 2 +-
.../classtvm_1_1script_1_1printer_1_1ScopeDoc.html | 19 +-
...1script_1_1printer_1_1ScopeDocNode-members.html | 21 +-
...sstvm_1_1script_1_1printer_1_1ScopeDocNode.html | 25 +-
...ipt_1_1printer_1_1ScopeDocNode__coll__graph.svg | 188 +-
..._1_1printer_1_1ScopeDocNode__inherit__graph.svg | 122 +-
...sstvm_1_1script_1_1printer_1_1SliceDocNode.html | 2 +-
...m_1_1script_1_1printer_1_1StmtBlockDocNode.html | 2 +-
...asstvm_1_1script_1_1printer_1_1StmtDocNode.html | 2 +-
...t_1_1printer_1_1StmtDocNode__inherit__graph.svg | 40 +-
...sstvm_1_1script_1_1printer_1_1TupleDocNode.html | 2 +-
...sstvm_1_1script_1_1printer_1_1WhileDocNode.html | 2 +-
docs/reference/api/doxygen/config_8h.html | 6 +-
.../reference/api/doxygen/config_8h__dep__incl.svg | 69 +-
docs/reference/api/doxygen/config_8h_source.html | 174 +-
docs/reference/api/doxygen/cow_8h.html | 2 +-
docs/reference/api/doxygen/cow_8h__dep__incl.svg | 5798 ++++++++++----------
.../api/doxygen/device__api_8h__dep__incl.svg | 90 +-
docs/reference/api/doxygen/dir_000022_000013.html | 2 +-
docs/reference/api/doxygen/dir_000030_000013.html | 2 +-
.../dir_84875704194fd544d29fe0c7fedd8939_dep.svg | 4 +-
.../dir_a59a89c7dd2e4e6561fe59bf359ce2f3.html | 6 +-
.../dir_a59a89c7dd2e4e6561fe59bf359ce2f3_dep.svg | 4 +-
.../dir_b4c7d8e826c599ba55146c099a14beb5_dep.svg | 4 +-
docs/reference/api/doxygen/doc_8h.html | 21 +-
docs/reference/api/doxygen/doc_8h__dep__incl.svg | 20 +-
docs/reference/api/doxygen/doc_8h_source.html | 2229 ++++----
docs/reference/api/doxygen/doc__translator_8h.html | 157 +
.../api/doxygen/doc__translator_8h__incl.svg | 1283 +++++
.../api/doxygen/doc__translator_8h_source.html | 387 ++
docs/reference/api/doxygen/files.html | 5 +-
docs/reference/api/doxygen/functions.html | 2 +-
docs/reference/api/doxygen/functions_a.html | 12 +-
docs/reference/api/doxygen/functions_b.html | 5 +-
docs/reference/api/doxygen/functions_c.html | 15 +-
docs/reference/api/doxygen/functions_d.html | 15 +-
docs/reference/api/doxygen/functions_e.html | 11 +-
docs/reference/api/doxygen/functions_f.html | 6 +-
docs/reference/api/doxygen/functions_func.html | 10 +-
docs/reference/api/doxygen/functions_func_b.html | 4 +-
docs/reference/api/doxygen/functions_func_c.html | 5 +-
docs/reference/api/doxygen/functions_func_d.html | 8 +-
docs/reference/api/doxygen/functions_func_e.html | 10 +-
docs/reference/api/doxygen/functions_func_f.html | 1 -
docs/reference/api/doxygen/functions_func_g.html | 14 +-
docs/reference/api/doxygen/functions_func_i.html | 6 +-
docs/reference/api/doxygen/functions_func_n.html | 1 +
docs/reference/api/doxygen/functions_func_o.html | 6 +-
docs/reference/api/doxygen/functions_func_r.html | 10 +-
docs/reference/api/doxygen/functions_func_s.html | 10 +-
docs/reference/api/doxygen/functions_func_t.html | 7 +-
docs/reference/api/doxygen/functions_func_v.html | 9 +-
docs/reference/api/doxygen/functions_func_w.html | 3 +-
docs/reference/api/doxygen/functions_func_~.html | 2 -
docs/reference/api/doxygen/functions_g.html | 13 +-
docs/reference/api/doxygen/functions_i.html | 8 +-
docs/reference/api/doxygen/functions_k.html | 4 +-
docs/reference/api/doxygen/functions_m.html | 1 -
docs/reference/api/doxygen/functions_n.html | 3 +-
docs/reference/api/doxygen/functions_o.html | 11 +-
docs/reference/api/doxygen/functions_r.html | 8 +-
docs/reference/api/doxygen/functions_s.html | 12 +-
docs/reference/api/doxygen/functions_t.html | 12 +-
docs/reference/api/doxygen/functions_type.html | 7 +-
docs/reference/api/doxygen/functions_v.html | 17 +-
docs/reference/api/doxygen/functions_vars.html | 2 +-
docs/reference/api/doxygen/functions_vars_a.html | 2 +
docs/reference/api/doxygen/functions_vars_b.html | 1 +
docs/reference/api/doxygen/functions_vars_c.html | 6 +-
docs/reference/api/doxygen/functions_vars_d.html | 4 +-
docs/reference/api/doxygen/functions_vars_e.html | 1 +
docs/reference/api/doxygen/functions_vars_f.html | 3 +-
docs/reference/api/doxygen/functions_vars_g.html | 3 +-
docs/reference/api/doxygen/functions_vars_i.html | 2 -
docs/reference/api/doxygen/functions_vars_m.html | 1 -
docs/reference/api/doxygen/functions_vars_n.html | 2 +-
docs/reference/api/doxygen/functions_vars_o.html | 1 -
docs/reference/api/doxygen/functions_vars_s.html | 4 +-
docs/reference/api/doxygen/functions_vars_t.html | 1 +
docs/reference/api/doxygen/functions_vars_v.html | 1 +
docs/reference/api/doxygen/functions_w.html | 1 +
docs/reference/api/doxygen/functions_~.html | 2 -
docs/reference/api/doxygen/hierarchy.html | 292 +-
docs/reference/api/doxygen/inherit_graph_100.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_101.svg | 21 -
docs/reference/api/doxygen/inherit_graph_102.svg | 21 -
docs/reference/api/doxygen/inherit_graph_3.svg | 3658 ++++++------
docs/reference/api/doxygen/inherit_graph_4.svg | 2368 ++++----
docs/reference/api/doxygen/inherit_graph_60.svg | 15 +-
docs/reference/api/doxygen/inherit_graph_61.svg | 12 +-
docs/reference/api/doxygen/inherit_graph_62.svg | 12 +-
docs/reference/api/doxygen/inherit_graph_63.svg | 4 +-
docs/reference/api/doxygen/inherit_graph_64.svg | 4 +-
docs/reference/api/doxygen/inherit_graph_65.svg | 4 +-
docs/reference/api/doxygen/inherit_graph_66.svg | 4 +-
docs/reference/api/doxygen/inherit_graph_67.svg | 4 +-
docs/reference/api/doxygen/inherit_graph_68.svg | 4 +-
docs/reference/api/doxygen/inherit_graph_69.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_70.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_71.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_72.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_73.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_74.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_75.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_76.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_77.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_78.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_79.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_80.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_81.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_82.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_83.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_84.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_85.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_86.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_87.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_88.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_89.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_90.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_91.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_92.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_93.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_94.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_95.svg | 35 +-
docs/reference/api/doxygen/inherit_graph_96.svg | 34 +-
docs/reference/api/doxygen/inherit_graph_97.svg | 13 +-
docs/reference/api/doxygen/inherit_graph_98.svg | 10 +-
docs/reference/api/doxygen/inherit_graph_99.svg | 13 +-
docs/reference/api/doxygen/inherits.html | 76 +-
docs/reference/api/doxygen/ir_2attrs_8h.html | 2 +-
.../api/doxygen/ir_2attrs_8h__dep__incl.svg | 5676 +++++++++----------
docs/reference/api/doxygen/ir_2expr_8h.html | 2 +-
.../api/doxygen/ir_2expr_8h__dep__incl.svg | 5600 +++++++++----------
.../api/doxygen/ir_2expr__functor_8h_source.html | 2 +-
docs/reference/api/doxygen/ir_2function_8h.html | 2 +-
.../api/doxygen/ir_2function_8h__dep__incl.svg | 3911 +++++++------
.../api/doxygen/ir_2global__info_8h__dep__incl.svg | 2353 ++++----
docs/reference/api/doxygen/ir_2op_8h.html | 3 +
docs/reference/api/doxygen/ir_2op_8h_source.html | 974 ++--
.../api/doxygen/ir_2op__attr__types_8h.html | 2 +-
.../doxygen/ir_2op__attr__types_8h__dep__incl.svg | 5610 +++++++++----------
.../api/doxygen/ir_2prim_2builtin_8h_source.html | 2 +-
docs/reference/api/doxygen/ir_2type_8h.html | 2 +-
.../api/doxygen/ir_2type_8h__dep__incl.svg | 4071 +++++++-------
docs/reference/api/doxygen/ir__docsifier_8h.html | 135 -
.../api/doxygen/ir__docsifier_8h__incl.svg | 1626 ------
.../api/doxygen/ir__docsifier_8h_source.html | 428 --
.../api/doxygen/ir__docsifier__functor_8h.html | 125 -
.../ir__docsifier__functor_8h__dep__incl.svg | 42 -
.../doxygen/ir__docsifier__functor_8h__incl.svg | 167 -
.../doxygen/ir__docsifier__functor_8h_source.html | 264 -
docs/reference/api/doxygen/menudata.js | 1 -
docs/reference/api/doxygen/module_8h.html | 2 +-
.../reference/api/doxygen/module_8h__dep__incl.svg | 2139 ++++----
docs/reference/api/doxygen/namespacemembers.html | 2 +-
docs/reference/api/doxygen/namespacemembers_d.html | 6 +-
docs/reference/api/doxygen/namespacemembers_f.html | 1 +
.../api/doxygen/namespacemembers_func_d.html | 8 +-
.../api/doxygen/namespacemembers_func_g.html | 1 +
.../api/doxygen/namespacemembers_func_o.html | 2 +-
.../api/doxygen/namespacemembers_func_r.html | 5 +-
.../api/doxygen/namespacemembers_func_s.html | 10 +-
.../api/doxygen/namespacemembers_func_t.html | 1 +
docs/reference/api/doxygen/namespacemembers_g.html | 1 +
docs/reference/api/doxygen/namespacemembers_k.html | 3 +
docs/reference/api/doxygen/namespacemembers_o.html | 2 +-
docs/reference/api/doxygen/namespacemembers_r.html | 3 +-
docs/reference/api/doxygen/namespacemembers_s.html | 8 +-
docs/reference/api/doxygen/namespacemembers_t.html | 2 +
.../api/doxygen/namespacemembers_type.html | 4 +-
.../api/doxygen/namespacemembers_vars.html | 3 +
docs/reference/api/doxygen/namespaces.html | 78 +-
docs/reference/api/doxygen/namespacetvm.html | 41 +-
...1_1script_1_1ir__builder_1_1s__tir_1_1axis.html | 64 +-
.../doxygen/namespacetvm_1_1script_1_1printer.html | 417 +-
.../api/doxygen/namespacetvm_1_1tirx.html | 4 +-
.../api/doxygen/object__functor_8h__dep__incl.svg | 381 +-
docs/reference/api/doxygen/printer_8h.html | 34 +-
docs/reference/api/doxygen/printer_8h__incl.svg | 419 +-
docs/reference/api/doxygen/printer_8h_source.html | 76 +-
.../doxygen/relax_2expr__functor_8h_source.html | 2 +-
docs/reference/api/doxygen/runtime_2base_8h.html | 2 +-
.../api/doxygen/runtime_2base_8h__dep__incl.svg | 4642 ++++++++--------
.../s__tir_2script_2ir__builder_2ir_8h.html | 24 +-
.../s__tir_2script_2ir__builder_2ir_8h_source.html | 50 +-
docs/reference/api/doxygen/search/all_0.js | 2 +-
docs/reference/api/doxygen/search/all_1.js | 326 +-
docs/reference/api/doxygen/search/all_12.js | 297 +-
docs/reference/api/doxygen/search/all_13.js | 446 +-
docs/reference/api/doxygen/search/all_14.js | 546 +-
docs/reference/api/doxygen/search/all_16.js | 193 +-
docs/reference/api/doxygen/search/all_17.js | 55 +-
docs/reference/api/doxygen/search/all_19.js | 54 +-
docs/reference/api/doxygen/search/all_2.js | 327 +-
docs/reference/api/doxygen/search/all_3.js | 331 +-
docs/reference/api/doxygen/search/all_4.js | 395 +-
docs/reference/api/doxygen/search/all_5.js | 219 +-
docs/reference/api/doxygen/search/all_6.js | 474 +-
docs/reference/api/doxygen/search/all_7.js | 242 +-
docs/reference/api/doxygen/search/all_9.js | 302 +-
docs/reference/api/doxygen/search/all_b.js | 371 +-
docs/reference/api/doxygen/search/all_d.js | 99 +-
docs/reference/api/doxygen/search/all_e.js | 110 +-
docs/reference/api/doxygen/search/all_f.js | 195 +-
docs/reference/api/doxygen/search/classes_11.js | 51 +-
docs/reference/api/doxygen/search/classes_13.js | 27 +-
docs/reference/api/doxygen/search/classes_3.js | 17 +-
docs/reference/api/doxygen/search/classes_5.js | 26 +-
docs/reference/api/doxygen/search/classes_8.js | 39 +-
docs/reference/api/doxygen/search/classes_b.js | 22 +-
docs/reference/api/doxygen/search/files_3.js | 3 +-
docs/reference/api/doxygen/search/files_7.js | 4 +-
docs/reference/api/doxygen/search/functions_0.js | 180 +-
docs/reference/api/doxygen/search/functions_1.js | 176 +-
docs/reference/api/doxygen/search/functions_11.js | 177 +-
docs/reference/api/doxygen/search/functions_12.js | 238 +-
docs/reference/api/doxygen/search/functions_13.js | 154 +-
docs/reference/api/doxygen/search/functions_15.js | 125 +-
docs/reference/api/doxygen/search/functions_16.js | 41 +-
docs/reference/api/doxygen/search/functions_18.js | 54 +-
docs/reference/api/doxygen/search/functions_2.js | 25 +-
docs/reference/api/doxygen/search/functions_3.js | 64 +-
docs/reference/api/doxygen/search/functions_4.js | 106 +-
docs/reference/api/doxygen/search/functions_5.js | 97 +-
docs/reference/api/doxygen/search/functions_6.js | 161 +-
docs/reference/api/doxygen/search/functions_8.js | 182 +-
docs/reference/api/doxygen/search/functions_c.js | 2 +-
docs/reference/api/doxygen/search/functions_d.js | 65 +-
docs/reference/api/doxygen/search/functions_e.js | 12 +-
docs/reference/api/doxygen/search/typedefs_1.js | 2 +-
docs/reference/api/doxygen/search/typedefs_4.js | 3 +-
docs/reference/api/doxygen/search/typedefs_6.js | 93 +-
docs/reference/api/doxygen/search/typedefs_e.js | 25 +-
docs/reference/api/doxygen/search/variables_0.js | 4 +-
docs/reference/api/doxygen/search/variables_1.js | 68 +-
docs/reference/api/doxygen/search/variables_12.js | 96 +-
docs/reference/api/doxygen/search/variables_13.js | 21 +-
docs/reference/api/doxygen/search/variables_15.js | 31 +-
docs/reference/api/doxygen/search/variables_2.js | 49 +-
docs/reference/api/doxygen/search/variables_3.js | 44 +-
docs/reference/api/doxygen/search/variables_4.js | 100 +-
docs/reference/api/doxygen/search/variables_5.js | 33 +-
docs/reference/api/doxygen/search/variables_6.js | 33 +-
docs/reference/api/doxygen/search/variables_7.js | 15 +-
docs/reference/api/doxygen/search/variables_9.js | 44 +-
docs/reference/api/doxygen/search/variables_a.js | 119 +-
docs/reference/api/doxygen/search/variables_c.js | 27 +-
docs/reference/api/doxygen/search/variables_d.js | 2 +-
docs/reference/api/doxygen/search/variables_e.js | 49 +-
docs/reference/api/doxygen/source__map_8h.html | 2 +-
.../api/doxygen/source__map_8h__dep__incl.svg | 5738 +++++++++----------
...1_1printer_1_1DocTranslatorVTable-members.html} | 17 +-
..._1script_1_1printer_1_1DocTranslatorVTable.html | 317 ++
...printer_1_1DocTranslatorVTable__coll__graph.svg | 39 +
...printer_1_1IRDocsifierNode_1_1VariableInfo.html | 146 -
...RDocsifierNode_1_1VariableInfo__coll__graph.svg | 31 -
.../api/doxygen/tile__primitive_8h_source.html | 2 +-
.../api/doxygen/tirx_2builtin_8h_source.html | 2 +-
.../api/doxygen/tirx_2op__attr__types_8h.html | 2 +-
.../doxygen/tirx_2op__attr__types_8h_source.html | 2 +-
docs/reference/api/python/ir.html | 4 +-
docs/reference/api/python/relax/relax.html | 6 +-
docs/reference/api/python/script/ir_builder.html | 47 +
docs/reference/api/python/script/script.html | 29 +-
.../api/typedoc/classes/ArtifactCache.html | 14 +-
.../classes/ArtifactCrossOriginStorageCache.html | 12 +-
.../typedoc/classes/ArtifactIndexedDBCache.html | 16 +-
.../api/typedoc/classes/ArtifactOPFSCache.html | 14 +-
docs/reference/api/typedoc/classes/CacheState.html | 10 +-
docs/reference/api/typedoc/classes/DLDataType.html | 14 +-
docs/reference/api/typedoc/classes/DLDevice.html | 12 +-
docs/reference/api/typedoc/classes/Instance.html | 120 +-
docs/reference/api/typedoc/classes/LRUCache.html | 14 +-
.../classes/LinearCongruentialGenerator.html | 20 +-
docs/reference/api/typedoc/classes/Module.html | 16 +-
docs/reference/api/typedoc/classes/RPCServer.html | 16 +-
docs/reference/api/typedoc/classes/Scalar.html | 8 +-
docs/reference/api/typedoc/classes/TVMArray.html | 16 +-
docs/reference/api/typedoc/classes/TVMObject.html | 12 +-
docs/reference/api/typedoc/classes/Tensor.html | 36 +-
.../api/typedoc/classes/VirtualMachine.html | 10 +-
.../classes/_internal_.AsyncifyHandler.html | 14 +-
.../classes/_internal_.CachedCallStack.html | 38 +-
.../classes/_internal_.CanvasRenderManager.html | 10 +-
.../classes/_internal_.CrossOriginStorage.html | 12 +-
.../typedoc/classes/_internal_.Environment.html | 14 +-
.../api/typedoc/classes/_internal_.FFILibrary.html | 22 +-
.../api/typedoc/classes/_internal_.Memory.html | 50 +-
.../api/typedoc/classes/_internal_.OPFSStore.html | 16 +-
.../typedoc/classes/_internal_.PackedFuncCell.html | 12 +-
.../typedoc/classes/_internal_.RuntimeContext.html | 74 +-
.../typedoc/classes/_internal_.WebGPUContext.html | 30 +-
.../enums/_internal_.AsyncifyStateKind.html | 8 +-
.../typedoc/enums/_internal_.RPCServerState.html | 14 +-
docs/reference/api/typedoc/functions/assert.html | 2 +-
.../api/typedoc/functions/createArtifactCache.html | 2 +-
.../api/typedoc/functions/createPolyfillWASI.html | 2 +-
.../api/typedoc/functions/deleteTensorCache.html | 4 +-
.../api/typedoc/functions/detectGPUDevice.html | 2 +-
.../api/typedoc/functions/hasTensorInCache.html | 4 +-
.../api/typedoc/functions/instantiate.html | 2 +-
docs/reference/api/typedoc/functions/wasmPath.html | 2 +-
.../typedoc/interfaces/ArtifactCacheTemplate.html | 10 +-
.../api/typedoc/interfaces/Disposable.html | 4 +-
.../interfaces/FetchTensorCacheOptions.html | 12 +-
.../typedoc/interfaces/GPUDeviceDetectOutput.html | 8 +-
.../api/typedoc/interfaces/InitProgressReport.html | 8 +-
.../api/typedoc/interfaces/LibraryProvider.html | 6 +-
.../interfaces/TensorCacheAccessOptions.html | 10 +-
.../_internal_.CrossOriginHashDescriptor.html | 6 +-
.../_internal_.CrossOriginStorageAPI.html | 4 +-
.../_internal_.CrossOriginStorageHandle.html | 6 +-
...CrossOriginStorageRequestFileHandleOptions.html | 6 +-
.../_internal_.CrossOriginStorageWritable.html | 6 +-
.../interfaces/_internal_.FunctionInfo.html | 8 +-
.../interfaces/_internal_.OPFSDirectoryHandle.html | 8 +-
.../interfaces/_internal_.OPFSFileHandle.html | 8 +-
.../interfaces/_internal_.OPFSStorageManager.html | 4 +-
.../interfaces/_internal_.OPFSStoreRecord.html | 8 +-
.../interfaces/_internal_.OPFSStoredEntry.html | 6 +-
.../_internal_.OPFSSyncAccessHandle.html | 14 +-
.../_internal_.OPFSWritableFileStream.html | 6 +-
.../interfaces/_internal_.PackedCallFrame.html | 16 +-
.../interfaces/_internal_.TensorCacheEntry.html | 14 +-
.../interfaces/_internal_.TensorShardEntry.html | 10 +-
.../interfaces/_internal_.WasmByteArraySource.html | 8 +-
.../api/typedoc/types/ArtifactCacheType.html | 2 +-
.../api/typedoc/types/InitProgressCallback.html | 2 +-
.../api/typedoc/types/OPFSAccessMode.html | 2 +-
docs/reference/api/typedoc/types/PackedFunc.html | 2 +-
docs/reference/api/typedoc/types/RNGState.html | 2 +-
.../typedoc/types/_internal_.AsyncPackedFunc.html | 2 +-
.../types/_internal_.FObjectConstructor.html | 2 +-
.../types/_internal_.FTVMFFIWasmSafeCallType.html | 2 +-
.../types/_internal_.FTVMWasmAllocSpace.html | 2 +-
.../types/_internal_.FTVMWasmFreeSpace.html | 2 +-
.../types/_internal_.OPFSEffectiveAccessMode.html | 2 +-
.../types/_internal_.OPFSSyncAccessHandleMode.html | 2 +-
.../api/typedoc/types/_internal_.Pointer.html | 2 +-
.../api/typedoc/types/_internal_.RequestLike.html | 2 +-
.../typedoc/types/_internal_.TVMObjectBase.html | 2 +-
docs/searchindex.js | 2 +-
docs/sg_execution_times.html | 34 +-
docs/tirx/api/script.html | 19 +-
481 files changed, 44394 insertions(+), 45948 deletions(-)
diff --git a/docs/_downloads/050dda7aeddba33e083ae36606d3270f/import_model.zip b/docs/_downloads/050dda7aeddba33e083ae36606d3270f/import_model.zip
index 3c8e1eeb2af..a67caf679a6 100644
Binary files a/docs/_downloads/050dda7aeddba33e083ae36606d3270f/import_model.zip and b/docs/_downloads/050dda7aeddba33e083ae36606d3270f/import_model.zip differ
diff --git a/docs/_downloads/0eec6b3ea6ba863d0ed14b037c4b83ea/dlight_gpu_scheduling.zip b/docs/_downloads/0eec6b3ea6ba863d0ed14b037c4b83ea/dlight_gpu_scheduling.zip
index f0ba24df37a..399a5784aeb 100644
Binary files a/docs/_downloads/0eec6b3ea6ba863d0ed14b037c4b83ea/dlight_gpu_scheduling.zip and b/docs/_downloads/0eec6b3ea6ba863d0ed14b037c4b83ea/dlight_gpu_scheduling.zip differ
diff --git a/docs/_downloads/11c11e53c7dace51a8be968ee169ed0d/ir_module.zip b/docs/_downloads/11c11e53c7dace51a8be968ee169ed0d/ir_module.zip
index da6dce74ca3..4695c36ab45 100644
Binary files a/docs/_downloads/11c11e53c7dace51a8be968ee169ed0d/ir_module.zip and b/docs/_downloads/11c11e53c7dace51a8be968ee169ed0d/ir_module.zip differ
diff --git a/docs/_downloads/18ba0d2ee8120824175aaef66bc9c9bf/tir_transformation.zip b/docs/_downloads/18ba0d2ee8120824175aaef66bc9c9bf/tir_transformation.zip
index 3c506922b24..e6309b753f9 100644
Binary files a/docs/_downloads/18ba0d2ee8120824175aaef66bc9c9bf/tir_transformation.zip and b/docs/_downloads/18ba0d2ee8120824175aaef66bc9c9bf/tir_transformation.zip differ
diff --git a/docs/_downloads/249a4acaa182fd00b9c381b53025777d/meta_schedule.zip b/docs/_downloads/249a4acaa182fd00b9c381b53025777d/meta_schedule.zip
index 092c9d5ef9e..15a10c9cd5c 100644
Binary files a/docs/_downloads/249a4acaa182fd00b9c381b53025777d/meta_schedule.zip and b/docs/_downloads/249a4acaa182fd00b9c381b53025777d/meta_schedule.zip differ
diff --git a/docs/_downloads/373278b9f6fc686adeaa0219598fe78b/mix_python_and_tvm_with_pymodule.zip b/docs/_downloads/373278b9f6fc686adeaa0219598fe78b/mix_python_and_tvm_with_pymodule.zip
index e535bd120b1..4f559f9fb89 100644
Binary files a/docs/_downloads/373278b9f6fc686adeaa0219598fe78b/mix_python_and_tvm_with_pymodule.zip and b/docs/_downloads/373278b9f6fc686adeaa0219598fe78b/mix_python_and_tvm_with_pymodule.zip differ
diff --git a/docs/_downloads/4753776bbe68e7c9ee4d19117973fc8b/relax_creation.zip b/docs/_downloads/4753776bbe68e7c9ee4d19117973fc8b/relax_creation.zip
index 63ffcddadf3..5c21b66d115 100644
Binary files a/docs/_downloads/4753776bbe68e7c9ee4d19117973fc8b/relax_creation.zip and b/docs/_downloads/4753776bbe68e7c9ee4d19117973fc8b/relax_creation.zip differ
diff --git a/docs/_downloads/7d201684dfa095a5ea48d98e9a2ef7ad/relax_transformation.zip b/docs/_downloads/7d201684dfa095a5ea48d98e9a2ef7ad/relax_transformation.zip
index fdac34bfeb5..c6a4176284b 100644
Binary files a/docs/_downloads/7d201684dfa095a5ea48d98e9a2ef7ad/relax_transformation.zip and b/docs/_downloads/7d201684dfa095a5ea48d98e9a2ef7ad/relax_transformation.zip differ
diff --git a/docs/_downloads/83e85f38cf16f1d926d06615fd54095c/optimize_llm.zip b/docs/_downloads/83e85f38cf16f1d926d06615fd54095c/optimize_llm.zip
index a2588b2a9dc..dda58647b60 100644
Binary files a/docs/_downloads/83e85f38cf16f1d926d06615fd54095c/optimize_llm.zip and b/docs/_downloads/83e85f38cf16f1d926d06615fd54095c/optimize_llm.zip differ
diff --git a/docs/_downloads/8c05f1d580979a2c26428a509c07ed72/bring_your_own_codegen.zip b/docs/_downloads/8c05f1d580979a2c26428a509c07ed72/bring_your_own_codegen.zip
index de35cb6dfc9..26f4ecb8f92 100644
Binary files a/docs/_downloads/8c05f1d580979a2c26428a509c07ed72/bring_your_own_codegen.zip and b/docs/_downloads/8c05f1d580979a2c26428a509c07ed72/bring_your_own_codegen.zip differ
diff --git a/docs/_downloads/a7dd7652b2ad50f82d7b739ce3645799/e2e_opt_model.zip b/docs/_downloads/a7dd7652b2ad50f82d7b739ce3645799/e2e_opt_model.zip
index f811879ea37..9553edcf28e 100644
Binary files a/docs/_downloads/a7dd7652b2ad50f82d7b739ce3645799/e2e_opt_model.zip and b/docs/_downloads/a7dd7652b2ad50f82d7b739ce3645799/e2e_opt_model.zip differ
diff --git a/docs/_downloads/bb7db6678496193ed0c55d3b95fa6778/quick_start.zip b/docs/_downloads/bb7db6678496193ed0c55d3b95fa6778/quick_start.zip
index 0554d1b118e..d0d16890027 100644
Binary files a/docs/_downloads/bb7db6678496193ed0c55d3b95fa6778/quick_start.zip and b/docs/_downloads/bb7db6678496193ed0c55d3b95fa6778/quick_start.zip differ
diff --git a/docs/_downloads/bc875d02d5382abc9ea5fb9eb2c1de2c/export_and_load_executable.zip b/docs/_downloads/bc875d02d5382abc9ea5fb9eb2c1de2c/export_and_load_executable.zip
index b85ae902dcc..9b6721ce1d9 100644
Binary files a/docs/_downloads/bc875d02d5382abc9ea5fb9eb2c1de2c/export_and_load_executable.zip and b/docs/_downloads/bc875d02d5382abc9ea5fb9eb2c1de2c/export_and_load_executable.zip differ
diff --git a/docs/_downloads/be26483bb70b8468499a01c55e8e866c/tir_creation.zip b/docs/_downloads/be26483bb70b8468499a01c55e8e866c/tir_creation.zip
index de2b0ef7255..eda5f3f7ef6 100644
Binary files a/docs/_downloads/be26483bb70b8468499a01c55e8e866c/tir_creation.zip and b/docs/_downloads/be26483bb70b8468499a01c55e8e866c/tir_creation.zip differ
diff --git a/docs/_downloads/f69380821f417ef2210f45503d81bded/cross_compilation_and_rpc.zip b/docs/_downloads/f69380821f417ef2210f45503d81bded/cross_compilation_and_rpc.zip
index 82d5324fd0e..12c0cf6979f 100644
Binary files a/docs/_downloads/f69380821f417ef2210f45503d81bded/cross_compilation_and_rpc.zip and b/docs/_downloads/f69380821f417ef2210f45503d81bded/cross_compilation_and_rpc.zip differ
diff --git a/docs/_downloads/f69433a4a80715725df90d1386679956/customize_opt.zip b/docs/_downloads/f69433a4a80715725df90d1386679956/customize_opt.zip
index 286d594ee04..81d615446a6 100644
Binary files a/docs/_downloads/f69433a4a80715725df90d1386679956/customize_opt.zip and b/docs/_downloads/f69433a4a80715725df90d1386679956/customize_opt.zip differ
diff --git a/docs/_sources/arch/tvmscript.rst b/docs/_sources/arch/tvmscript.rst
index 51eb6b719eb..d7d64fb3d2d 100644
--- a/docs/_sources/arch/tvmscript.rst
+++ b/docs/_sources/arch/tvmscript.rst
@@ -29,7 +29,7 @@ printer converts IR back into readable, parseable source.
Source + definition context
→ Python AST → syntax transpiler → Python builder program → TVM IR
TVM IR
- → IRDocsifier → Doc tree → Python text
+ → DocTranslator → Doc tree + origins → diagnostic paths → Python text
Source and frontend
-------------------
@@ -139,9 +139,17 @@ protocol.
Printing and round trips
------------------------
-``IRDocsifier`` dispatches on IR types and context to produce a ``Doc`` tree of
-expressions and statements. It tracks scopes and names; ``DocToPythonScript`` formats
-the tree as Python text. This document tree is separate from the parser's Python AST.
+``DocTranslator`` invokes native type and operation hooks to produce a ``Doc`` tree
+of expressions and statements. The translation engine tracks scopes, names and each
+Doc's original IR object. The script entry point maps these origins to diagnostic
+paths; the private Doc printer formats the tree, annotations and underlines as Python
+text. Printer configuration stays read-only throughout. ``DocToPythonScript`` also
+formats an existing Doc directly. This tree is separate from the parser's Python AST.
+
+The public ``Script`` text entry points are declared in
+``tvm/script/printer/printer.h``. Their orchestration and diagnostic path mapping
+live in ``src/script/printer/printer.cc``; ``doc_translator.h`` exposes the
+IR-to-Doc translation protocol.
For example, a small function can be authored, printed and parsed again:
@@ -156,7 +164,7 @@ For example, a small function can be authored, printed and parsed again:
A[i] = A[i] + 1.0
text = increment.script()
- reparsed = tvm.script.from_source(text)
+ reparsed = tvm.script.from_source(text, extra_vars={"T": T})
tvm.ir.assert_structural_equal(increment, reparsed)
Printed source uses canonical forms rather than preserving the original spelling.
@@ -170,7 +178,10 @@ A language variant supplies construction hooks and a public script namespace, th
registers its aliases with ``register_namespace``. ``register_namespace_initializer``
supports lazy setup. ``tvm.script.register_dialect`` exposes a package through the
public script namespace. Syntax policies are registered beside the operations that
-need them, while IR printing is extended through docsifier registrations.
+need them. IR printing uses ``FDocTranslate`` hooks from
+``tvm/script/printer/doc_translator.h``, registered through the existing type or
+operation attributes. A hook returns an expression Doc or emits completed statements
+through its translator context.
This division keeps source acquisition, syntax translation and formatting shared.
Language-specific construction and validation remain with the namespace and its
diff --git a/docs/_sources/deep_dive/relax/tutorials/relax_creation.rst b/docs/_sources/deep_dive/relax/tutorials/relax_creation.rst
index e3a0f6e9ed5..3112ac0877a 100644
--- a/docs/_sources/deep_dive/relax/tutorials/relax_creation.rst
+++ b/docs/_sources/deep_dive/relax/tutorials/relax_creation.rst
@@ -77,6 +77,8 @@ high-level Relax operators using TVMScript.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -151,34 +153,38 @@ TensorIR functions in Relax function.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
- m = I.dynamic("m", dtype="int64")
n = I.dynamic("n", dtype="int64")
+ m = I.dynamic("m", dtype="int64")
@I.ir_module
class Module:
@Ts.prim_func
def relu(X: T.Buffer((n, m), "float32"), Y: T.Buffer((n, m), "float32")):
- # with Ts.sblock("root"):
- for i, j in T.grid(n, m):
- with Ts.sblock("relu"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(X[v, v_1])
- Ts.writes(Y[v, v_1])
- Y[v, v_1] = T.max(X[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i in range(T.int64(0), n):
+ for j in range(T.int64(0), m):
+ with Ts.sblock("relu"):
+ v = Ts.axis.spatial(n, i, dtype="int64")
+ v_1 = Ts.axis.spatial(m, j, dtype="int64")
+ Ts.reads(X[v, v_1])
+ Ts.writes(Y[v, v_1])
+ Y[v, v_1] = T.max(X[v, v_1], T.float32(0.0))
@R.function
def forward(data: R.Tensor((n, 784), dtype="float32"), w0: R.Tensor((128, 784), dtype="float32"), b0: R.Tensor((128,), dtype="float32"), w1: R.Tensor((10, 128), dtype="float32"), b1: R.Tensor((10,), dtype="float32")) -> R.Tensor((n, 10), dtype="float32"):
- cls = Module
with R.dataflow():
lv: R.Tensor((784, 128), dtype="float32") = R.permute_dims(w0, axes=None)
lv1: R.Tensor((n, 128), dtype="float32") = R.matmul(data, lv, out_dtype=None)
lv0: R.Tensor((n, 128), dtype="float32") = R.add(lv1, b0)
- lv1_1 = R.call_tir(cls.relu, (lv0,), out_ty=R.Tensor((n, 128), dtype="float32"))
+ lv1_1 = R.call_tir(Module.relu, (lv0,), out_ty=R.Tensor((n, 128), dtype="float32"))
lv4: R.Tensor((128, 10), dtype="float32") = R.permute_dims(w1, axes=None)
lv5: R.Tensor((n, 10), dtype="float32") = R.matmul(lv1_1, lv4, out_dtype=None)
lv2: R.Tensor((n, 10), dtype="float32") = R.add(lv5, b1)
@@ -274,6 +280,8 @@ After we define the NNModule, we can export it to TVM IRModule via
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -372,15 +380,16 @@ Tensor Expression(TE), TensorIR functions or other TVM packed functions.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
- K = I.dynamic("K", dtype="int64")
M = I.dynamic("M", dtype="int64")
+ K = I.dynamic("K", dtype="int64")
N = I.dynamic("N", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@I.ir_module
@@ -388,40 +397,51 @@ Tensor Expression(TE), TensorIR functions or other TVM packed functions.
@Ts.prim_func(private=True)
def relu(env_linear: T.Buffer((n, T.int64(128)), "float32"), compute: T.Buffer((n, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(n, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(env_linear[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(env_linear[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n):
+ for i1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(n, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ Ts.reads(env_linear[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(env_linear[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func
def tir_linear(X: T.Buffer((M, K), "float32"), W: T.Buffer((N, K), "float32"), B: T.Buffer((N,), "float32"), Z: T.Buffer((M, N), "float32")):
- # with Ts.sblock("root"):
- for i, j, k in T.grid(M, N, K):
- with Ts.sblock("linear"):
- v, v_1, v_2 = Ts.axis.remap("SSR", [i, j, k])
- Ts.reads(X[v, v_2], W[v_1, v_2])
- Ts.writes(Z[v, v_1])
- with Ts.init():
- Z[v, v_1] = T.float32(0.0)
- Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
- for i, j in T.grid(M, N):
- with Ts.sblock("add"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(Z[v, v_1], B[v_1])
- Ts.writes(Z[v, v_1])
- Z[v, v_1] = Z[v, v_1] + B[v_1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i in range(T.int64(0), M):
+ for j in range(T.int64(0), N):
+ for k in range(T.int64(0), K):
+ with Ts.sblock("linear"):
+ v = Ts.axis.spatial(M, i, dtype="int64")
+ v_1 = Ts.axis.spatial(N, j, dtype="int64")
+ v_2 = Ts.axis.reduce(K, k, dtype="int64")
+ Ts.reads(X[v, v_2], W[v_1, v_2])
+ Ts.writes(Z[v, v_1])
+ with Ts.init():
+ Z[v, v_1] = T.float32(0.0)
+ Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
+ for i_1 in range(T.int64(0), M):
+ for j_1 in range(T.int64(0), N):
+ with Ts.sblock("add"):
+ v_3 = Ts.axis.spatial(M, i_1, dtype="int64")
+ v_4 = Ts.axis.spatial(N, j_1, dtype="int64")
+ Ts.reads(Z[v_3, v_4], B[v_4])
+ Ts.writes(Z[v_3, v_4])
+ Z[v_3, v_4] = Z[v_3, v_4] + B[v_4]
@R.function
def forward(x: R.Tensor((n_1, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
env_linear = R.call_dps_packed("env.linear", (x, fc1_weight, fc1_bias), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv = R.call_tir(cls.relu, (env_linear,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv1 = R.call_tir(cls.tir_linear, (lv, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
+ lv = R.call_tir(Module.relu, (env_linear,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
+ lv1 = R.call_tir(Module.tir_linear, (lv, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
gv: R.Tensor((n_1, 10), dtype="float32") = lv1
R.output(gv)
return gv
@@ -470,6 +490,8 @@ customized pass.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -536,15 +558,16 @@ Relax functions, TensorIR functions and other TVM packed functions.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
- K = I.dynamic("K", dtype="int64")
M = I.dynamic("M", dtype="int64")
+ K = I.dynamic("K", dtype="int64")
N = I.dynamic("N", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@I.ir_module
@@ -552,39 +575,50 @@ Relax functions, TensorIR functions and other TVM packed functions.
@Ts.prim_func(private=True)
def relu(lv: T.Buffer((n, T.int64(128)), "float32"), compute: T.Buffer((n, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(n, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(lv[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(lv[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n):
+ for i1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(n, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ Ts.reads(lv[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(lv[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func
def tir_linear(X: T.Buffer((M, K), "float32"), W: T.Buffer((N, K), "float32"), B: T.Buffer((N,), "float32"), Z: T.Buffer((M, N), "float32")):
- # with Ts.sblock("root"):
- for i, j, k in T.grid(M, N, K):
- with Ts.sblock("linear"):
- v, v_1, v_2 = Ts.axis.remap("SSR", [i, j, k])
- Ts.reads(X[v, v_2], W[v_1, v_2])
- Ts.writes(Z[v, v_1])
- with Ts.init():
- Z[v, v_1] = T.float32(0.0)
- Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
- for i, j in T.grid(M, N):
- with Ts.sblock("add"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(Z[v, v_1], B[v_1])
- Ts.writes(Z[v, v_1])
- Z[v, v_1] = Z[v, v_1] + B[v_1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i in range(T.int64(0), M):
+ for j in range(T.int64(0), N):
+ for k in range(T.int64(0), K):
+ with Ts.sblock("linear"):
+ v = Ts.axis.spatial(M, i, dtype="int64")
+ v_1 = Ts.axis.spatial(N, j, dtype="int64")
+ v_2 = Ts.axis.reduce(K, k, dtype="int64")
+ Ts.reads(X[v, v_2], W[v_1, v_2])
+ Ts.writes(Z[v, v_1])
+ with Ts.init():
+ Z[v, v_1] = T.float32(0.0)
+ Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
+ for i_1 in range(T.int64(0), M):
+ for j_1 in range(T.int64(0), N):
+ with Ts.sblock("add"):
+ v_3 = Ts.axis.spatial(M, i_1, dtype="int64")
+ v_4 = Ts.axis.spatial(N, j_1, dtype="int64")
+ Ts.reads(Z[v_3, v_4], B[v_4])
+ Ts.writes(Z[v_3, v_4])
+ Z[v_3, v_4] = Z[v_3, v_4] + B[v_4]
@R.function
def forward(x: R.Tensor((n_1, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_1, 10), dtype="float32"):
- cls = Module
with R.dataflow():
lv = R.call_dps_packed("env.linear", (x, fc1_weight, fc1_bias), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv1 = R.call_tir(cls.relu, (lv,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv2 = R.call_tir(cls.tir_linear, (lv1, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
+ lv1 = R.call_tir(Module.relu, (lv,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
+ lv2 = R.call_tir(Module.tir_linear, (lv1, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
gv: R.Tensor((n_1, 10), dtype="float32") = lv2
R.output(gv)
return lv2
diff --git a/docs/_sources/deep_dive/relax/tutorials/relax_transformation.rst b/docs/_sources/deep_dive/relax/tutorials/relax_transformation.rst
index aaaea8d3872..f312db3f2c8 100644
--- a/docs/_sources/deep_dive/relax/tutorials/relax_transformation.rst
+++ b/docs/_sources/deep_dive/relax/tutorials/relax_transformation.rst
@@ -66,6 +66,8 @@ the :ref:`previous section <relax-creation>`.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -116,11 +118,12 @@ into low-level operators.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@@ -133,96 +136,127 @@ into low-level operators.
@Ts.prim_func(private=True)
def add(matmul: T.Buffer((n, T.int64(128)), "float32"), fc1_bias: T.Buffer((T.int64(128),), "float32"), T_add: T.Buffer((n, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(n, T.int64(128)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul[v_ax0, v_ax1], fc1_bias[v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = matmul[v_ax0, v_ax1] + fc1_bias[v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), n):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(matmul[v_ax0, v_ax1], fc1_bias[v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = matmul[v_ax0, v_ax1] + fc1_bias[v_ax1]
@Ts.prim_func(private=True)
def add1(matmul1: T.Buffer((n_1, T.int64(10)), "float32"), fc2_bias: T.Buffer((T.int64(10),), "float32"), T_add: T.Buffer((n_1, T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(n_1, T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul1[v_ax0, v_ax1], fc2_bias[v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = matmul1[v_ax0, v_ax1] + fc2_bias[v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), n_1):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n_1, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(matmul1[v_ax0, v_ax1], fc2_bias[v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = matmul1[v_ax0, v_ax1] + fc2_bias[v_ax1]
@Ts.prim_func(private=True)
def matmul(x: T.Buffer((n_2, T.int64(784)), "float32"), permute_dims: T.Buffer((T.int64(784), T.int64(128)), "float32"), matmul: T.Buffer((n_2, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(n_2, T.int64(128), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n_2):
+ for i1 in range(T.int64(0), T.int64(128)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n_2, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
@Ts.prim_func(private=True)
def matmul1(relu: T.Buffer((n_3, T.int64(128)), "float32"), permute_dims1: T.Buffer((T.int64(128), T.int64(10)), "float32"), matmul: T.Buffer((n_3, T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(n_3, T.int64(10), T.int64(128)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n_3):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n_3, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(128), k, dtype="int64")
+ Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
@Ts.prim_func(private=True)
def relu(add: T.Buffer((n_4, T.int64(128)), "float32"), compute: T.Buffer((n_4, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(n_4, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(add[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(add[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n_4):
+ for i1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(n_4, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ Ts.reads(add[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(add[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(128), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(128)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(10), T.int64(128)), "float32"), T_transpose: T.Buffer((T.int64(128), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(128), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(128)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(128), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
@R.function
def forward(x: R.Tensor((n_5, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_5, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
- matmul = R.call_tir(cls.matmul, (x, permute_dims), out_ty=R.Tensor((n_5, 128), dtype="float32"))
- add = R.call_tir(cls.add, (matmul, fc1_bias), out_ty=R.Tensor((n_5, 128), dtype="float32"))
- relu = R.call_tir(cls.relu, (add,), out_ty=R.Tensor((n_5, 128), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
- matmul1 = R.call_tir(cls.matmul1, (relu, permute_dims1), out_ty=R.Tensor((n_5, 10), dtype="float32"))
- add1 = R.call_tir(cls.add1, (matmul1, fc2_bias), out_ty=R.Tensor((n_5, 10), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
+ matmul = R.call_tir(Module.matmul, (x, permute_dims), out_ty=R.Tensor((n_5, 128), dtype="float32"))
+ add = R.call_tir(Module.add, (matmul, fc1_bias), out_ty=R.Tensor((n_5, 128), dtype="float32"))
+ relu = R.call_tir(Module.relu, (add,), out_ty=R.Tensor((n_5, 128), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
+ matmul1 = R.call_tir(Module.matmul1, (relu, permute_dims1), out_ty=R.Tensor((n_5, 10), dtype="float32"))
+ add1 = R.call_tir(Module.add1, (matmul1, fc2_bias), out_ty=R.Tensor((n_5, 10), dtype="float32"))
gv: R.Tensor((n_5, 10), dtype="float32") = add1
R.output(gv)
return gv
@@ -262,11 +296,12 @@ a set of passes. We can apply them in a sequence.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@@ -276,81 +311,106 @@ a set of passes. We can apply them in a sequence.
@Ts.prim_func(private=True)
def fused_matmul1_add1(relu: T.Buffer((n, T.int64(128)), "float32"), permute_dims1: T.Buffer((T.int64(128), T.int64(10)), "float32"), fc2_bias: T.Buffer((T.int64(10),), "float32"), T_add_intermediate: T.Buffer((n, T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((n, T.int64(10)))
- for i0, i1, k in T.grid(n, T.int64(10), T.int64(128)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
- for ax0, ax1 in T.grid(n, T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc2_bias[v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc2_bias[v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((n, T.int64(10)), "float32")
+ for i0 in range(T.int64(0), n):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(128), k, dtype="int64")
+ Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
+ for ax0 in range(T.int64(0), n):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc2_bias[v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc2_bias[v_ax1]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((n_1, T.int64(784)), "float32"), permute_dims: T.Buffer((T.int64(784), T.int64(128)), "float32"), fc1_bias: T.Buffer((T.int64(128),), "float32"), compute_intermediate: T.Buffer((n_1, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)))
- T_add_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)))
- for i0, i1, k in T.grid(n_1, T.int64(128), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
- for ax0, ax1 in T.grid(n_1, T.int64(128)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc1_bias[v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc1_bias[v_ax1]
- for i0, i1 in T.grid(n_1, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(T_add_intermediate[v_i0, v_i1])
- Ts.writes(compute_intermediate[v_i0, v_i1])
- compute_intermediate[v_i0, v_i1] = T.max(T_add_intermediate[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)), "float32")
+ T_add_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)), "float32")
+ for i0 in range(T.int64(0), n_1):
+ for i1 in range(T.int64(0), T.int64(128)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n_1, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
+ for ax0 in range(T.int64(0), n_1):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n_1, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc1_bias[v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc1_bias[v_ax1]
+ for i0_1 in range(T.int64(0), n_1):
+ for i1_1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0_1 = Ts.axis.spatial(n_1, i0_1, dtype="int64")
+ v_i1_1 = Ts.axis.spatial(T.int64(128), i1_1, dtype="int64")
+ Ts.reads(T_add_intermediate[v_i0_1, v_i1_1])
+ Ts.writes(compute_intermediate[v_i0_1, v_i1_1])
+ compute_intermediate[v_i0_1, v_i1_1] = T.max(T_add_intermediate[v_i0_1, v_i1_1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(128), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(128)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(128)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(10), T.int64(128)), "float32"), T_transpose: T.Buffer((T.int64(128), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(128), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(128)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(128), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
@R.function
def forward(x: R.Tensor((n_2, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_2, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
- lv = R.call_tir(cls.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((n_2, 128), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (lv, permute_dims1, fc2_bias), out_ty=R.Tensor((n_2, 10), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
+ lv = R.call_tir(Module.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((n_2, 128), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (lv, permute_dims1, fc2_bias), out_ty=R.Tensor((n_2, 10), dtype="float32"))
R.output(gv)
return gv
@@ -433,6 +493,8 @@ Then we can write a pass to apply the mutator to the whole module.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
diff --git a/docs/_sources/deep_dive/relax/tutorials/sg_execution_times.rst b/docs/_sources/deep_dive/relax/tutorials/sg_execution_times.rst
index 0e6abb6d0d0..cd5f568e605 100644
--- a/docs/_sources/deep_dive/relax/tutorials/sg_execution_times.rst
+++ b/docs/_sources/deep_dive/relax/tutorials/sg_execution_times.rst
@@ -6,7 +6,7 @@
Computation times
=================
-**00:00.163** total execution time for 2 files **from deep_dive/relax/tutorials**:
+**00:00.159** total execution time for 2 files **from deep_dive/relax/tutorials**:
.. container::
@@ -33,8 +33,8 @@ Computation times
- Time
- Mem (MB)
* - :ref:`sphx_glr_deep_dive_relax_tutorials_relax_creation.py` (``relax_creation.py``)
- - 00:00.092
+ - 00:00.086
- 0.0
* - :ref:`sphx_glr_deep_dive_relax_tutorials_relax_transformation.py` (``relax_transformation.py``)
- - 00:00.071
+ - 00:00.072
- 0.0
diff --git a/docs/_sources/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.rst b/docs/_sources/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.rst
index 95025719e12..e0e4e25510d 100644
--- a/docs/_sources/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.rst
+++ b/docs/_sources/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.rst
@@ -168,170 +168,182 @@ Here we use a common subset of rules. The full catalog (including ``LowBatchGEMV
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims1: T.Buffer((T.int64(768), T.int64(256)), "float32"), fc2_bias: T.Buffer((T.int64(256),), "float32"), T_add_intermediate: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("T_add"):
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc2_bias[v0])
- Ts.writes(T_add_intermediate[T.int64(0), v0])
- T_add_intermediate[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + fc2_bias[v0]
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("T_add"):
+ v0_3 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc2_bias[v0_3])
+ Ts.writes(T_add_intermediate[T.int64(0), v0_3])
+ T_add_intermediate[T.int64(0), v0_3] = matmul_intermediate_local[T.int64(0), v0_3] + fc2_bias[v0_3]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims: T.Buffer((T.int64(768), T.int64(768)), "float32"), fc1_bias: T.Buffer((T.int64(768),), "float32"), compute_intermediate: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("compute"):
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc1_bias[v0])
- Ts.writes(compute_intermediate[T.int64(0), v0])
- compute_intermediate[T.int64(0), v0] = T.max(matmul_intermediate_local[T.int64(0), v0] + fc1_bias[v0], T.float32(0.0))
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("compute"):
+ v0_3 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc1_bias[v0_3])
+ Ts.writes(compute_intermediate[T.int64(0), v0_3])
+ compute_intermediate[T.int64(0), v0_3] = T.max(matmul_intermediate_local[T.int64(0), v0_3] + fc1_bias[v0_3], T.float32(0.0))
@Ts.prim_func(private=True)
def layer_norm(relu: T.Buffer((T.int64(1), T.int64(768)), "float32"), norm_weight: T.Buffer((T.int64(768),), "float32"), norm_bias: T.Buffer((T.int64(768),), "float32"), T_layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 4, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1])
- Ts.writes(relu_sum_shared[T.int64(0)])
- with Ts.init():
- relu_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_var_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)])
- Ts.writes(relu_var_sum_shared[T.int64(0)])
- with Ts.init():
- relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
- for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("T_layer_norm"):
- v0 = Ts.axis.spatial(T.int64(1), T.int64(0))
- v1 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1], norm_bias[v1])
- Ts.writes(T_layer_norm[T.int64(0), v1])
- T_layer_norm[T.int64(0), v1] = (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * T.rsqrt(relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)) * norm_weight[v1] + norm_bias[v1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_sum"):
+ v0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1])
+ Ts.writes(relu_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
+ for ax0_1 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0_1 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_var_sum"):
+ v0_1 = Ts.axis.spatial(T.int64(1), ax0_1, dtype="int64")
+ v1_1 = Ts.axis.reduce(T.int64(768), ax1_fused_0_1 * T.int64(256) + ax1_fused_1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_1], relu_sum_shared[T.int64(0)])
+ Ts.writes(relu_var_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
+ for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("T_layer_norm"):
+ v0_2 = Ts.axis.spatial(T.int64(1), T.int64(0), dtype="int64")
+ v1_2 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_2], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1_2], norm_bias[v1_2])
+ Ts.writes(T_layer_norm[T.int64(0), v1_2])
+ T_layer_norm[T.int64(0), v1_2] = (relu[T.int64(0), v1_2] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * I.Call("tirx.rsqrt", [relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)], ty="float32") * norm_weight[v1_2] + norm_bias[v1_2]
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(768), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768))
- v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768))
- Ts.reads(fc1_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc1_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768), dtype="int64")
+ Ts.reads(fc1_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc1_weight[v1, v0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(256), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(256)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256))
- v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256))
- Ts.reads(fc2_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc2_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256), dtype="int64")
+ Ts.reads(fc2_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc2_weight[v1, v0]
@R.function
def forward(x: R.Tensor((1, 768), dtype="float32"), fc1_weight: R.Tensor((768, 768), dtype="float32"), fc1_bias: R.Tensor((768,), dtype="float32"), norm_weight: R.Tensor((768,), dtype="float32"), norm_bias: R.Tensor((768,), dtype="float32"), fc2_weight: R.Tensor((256, 768), dtype="float32"), fc2_bias: R.Tensor((256,), dtype="float32")) -> R.Tensor((1, 256), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
- lv = R.call_tir(cls.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- layer_norm = R.call_tir(cls.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
+ lv = R.call_tir(Module.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ layer_norm = R.call_tir(Module.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
R.output(gv)
return gv
@@ -601,170 +613,182 @@ Insert the custom rule into the rule chain. Note that ``from_callable`` returns
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims1: T.Buffer((T.int64(768), T.int64(256)), "float32"), fc2_bias: T.Buffer((T.int64(256),), "float32"), T_add_intermediate: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("T_add"):
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc2_bias[v0])
- Ts.writes(T_add_intermediate[T.int64(0), v0])
- T_add_intermediate[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + fc2_bias[v0]
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("T_add"):
+ v0_3 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc2_bias[v0_3])
+ Ts.writes(T_add_intermediate[T.int64(0), v0_3])
+ T_add_intermediate[T.int64(0), v0_3] = matmul_intermediate_local[T.int64(0), v0_3] + fc2_bias[v0_3]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims: T.Buffer((T.int64(768), T.int64(768)), "float32"), fc1_bias: T.Buffer((T.int64(768),), "float32"), compute_intermediate: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("compute"):
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc1_bias[v0])
- Ts.writes(compute_intermediate[T.int64(0), v0])
- compute_intermediate[T.int64(0), v0] = T.max(matmul_intermediate_local[T.int64(0), v0] + fc1_bias[v0], T.float32(0.0))
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("compute"):
+ v0_3 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc1_bias[v0_3])
+ Ts.writes(compute_intermediate[T.int64(0), v0_3])
+ compute_intermediate[T.int64(0), v0_3] = T.max(matmul_intermediate_local[T.int64(0), v0_3] + fc1_bias[v0_3], T.float32(0.0))
@Ts.prim_func(private=True)
def layer_norm(relu: T.Buffer((T.int64(1), T.int64(768)), "float32"), norm_weight: T.Buffer((T.int64(768),), "float32"), norm_bias: T.Buffer((T.int64(768),), "float32"), T_layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 4, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1])
- Ts.writes(relu_sum_shared[T.int64(0)])
- with Ts.init():
- relu_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_var_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)])
- Ts.writes(relu_var_sum_shared[T.int64(0)])
- with Ts.init():
- relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
- for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("T_layer_norm"):
- v0 = Ts.axis.spatial(T.int64(1), T.int64(0))
- v1 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1], norm_bias[v1])
- Ts.writes(T_layer_norm[T.int64(0), v1])
- T_layer_norm[T.int64(0), v1] = (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * T.rsqrt(relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)) * norm_weight[v1] + norm_bias[v1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_sum"):
+ v0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1])
+ Ts.writes(relu_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
+ for ax0_1 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0_1 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_var_sum"):
+ v0_1 = Ts.axis.spatial(T.int64(1), ax0_1, dtype="int64")
+ v1_1 = Ts.axis.reduce(T.int64(768), ax1_fused_0_1 * T.int64(256) + ax1_fused_1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_1], relu_sum_shared[T.int64(0)])
+ Ts.writes(relu_var_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
+ for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("T_layer_norm"):
+ v0_2 = Ts.axis.spatial(T.int64(1), T.int64(0), dtype="int64")
+ v1_2 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_2], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1_2], norm_bias[v1_2])
+ Ts.writes(T_layer_norm[T.int64(0), v1_2])
+ T_layer_norm[T.int64(0), v1_2] = (relu[T.int64(0), v1_2] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * I.Call("tirx.rsqrt", [relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)], ty="float32") * norm_weight[v1_2] + norm_bias[v1_2]
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(768), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768))
- v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768))
- Ts.reads(fc1_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc1_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768), dtype="int64")
+ Ts.reads(fc1_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc1_weight[v1, v0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(256), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(256)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256))
- v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256))
- Ts.reads(fc2_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc2_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256), dtype="int64")
+ Ts.reads(fc2_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc2_weight[v1, v0]
@R.function
def forward(x: R.Tensor((1, 768), dtype="float32"), fc1_weight: R.Tensor((768, 768), dtype="float32"), fc1_bias: R.Tensor((768,), dtype="float32"), norm_weight: R.Tensor((768,), dtype="float32"), norm_bias: R.Tensor((768,), dtype="float32"), fc2_weight: R.Tensor((256, 768), dtype="float32"), fc2_bias: R.Tensor((256,), dtype="float32")) -> R.Tensor((1, 256), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
- lv = R.call_tir(cls.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- layer_norm = R.call_tir(cls.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
+ lv = R.call_tir(Module.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ layer_norm = R.call_tir(Module.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
R.output(gv)
return gv
diff --git a/docs/_sources/deep_dive/tensor_ir/tutorials/sg_execution_times.rst b/docs/_sources/deep_dive/tensor_ir/tutorials/sg_execution_times.rst
index baffc06c4a0..edfd206b7dd 100644
--- a/docs/_sources/deep_dive/tensor_ir/tutorials/sg_execution_times.rst
+++ b/docs/_sources/deep_dive/tensor_ir/tutorials/sg_execution_times.rst
@@ -6,7 +6,7 @@
Computation times
=================
-**00:00.634** total execution time for 4 files **from deep_dive/tensor_ir/tutorials**:
+**00:00.575** total execution time for 4 files **from deep_dive/tensor_ir/tutorials**:
.. container::
@@ -33,14 +33,14 @@ Computation times
- Time
- Mem (MB)
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_tir_transformation.py` (``tir_transformation.py``)
- - 00:00.304
+ - 00:00.264
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_dlight_gpu_scheduling.py` (``dlight_gpu_scheduling.py``)
- - 00:00.161
+ - 00:00.165
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_tir_creation.py` (``tir_creation.py``)
- - 00:00.159
+ - 00:00.137
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_meta_schedule.py` (``meta_schedule.py``)
- - 00:00.010
+ - 00:00.009
- 0.0
diff --git a/docs/_sources/deep_dive/tensor_ir/tutorials/tir_creation.rst b/docs/_sources/deep_dive/tensor_ir/tutorials/tir_creation.rst
index f4afb64a7b5..7e186919326 100644
--- a/docs/_sources/deep_dive/tensor_ir/tutorials/tir_creation.rst
+++ b/docs/_sources/deep_dive/tensor_ir/tutorials/tir_creation.rst
@@ -411,32 +411,41 @@ and one output parameter **C**.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def mm_relu(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- Y = Ts.sblock_alloc_buffer((128, 128))
- for i, j, k in T.grid(128, 128, 128):
- with Ts.sblock("Y"):
- v_i, v_j, v_k = Ts.axis.remap("SSR", [i, j, k])
- Ts.reads(A[v_i, v_k], B[v_k, v_j])
- Ts.writes(Y[v_i, v_j])
- with Ts.init():
- Y[v_i, v_j] = T.float32(0.0)
- Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
- for i, j in T.grid(128, 128):
- with Ts.sblock("C"):
- v_i, v_j = Ts.axis.remap("SS", [i, j])
- Ts.reads(Y[v_i, v_j])
- Ts.writes(C[v_i, v_j])
- C[v_i, v_j] = T.max(Y[v_i, v_j], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ Y = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j in range(128):
+ for k in range(128):
+ with Ts.sblock("Y"):
+ v_i = Ts.axis.spatial(128, i)
+ v_j = Ts.axis.spatial(128, j)
+ v_k = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_i, v_k], B[v_k, v_j])
+ Ts.writes(Y[v_i, v_j])
+ with Ts.init():
+ Y[v_i, v_j] = T.float32(0.0)
+ Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
+ for i_1 in range(128):
+ for j_1 in range(128):
+ with Ts.sblock("C"):
+ v_i_1 = Ts.axis.spatial(128, i_1)
+ v_j_1 = Ts.axis.spatial(128, j_1)
+ Ts.reads(Y[v_i_1, v_j_1])
+ Ts.writes(C[v_i_1, v_j_1])
+ C[v_i_1, v_j_1] = T.max(Y[v_i_1, v_j_1], T.float32(0.0))
@@ -473,35 +482,44 @@ is that we need to specify the shape of the input tensors as symbolic variables.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
- k = I.dynamic("k", dtype="int32")
m = I.dynamic("m", dtype="int32")
n = I.dynamic("n", dtype="int32")
+ k = I.dynamic("k", dtype="int32")
@I.ir_module
class Module:
@Ts.prim_func
def mm_relu(A: T.Buffer((m, n), "float32"), B: T.Buffer((k, n), "float32"), C: T.Buffer((m, n), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- Y = Ts.sblock_alloc_buffer((m, n))
- for i, j, k_1 in T.grid(m, n, k):
- with Ts.sblock("Y"):
- v_i, v_j, v_k = Ts.axis.remap("SSR", [i, j, k_1])
- Ts.reads(A[v_i, v_k], B[v_k, v_j])
- Ts.writes(Y[v_i, v_j])
- with Ts.init():
- Y[v_i, v_j] = T.float32(0.0)
- Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
- for i, j in T.grid(m, n):
- with Ts.sblock("C"):
- v_i, v_j = Ts.axis.remap("SS", [i, j])
- Ts.reads(Y[v_i, v_j])
- Ts.writes(C[v_i, v_j])
- C[v_i, v_j] = T.max(Y[v_i, v_j], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ Y = Ts.sblock_alloc_buffer((m, n), "float32")
+ for i in range(m):
+ for j in range(n):
+ for k_1 in range(k):
+ with Ts.sblock("Y"):
+ v_i = Ts.axis.spatial(m, i)
+ v_j = Ts.axis.spatial(n, j)
+ v_k = Ts.axis.reduce(k, k_1)
+ Ts.reads(A[v_i, v_k], B[v_k, v_j])
+ Ts.writes(Y[v_i, v_j])
+ with Ts.init():
+ Y[v_i, v_j] = T.float32(0.0)
+ Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
+ for i_1 in range(m):
+ for j_1 in range(n):
+ with Ts.sblock("C"):
+ v_i_1 = Ts.axis.spatial(m, i_1)
+ v_j_1 = Ts.axis.spatial(n, j_1)
+ Ts.reads(Y[v_i_1, v_j_1])
+ Ts.writes(C[v_i_1, v_j_1])
+ C[v_i_1, v_j_1] = T.max(Y[v_i_1, v_j_1], T.float32(0.0))
diff --git a/docs/_sources/deep_dive/tensor_ir/tutorials/tir_transformation.rst b/docs/_sources/deep_dive/tensor_ir/tutorials/tir_transformation.rst
index 38748c33351..0f25960d403 100644
--- a/docs/_sources/deep_dive/tensor_ir/tutorials/tir_transformation.rst
+++ b/docs/_sources/deep_dive/tensor_ir/tutorials/tir_transformation.rst
@@ -121,7 +121,7 @@ original implementation.
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
- 2.7527 2.7527 2.7527 2.7527 0.0000
+ 2.5870 2.5870 2.5870 2.5870 0.0000
@@ -210,34 +210,42 @@ The outcome of the transformation can be examined, as it is retained within ``sc
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0, j_1, k in T.grid(128, 16, 8, 128):
- with Ts.sblock("Y"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- with Ts.init():
- buffer[v, v_1] = T.float32(0.0)
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for i, j in T.grid(128, 128):
- with Ts.sblock("C"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for j_1 in range(8):
+ for k in range(128):
+ with Ts.sblock("Y"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_3 = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_1, v_3], B[v_3, v_2])
+ Ts.writes(v[v_1, v_2])
+ with Ts.init():
+ v[v_1, v_2] = T.float32(0.0)
+ v[v_1, v_2] = v[v_1, v_2] + A[v_1, v_3] * B[v_3, v_2]
+ for i_1 in range(128):
+ for j in range(128):
+ with Ts.sblock("C"):
+ v_4 = Ts.axis.spatial(128, i_1)
+ v_5 = Ts.axis.spatial(128, j)
+ Ts.reads(v[v_4, v_5])
+ Ts.writes(C[v_4, v_5])
+ C[v_4, v_5] = T.max(v[v_4, v_5], T.float32(0.0))
@@ -266,38 +274,46 @@ action involves reordering these two loops.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0, k, j_1 in T.grid(128, 16, 128, 8):
- with Ts.sblock("Y"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- with Ts.init():
- buffer[v, v_1] = T.float32(0.0)
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for i, j in T.grid(128, 128):
- with Ts.sblock("C"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_3 = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_1, v_3], B[v_3, v_2])
+ Ts.writes(v[v_1, v_2])
+ with Ts.init():
+ v[v_1, v_2] = T.float32(0.0)
+ v[v_1, v_2] = v[v_1, v_2] + A[v_1, v_3] * B[v_3, v_2]
+ for i_1 in range(128):
+ for j in range(128):
+ with Ts.sblock("C"):
+ v_4 = Ts.axis.spatial(128, i_1)
+ v_5 = Ts.axis.spatial(128, j)
+ Ts.reads(v[v_4, v_5])
+ Ts.writes(C[v_4, v_5])
+ C[v_4, v_5] = T.max(v[v_4, v_5], T.float32(0.0))
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
- 0.8645 0.8645 0.8645 0.8645 0.0000
+ 0.8631 0.8631 0.8631 0.8631 0.0000
@@ -327,36 +343,41 @@ variant. First, we employ a primitive known as **reverse_compute_at** to relocat
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0 in T.grid(128, 16):
- for k, j_1 in T.grid(128, 8):
- with Ts.sblock("Y"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- with Ts.init():
- buffer[v, v_1] = T.float32(0.0)
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for ax0 in range(8):
- with Ts.sblock("C"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + ax0)
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_3 = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_1, v_3], B[v_3, v_2])
+ Ts.writes(v[v_1, v_2])
+ with Ts.init():
+ v[v_1, v_2] = T.float32(0.0)
+ v[v_1, v_2] = v[v_1, v_2] + A[v_1, v_3] * B[v_3, v_2]
+ for ax0 in range(8):
+ with Ts.sblock("C"):
+ v_4 = Ts.axis.spatial(128, i)
+ v_5 = Ts.axis.spatial(128, j_0 * 8 + ax0)
+ Ts.reads(v[v_4, v_5])
+ Ts.writes(C[v_4, v_5])
+ C[v_4, v_5] = T.max(v[v_4, v_5], T.float32(0.0))
@@ -391,45 +412,50 @@ from the reduction update via the **decompose_reduction** primitive.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0 in T.grid(128, 16):
- for j_1_init in range(8):
- with Ts.sblock("Y_init"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
- Ts.reads()
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = T.float32(0.0)
- for k, j_1 in T.grid(128, 8):
- with Ts.sblock("Y_update"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(buffer[v, v_1], A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for ax0 in range(8):
- with Ts.sblock("C"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + ax0)
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for j_1_init in range(8):
+ with Ts.sblock("Y_init"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
+ Ts.reads()
+ Ts.writes(v[v_1, v_2])
+ v[v_1, v_2] = T.float32(0.0)
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y_update"):
+ v_3 = Ts.axis.spatial(128, i)
+ v_4 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_5 = Ts.axis.reduce(128, k)
+ Ts.reads(v[v_3, v_4], A[v_3, v_5], B[v_5, v_4])
+ Ts.writes(v[v_3, v_4])
+ v[v_3, v_4] = v[v_3, v_4] + A[v_3, v_5] * B[v_5, v_4]
+ for ax0 in range(8):
+ with Ts.sblock("C"):
+ v_6 = Ts.axis.spatial(128, i)
+ v_7 = Ts.axis.spatial(128, j_0 * 8 + ax0)
+ Ts.reads(v[v_6, v_7])
+ Ts.writes(C[v_6, v_7])
+ C[v_6, v_7] = T.max(v[v_6, v_7], T.float32(0.0))
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
- 0.3367 0.3367 0.3367 0.3367 0.0000
+ 0.3447 0.3447 0.3447 0.3447 0.0000
@@ -492,41 +518,46 @@ Alternatively, we can output the IRModule in conjunction with the historical tra
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
# from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0 in T.grid(128, 16):
- for j_1_init in range(8):
- with Ts.sblock("Y_init"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
- Ts.reads()
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = T.float32(0.0)
- for k, j_1 in T.grid(128, 8):
- with Ts.sblock("Y_update"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(buffer[v, v_1], A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for ax0 in range(8):
- with Ts.sblock("C"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + ax0)
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for j_1_init in range(8):
+ with Ts.sblock("Y_init"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
+ Ts.reads()
+ Ts.writes(v[v_1, v_2])
+ v[v_1, v_2] = T.float32(0.0)
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y_update"):
+ v_3 = Ts.axis.spatial(128, i)
+ v_4 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_5 = Ts.axis.reduce(128, k)
+ Ts.reads(v[v_3, v_4], A[v_3, v_5], B[v_5, v_4])
+ Ts.writes(v[v_3, v_4])
+ v[v_3, v_4] = v[v_3, v_4] + A[v_3, v_5] * B[v_5, v_4]
+ for ax0 in range(8):
+ with Ts.sblock("C"):
+ v_6 = Ts.axis.spatial(128, i)
+ v_7 = Ts.axis.spatial(128, j_0 * 8 + ax0)
+ Ts.reads(v[v_6, v_7])
+ Ts.writes(C[v_6, v_7])
+ C[v_6, v_7] = T.max(v[v_6, v_7], T.float32(0.0))
# from tvm import s_tir
def apply_trace(sch: s_tir.Schedule) -> None:
diff --git a/docs/_sources/get_started/tutorials/ir_module.rst b/docs/_sources/get_started/tutorials/ir_module.rst
index b3e09352bec..92c95aaf6d1 100644
--- a/docs/_sources/get_started/tutorials/ir_module.rst
+++ b/docs/_sources/get_started/tutorials/ir_module.rst
@@ -122,6 +122,8 @@ from PyTorch.
/opt/uv/python/cpython-3.10-linux-x86_64-gnu/lib/python3.10/copyreg.py:101: FutureWarning: `isinstance(treespec, LeafSpec)` is deprecated, use `isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
return cls.__new__(cls, *args)
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -188,6 +190,8 @@ write the IRModule directly.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -264,6 +268,8 @@ parse the TVMScript to obtain an IRModule.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -310,7 +316,7 @@ An IRModule is a collection of functions, indexed by GlobalVars.
.. code-block:: none
- (I.GlobalVar("main"),)
+ (Module.main,)
@@ -339,6 +345,8 @@ or their names
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import relax as R
@R.function
@@ -395,107 +403,139 @@ within the same module. Meanwhile, the Relax operators will be converted into ``
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def add(p_fc1_bias: T.Buffer((T.int64(256),), "float32"), lv1: T.Buffer((T.int64(1), T.int64(256)), "float32"), T_add: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_bias[v_ax1], lv1[v_ax0, v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + lv1[v_ax0, v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_bias[v_ax1], lv1[v_ax0, v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + lv1[v_ax0, v_ax1]
@Ts.prim_func(private=True)
def add1(p_fc2_bias: T.Buffer((T.int64(10),), "float32"), lv5: T.Buffer((T.int64(1), T.int64(10)), "float32"), T_add: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(1), T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_bias[v_ax1], lv5[v_ax0, v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + lv5[v_ax0, v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_bias[v_ax1], lv5[v_ax0, v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + lv5[v_ax0, v_ax1]
@Ts.prim_func(private=True)
def matmul(x: T.Buffer((T.int64(1), T.int64(784)), "float32"), lv: T.Buffer((T.int64(784), T.int64(256)), "float32"), matmul: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(T.int64(1), T.int64(256), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(256)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(256), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
@Ts.prim_func(private=True)
def matmul1(lv3: T.Buffer((T.int64(1), T.int64(256)), "float32"), lv4: T.Buffer((T.int64(256), T.int64(10)), "float32"), matmul: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(T.int64(1), T.int64(10), T.int64(256)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(256), k, dtype="int64")
+ Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
@Ts.prim_func(private=True)
def relu(lv2: T.Buffer((T.int64(1), T.int64(256)), "float32"), compute: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(lv2[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(lv2[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(256), i1, dtype="int64")
+ Ts.reads(lv2[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(lv2[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(p_fc1_weight: T.Buffer((T.int64(256), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(256)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(p_fc2_weight: T.Buffer((T.int64(10), T.int64(256)), "float32"), T_transpose: T.Buffer((T.int64(256), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(256), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(256)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(256), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
@R.function
def main(x: R.Tensor((1, 784), dtype="float32"), p_fc1_weight: R.Tensor((256, 784), dtype="float32"), p_fc1_bias: R.Tensor((256,), dtype="float32"), p_fc2_weight: R.Tensor((10, 256), dtype="float32"), p_fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- lv = R.call_tir(cls.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
- lv1 = R.call_tir(cls.matmul, (x, lv), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv2 = R.call_tir(cls.add, (p_fc1_bias, lv1), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv3 = R.call_tir(cls.relu, (lv2,), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv4 = R.call_tir(cls.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
- lv5 = R.call_tir(cls.matmul1, (lv3, lv4), out_ty=R.Tensor((1, 10), dtype="float32"))
- lv6 = R.call_tir(cls.add1, (p_fc2_bias, lv5), out_ty=R.Tensor((1, 10), dtype="float32"))
+ lv = R.call_tir(Module.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
+ lv1 = R.call_tir(Module.matmul, (x, lv), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv2 = R.call_tir(Module.add, (p_fc1_bias, lv1), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv3 = R.call_tir(Module.relu, (lv2,), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv4 = R.call_tir(Module.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
+ lv5 = R.call_tir(Module.matmul1, (lv3, lv4), out_ty=R.Tensor((1, 10), dtype="float32"))
+ lv6 = R.call_tir(Module.add1, (p_fc2_bias, lv5), out_ty=R.Tensor((1, 10), dtype="float32"))
gv: R.Tensor((1, 10), dtype="float32") = lv6
R.output(gv)
return gv
@@ -524,7 +564,7 @@ the global vars again.
.. code-block:: none
- (I.GlobalVar("add"), I.GlobalVar("add1"), I.GlobalVar("main"), I.GlobalVar("matmul"), I.GlobalVar("matmul1"), I.GlobalVar("relu"), I.GlobalVar("transpose"), I.GlobalVar("transpose1"))
+ (Module.add, Module.add1, Module.main, Module.matmul, Module.matmul1, Module.relu, Module.transpose, Module.transpose1)
@@ -570,92 +610,118 @@ The default **zero** pipeline contains very fundamental transformations, includi
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(lv3: T.Buffer((T.int64(1), T.int64(256)), "float32"), lv4: T.Buffer((T.int64(256), T.int64(10)), "float32"), p_fc2_bias: T.Buffer((T.int64(10),), "float32"), T_add_intermediate: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(10)))
- for i0, i1, k in T.grid(T.int64(1), T.int64(10), T.int64(256)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
- for ax0, ax1 in T.grid(T.int64(1), T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(10)), "float32")
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(256), k, dtype="int64")
+ Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((T.int64(1), T.int64(784)), "float32"), lv: T.Buffer((T.int64(784), T.int64(256)), "float32"), p_fc1_bias: T.Buffer((T.int64(256),), "float32"), compute_intermediate: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)))
- T_add_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)))
- for i0, i1, k in T.grid(T.int64(1), T.int64(256), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
- for ax0, ax1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
- for i0, i1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(T_add_intermediate[v_i0, v_i1])
- Ts.writes(compute_intermediate[v_i0, v_i1])
- compute_intermediate[v_i0, v_i1] = T.max(T_add_intermediate[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32")
+ T_add_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32")
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(256)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(256), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
+ for i0_1 in range(T.int64(0), T.int64(1)):
+ for i1_1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("compute"):
+ v_i0_1 = Ts.axis.spatial(T.int64(1), i0_1, dtype="int64")
+ v_i1_1 = Ts.axis.spatial(T.int64(256), i1_1, dtype="int64")
+ Ts.reads(T_add_intermediate[v_i0_1, v_i1_1])
+ Ts.writes(compute_intermediate[v_i0_1, v_i1_1])
+ compute_intermediate[v_i0_1, v_i1_1] = T.max(T_add_intermediate[v_i0_1, v_i1_1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(p_fc1_weight: T.Buffer((T.int64(256), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(256)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(256)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(p_fc2_weight: T.Buffer((T.int64(10), T.int64(256)), "float32"), T_transpose: T.Buffer((T.int64(256), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(256), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(256)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(256), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
@R.function
def main(x: R.Tensor((1, 784), dtype="float32"), p_fc1_weight: R.Tensor((256, 784), dtype="float32"), p_fc1_bias: R.Tensor((256,), dtype="float32"), p_fc2_weight: R.Tensor((10, 256), dtype="float32"), p_fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- lv = R.call_tir(cls.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
- lv_1 = R.call_tir(cls.fused_matmul_add_relu, (x, lv, p_fc1_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv4 = R.call_tir(cls.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (lv_1, lv4, p_fc2_bias), out_ty=R.Tensor((1, 10), dtype="float32"))
+ lv = R.call_tir(Module.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
+ lv_1 = R.call_tir(Module.fused_matmul_add_relu, (x, lv, p_fc1_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv4 = R.call_tir(Module.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (lv_1, lv4, p_fc2_bias), out_ty=R.Tensor((1, 10), dtype="float32"))
R.output(gv)
return gv
@@ -698,8 +764,8 @@ We can deploy the IRModule on CPU by specifying the target as ``llvm``.
.. code-block:: none
- [[-0.07639622 0.09393998 0.15279326 0.0067593 0.0712965 0.11450908
- -0.0593667 0.1031519 -0.02436247 0.06724901]]
+ [[ 0.02156833 0.1480602 -0.18894392 -0.12359875 -0.15182018 -0.0406852
+ 0.03429064 0.21808206 -0.1431902 -0.09069045]]
@@ -765,8 +831,8 @@ Now we can compile the IRModule on GPU, the similar way as we did on CPU.
.. code-block:: none
- [[-0.07639617 0.09394001 0.15279323 0.00675932 0.07129654 0.11450911
- -0.05936672 0.10315201 -0.02436246 0.06724904]]
+ [[ 0.0215683 0.14806023 -0.18894392 -0.12359875 -0.15182015 -0.04068519
+ 0.03429066 0.21808198 -0.14319019 -0.09069046]]
diff --git a/docs/_sources/get_started/tutorials/quick_start.rst b/docs/_sources/get_started/tutorials/quick_start.rst
index bbfc5c2dc7d..befee6c5e3b 100644
--- a/docs/_sources/get_started/tutorials/quick_start.rst
+++ b/docs/_sources/get_started/tutorials/quick_start.rst
@@ -133,6 +133,8 @@ in TVM.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -224,8 +226,8 @@ different devices.
.. code-block:: none
- [[26971.541 24163.498 26412.727 24472.064 25188.469 26570.77 24381.45
- 25214.668 25924.244 25916.143]]
+ [[24394.262 23714.424 25465.494 23587.584 25657.525 23834.256 24638.521
+ 25145.371 26069.785 23032.725]]
diff --git a/docs/_sources/get_started/tutorials/sg_execution_times.rst b/docs/_sources/get_started/tutorials/sg_execution_times.rst
index 61ae68067bb..ba9ee1204ab 100644
--- a/docs/_sources/get_started/tutorials/sg_execution_times.rst
+++ b/docs/_sources/get_started/tutorials/sg_execution_times.rst
@@ -6,7 +6,7 @@
Computation times
=================
-**00:06.380** total execution time for 2 files **from get_started/tutorials**:
+**00:05.454** total execution time for 2 files **from get_started/tutorials**:
.. container::
@@ -33,8 +33,8 @@ Computation times
- Time
- Mem (MB)
* - :ref:`sphx_glr_get_started_tutorials_ir_module.py` (``ir_module.py``)
- - 00:06.191
+ - 00:05.293
- 0.0
* - :ref:`sphx_glr_get_started_tutorials_quick_start.py` (``quick_start.py``)
- - 00:00.189
+ - 00:00.161
- 0.0
diff --git a/docs/_sources/how_to/tutorials/bring_your_own_codegen.rst b/docs/_sources/how_to/tutorials/bring_your_own_codegen.rst
index 7ee876637fa..6933ae3c452 100644
--- a/docs/_sources/how_to/tutorials/bring_your_own_codegen.rst
+++ b/docs/_sources/how_to/tutorials/bring_your_own_codegen.rst
@@ -190,6 +190,8 @@ printed module.
.. code-block:: none
After partitioning for the example NPU:
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -203,7 +205,7 @@ printed module.
@R.function
def local_func(data_1: R.Tensor((1, 3, 32, 32), dtype="float32"), weight_1: R.Tensor((16, 3, 3, 3), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
R.func_attr({"Composite": "example_npu.conv2d_relu_fused"})
- conv: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, weight_1, strides=[1, 1], padding=[0, 0, 0, 0], dilation=[1, 1], groups=1, data_layout="NCHW", kernel_layout="OIHW", out_layout="NCHW", out_dtype=None)
+ conv: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, weight_1, data_layout="NCHW", dilation=[1, 1], groups=1, kernel_layout="OIHW", out_dtype=None, out_layout="NCHW", padding=[0, 0, 0, 0], strides=[1, 1])
gv: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.relu(conv)
return gv
@@ -212,9 +214,8 @@ printed module.
@R.function
def main(data: R.Tensor((1, 3, 32, 32), dtype="float32"), weight: R.Tensor((16, 3, 3, 3), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
- cls = Module
with R.dataflow():
- gv: R.Tensor((1, 16, 30, 30), dtype="float32") = cls.fused_relax_nn_conv2d_relax_nn_relu_example_npu_example_npu(data, weight)
+ gv: R.Tensor((1, 16, 30, 30), dtype="float32") = Module.fused_relax_nn_conv2d_relax_nn_relu_example_npu_example_npu(data, weight)
R.output(gv)
return gv
@@ -308,6 +309,8 @@ available. In CPU-only documentation builds, they produce no output.
.. code-block:: none
After partition_for_tensorrt:
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -322,7 +325,7 @@ available. In CPU-only documentation builds, they produce no output.
def gv(data_1: R.Tensor((1, 3, 32, 32), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
R.func_attr({"Composite": "tensorrt.nn.conv2d"})
with R.dataflow():
- gv_1: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, metadata["ir.GenericConst"][0], strides=[1, 1], padding=[0, 0, 0, 0], dilation=[1, 1], groups=1, data_layout="NCHW", kernel_layout="OIHW", out_layout="NCHW", out_dtype=None)
+ gv_1: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, metadata["ir.GenericConst"][0], data_layout="NCHW", dilation=[1, 1], groups=1, kernel_layout="OIHW", out_dtype=None, out_layout="NCHW", padding=[0, 0, 0, 0], strides=[1, 1])
R.output(gv_1)
return gv_1
@@ -342,9 +345,8 @@ available. In CPU-only documentation builds, they produce no output.
@R.function
def main(data: R.Tensor((1, 3, 32, 32), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
- cls = Module
with R.dataflow():
- gv: R.Tensor((1, 16, 30, 30), dtype="float32") = cls.fused_relax_nn_conv2d_relax_nn_relu_tensorrt(data)
+ gv: R.Tensor((1, 16, 30, 30), dtype="float32") = Module.fused_relax_nn_conv2d_relax_nn_relu_tensorrt(data)
R.output(gv)
return gv
diff --git a/docs/_sources/how_to/tutorials/cross_compilation_and_rpc.rst b/docs/_sources/how_to/tutorials/cross_compilation_and_rpc.rst
index a0456376883..fd8e599cd6d 100644
--- a/docs/_sources/how_to/tutorials/cross_compilation_and_rpc.rst
+++ b/docs/_sources/how_to/tutorials/cross_compilation_and_rpc.rst
@@ -275,7 +275,7 @@ device and returns the measured cost. Network overhead is excluded.
.. code-block:: none
- 1.061e-07 secs/op
+ 9e-08 secs/op
@@ -864,8 +864,8 @@ This workflow is applicable to various deployment scenarios:
Converted PyTorch model to Relax:
- Number of parameters: 4
Using local target for demonstration
- Exported library to: /tmp/tmpi03brddb/model_deployed.so
- Saved parameters to: /tmp/tmpi03brddb/model_params.npz
+ Exported library to: /tmp/tmpoxnl6xyi/model_deployed.so
+ Saved parameters to: /tmp/tmpoxnl6xyi/model_params.npz
RPC workflow (works for any remote device):
==================================================
diff --git a/docs/_sources/how_to/tutorials/customize_opt.rst b/docs/_sources/how_to/tutorials/customize_opt.rst
index 515c839d643..4a86ad3b2a1 100644
--- a/docs/_sources/how_to/tutorials/customize_opt.rst
+++ b/docs/_sources/how_to/tutorials/customize_opt.rst
@@ -118,6 +118,8 @@ with NN module frontend or TVMScript. Here we use a simple neural network model
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -203,6 +205,8 @@ operator. Here we demonstrate how to dispatch the CUBLAS library for certain pat
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -319,11 +323,12 @@ it achieves a balance between performance and compilation time.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
- # from tvm.script import tirx as T
- # from tvm.tirx.layout import Axis
- # from tvm.script import s_tir as Ts
# from tvm.script import relax as R
+ # from tvm.script import s_tir as Ts
+ # from tvm.script import tirx as T
@I.ir_module
class Module:
@@ -331,57 +336,62 @@ it achieves a balance between performance and compilation time.
@Ts.prim_func(private=True)
def matmul(lv: T.Buffer((T.int64(1), T.int64(256)), "float32"), permute_dims1: T.Buffer((T.int64(256), T.int64(10)), "float32"), matmul: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 4, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(10)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(1), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(10), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(16), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(16), ax1_fused_0)
- Ts.reads(matmul_rf_local[vax1_fused_1, T.int64(0), v0], lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(10)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(1), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(10), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_rf_local[vax1_fused_1, T.int64(0), v0] + lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(10), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1, v0 = Ts.axis.remap("RS", [ax0, ax1_fused])
- Ts.reads(matmul_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul[T.int64(0), v0])
- with Ts.init():
- matmul[T.int64(0), v0] = T.float32(0.0)
- matmul[T.int64(0), v0] = matmul[T.int64(0), v0] + matmul_rf_local[vax1_fused_1, T.int64(0), v0]
+ matmul_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(16)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(16), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1], lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(10), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(10), ax1_fused, dtype="int64")
+ Ts.reads(matmul_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul[T.int64(0), v0_2])
+ with Ts.init():
+ matmul[T.int64(0), v0_2] = T.float32(0.0)
+ matmul[T.int64(0), v0_2] = matmul[T.int64(0), v0_2] + matmul_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
@Ts.prim_func(private=True)
def transpose(fc2_weight: T.Buffer((T.int64(10), T.int64(256)), "float32"), T_transpose: T.Buffer((T.int64(256), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(3), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(10))
- v1 = Ts.axis.spatial(T.int64(10), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(10))
- Ts.where(ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1 < T.int64(2560))
- Ts.reads(fc2_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc2_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(3), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(10), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(10), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(10), dtype="int64")
+ Ts.where(ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1 < T.int64(2560))
+ Ts.reads(fc2_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc2_weight[v1, v0]
@R.function
def forward(x: R.Tensor((1, 784), dtype="float32"), fc1_weight: R.Tensor((256, 784), dtype="float32"), fc1_bias: R.Tensor((256,), dtype="float32"), fc2_weight: R.Tensor((10, 256), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
lv = R.call_dps_packed("fused_relax_permute_dims_relax_matmul_relax_add_relax_nn_relu_cublas", (fc1_weight, x, fc1_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose, (fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
- gv = R.call_tir(cls.matmul, (lv, permute_dims1), out_ty=R.Tensor((1, 10), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose, (fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
+ gv = R.call_tir(Module.matmul, (lv, permute_dims1), out_ty=R.Tensor((1, 10), dtype="float32"))
R.output(gv)
return gv
diff --git a/docs/_sources/how_to/tutorials/e2e_opt_model.rst b/docs/_sources/how_to/tutorials/e2e_opt_model.rst
index 27561e0c5d1..e6af8441100 100644
--- a/docs/_sources/how_to/tutorials/e2e_opt_model.rst
+++ b/docs/_sources/how_to/tutorials/e2e_opt_model.rst
@@ -54,7 +54,7 @@ PyTorch.
.. code-block:: none
Downloading: "https://download.pytorch.org/models/resnet18-f37072fd.pth" to /workspace/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth
- 0%| | 0.00/44.7M [00:00<?, ?B/s] 51%|█████ | 22.9M/44.7M [00:00<00:00, 240MB/s] 100%|██████████| 44.7M/44.7M [00:00<00:00, 262MB/s]
+ 0%| | 0.00/44.7M [00:00<?, ?B/s] 76%|███████▋ | 34.1M/44.7M [00:00<00:00, 358MB/s] 100%|██████████| 44.7M/44.7M [00:00<00:00, 379MB/s]
diff --git a/docs/_sources/how_to/tutorials/import_model.rst b/docs/_sources/how_to/tutorials/import_model.rst
index e6cf683ae4f..4a71e13a381 100644
--- a/docs/_sources/how_to/tutorials/import_model.rst
+++ b/docs/_sources/how_to/tutorials/import_model.rst
@@ -121,6 +121,8 @@ The standard workflow is: ``torch.export.export()`` → ``from_exported_program(
/opt/uv/python/cpython-3.10-linux-x86_64-gnu/lib/python3.10/copyreg.py:101: FutureWarning: `isinstance(treespec, LeafSpec)` is deprecated, use `isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
return cls.__new__(cls, *args)
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -130,10 +132,10 @@ The standard workflow is: ``torch.export.export()`` → ``from_exported_program(
def main(x: R.Tensor((1, 3, 32, 32), dtype="float32"), p_conv_weight: R.Tensor((16, 3, 3, 3), dtype="float32"), p_conv_bias: R.Tensor((16,), dtype="float32"), p_bn_weight: R.Tensor((16,), dtype="float32"), p_bn_bias: R.Tensor((16,), dtype="float32"), p_fc_weight: R.Tensor((10, 16), dtype="float32"), p_fc_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
with R.dataflow():
- lv: R.Tensor((1, 16, 32, 32), dtype="float32") = R.nn.conv2d(x, p_conv_weight, strides=[1, 1], padding=[1, 1, 1, 1], dilation=[1, 1], groups=1, data_layout="NCHW", kernel_layout="OIHW", out_layout="NCHW", out_dtype="float32")
+ lv: R.Tensor((1, 16, 32, 32), dtype="float32") = R.nn.conv2d(x, p_conv_weight, data_layout="NCHW", dilation=[1, 1], groups=1, kernel_layout="OIHW", out_dtype="float32", out_layout="NCHW", padding=[1, 1, 1, 1], strides=[1, 1])
lv1: R.Tensor((1, 16, 1, 1), dtype="float32") = R.reshape(p_conv_bias, R.shape([1, 16, 1, 1]))
lv2: R.Tensor((1, 16, 32, 32), dtype="float32") = R.add(lv, lv1)
- lv3: R.Tuple(R.Tensor((1, 16, 32, 32), dtype="float32"), R.Tensor((16,), dtype="float32"), R.Tensor((16,), dtype="float32")) = R.nn.batch_norm(lv2, p_bn_weight, p_bn_bias, metadata["ir.GenericConst"][0], metadata["ir.GenericConst"][1], axis=1, epsilon=1.0000000000000001e-05, center=True, scale=True, momentum=0.10000000000000001, training=False)
+ lv3: R.Tuple(R.Tensor((1, 16, 32, 32), dtype="float32"), R.Tensor((16,), dtype="float32"), R.Tensor((16,), dtype="float32")) = R.nn.batch_norm(lv2, p_bn_weight, p_bn_bias, metadata["ir.GenericConst"][0], metadata["ir.GenericConst"][1], axis=1, center=True, epsilon=1.0000000000000001e-05, momentum=0.10000000000000001, scale=True, training=False)
lv4: R.Tensor((1, 16, 32, 32), dtype="float32") = lv3[0]
lv5: R.Tensor((1, 16, 32, 32), dtype="float32") = R.nn.relu(lv4)
lv6: R.Tensor((1, 16, 1, 1), dtype="float32") = R.mean(lv5, axis=[-1, -2], keepdims=True)
@@ -452,6 +454,8 @@ Below we create a minimal TFLite model from TensorFlow and import it.
.. code-block:: none
+ from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
diff --git a/docs/_sources/how_to/tutorials/optimize_llm.rst b/docs/_sources/how_to/tutorials/optimize_llm.rst
index 6ac864f7336..326205475b9 100644
--- a/docs/_sources/how_to/tutorials/optimize_llm.rst
+++ b/docs/_sources/how_to/tutorials/optimize_llm.rst
@@ -459,11 +459,10 @@ For demonstration, we only show the part of the model architecture. and paramete
.. code-block:: none
- # from tvm.script import relax as R
+ # from tvm.script import tirx as T
- seq_len = I.dynamic("seq_len", dtype="int64")
@R.function
- def prefill(input_embed: R.Tensor((1, seq_len, 2048), dtype="float16"), paged_kv_cache: R.Any, packed_params: R.Tuple(R.Tensor((32000, 2048), dtype="float16"), R.Tensor((2560, 2048), dtype="float16"), R.Tensor((2048, 2048), dtype="float16"), R.Tensor((11264, 2048), dtype="float16"), R.Tensor((2048, 5632), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2560, 2048), dtype="float16"), R.Tensor((2048, 2048), dtype="float16"), R.Tensor( [...]
+ def prefill[seq_len](input_embed: R.Tensor((1, seq_len, 2048), dtype="float16"), paged_kv_cache: R.Any, packed_params: R.Tuple(R.Tensor((32000, 2048), dtype="float16"), R.Tensor((2560, 2048), dtype="float16"), R.Tensor((2048, 2048), dtype="float16"), R.Tensor((11264, 2048), dtype="float16"), R.Tensor((2048, 5632), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2560, 2048), dtype="float16"), R.Tensor((2048, 2048), dtype="float16"), [...]
R.func_attr({"num_input": 2})
with R.dataflow():
model_embed_tokens_weight1: R.Tensor((32000, 2048), dtype="float16") = packed_params[0]
@@ -476,6 +475,7 @@ For demonstration, we only show the part of the model architecture. and paramete
model_layers_1_self_attn_qkv_proj_weight1: R.Tensor((2560, 2048), dtype="float16") = packed_params[7]
model_layers_1_self_attn_o_proj_weight1: R.Tensor((2048, 2048), dtype="float16") = packed_params[8]
model_layers_1_mlp_gate_up_proj_weight1: R.Tensor((11264, 2048), dtype="float16") = packed_params[9]
+ model_layers_1_mlp_down_proj_weight1: R.Tensor((2048, 5632), dtype="float16") = packed_params[10]
...
Parameters:
diff --git a/docs/_sources/how_to/tutorials/sg_execution_times.rst b/docs/_sources/how_to/tutorials/sg_execution_times.rst
index 9c030f786a7..fd32a9a329a 100644
--- a/docs/_sources/how_to/tutorials/sg_execution_times.rst
+++ b/docs/_sources/how_to/tutorials/sg_execution_times.rst
@@ -6,7 +6,7 @@
Computation times
=================
-**00:16.258** total execution time for 8 files **from how_to/tutorials**:
+**00:15.381** total execution time for 8 files **from how_to/tutorials**:
.. container::
@@ -33,25 +33,25 @@ Computation times
- Time
- Mem (MB)
* - :ref:`sphx_glr_how_to_tutorials_optimize_llm.py` (``optimize_llm.py``)
- - 00:10.866
+ - 00:10.625
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_import_model.py` (``import_model.py``)
- - 00:03.657
+ - 00:03.278
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_e2e_opt_model.py` (``e2e_opt_model.py``)
- - 00:00.778
+ - 00:00.669
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_cross_compilation_and_rpc.py` (``cross_compilation_and_rpc.py``)
- - 00:00.573
+ - 00:00.474
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_customize_opt.py` (``customize_opt.py``)
- - 00:00.348
+ - 00:00.293
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_bring_your_own_codegen.py` (``bring_your_own_codegen.py``)
- - 00:00.029
+ - 00:00.035
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_mix_python_and_tvm_with_pymodule.py` (``mix_python_and_tvm_with_pymodule.py``)
- - 00:00.005
+ - 00:00.004
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_export_and_load_executable.py` (``export_and_load_executable.py``)
- 00:00.002
diff --git a/docs/_sources/reference/api/python/script/ir_builder.rst b/docs/_sources/reference/api/python/script/ir_builder.rst
index b17ba6de316..79751181559 100644
--- a/docs/_sources/reference/api/python/script/ir_builder.rst
+++ b/docs/_sources/reference/api/python/script/ir_builder.rst
@@ -23,7 +23,7 @@ tvm.script.ir_builder
.. automodule:: tvm.script.ir_builder
:members:
:imported-members:
- :exclude-members: DataTypeImm, GenericConst, Range, StringImm, StringType
+ :exclude-members: DataTypeImm, FuncType, GenericConst, PrimType, Range, StringImm, StringType, Type
tvm.relax.script.ir_builder.distributed
***************************************
diff --git a/docs/_sources/reference/api/python/script/printer.rst b/docs/_sources/reference/api/python/script/printer.rst
index b5dddb4396c..cc16c55c3b3 100644
--- a/docs/_sources/reference/api/python/script/printer.rst
+++ b/docs/_sources/reference/api/python/script/printer.rst
@@ -16,10 +16,10 @@
under the License.
tvm.script.printer
-------------------
+-------------------------
tvm.script.printer
-******************
+*************************
.. automodule:: tvm.script.printer
:members:
:imported-members:
diff --git a/docs/_sources/sg_execution_times.rst b/docs/_sources/sg_execution_times.rst
index 65474cb7630..18a196fab97 100644
--- a/docs/_sources/sg_execution_times.rst
+++ b/docs/_sources/sg_execution_times.rst
@@ -6,7 +6,7 @@
Computation times
=================
-**00:23.435** total execution time for 16 files **from all galleries**:
+**00:21.569** total execution time for 16 files **from all galleries**:
.. container::
@@ -33,49 +33,49 @@ Computation times
- Time
- Mem (MB)
* - :ref:`sphx_glr_how_to_tutorials_optimize_llm.py` (``../how_to/tutorials/optimize_llm.py``)
- - 00:10.866
+ - 00:10.625
- 0.0
* - :ref:`sphx_glr_get_started_tutorials_ir_module.py` (``../get_started/tutorials/ir_module.py``)
- - 00:06.191
+ - 00:05.293
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_import_model.py` (``../how_to/tutorials/import_model.py``)
- - 00:03.657
+ - 00:03.278
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_e2e_opt_model.py` (``../how_to/tutorials/e2e_opt_model.py``)
- - 00:00.778
+ - 00:00.669
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_cross_compilation_and_rpc.py` (``../how_to/tutorials/cross_compilation_and_rpc.py``)
- - 00:00.573
+ - 00:00.474
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_customize_opt.py` (``../how_to/tutorials/customize_opt.py``)
- - 00:00.348
+ - 00:00.293
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_tir_transformation.py` (``../deep_dive/tensor_ir/tutorials/tir_transformation.py``)
- - 00:00.304
- - 0.0
- * - :ref:`sphx_glr_get_started_tutorials_quick_start.py` (``../get_started/tutorials/quick_start.py``)
- - 00:00.189
+ - 00:00.264
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_dlight_gpu_scheduling.py` (``../deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.py``)
+ - 00:00.165
+ - 0.0
+ * - :ref:`sphx_glr_get_started_tutorials_quick_start.py` (``../get_started/tutorials/quick_start.py``)
- 00:00.161
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_tir_creation.py` (``../deep_dive/tensor_ir/tutorials/tir_creation.py``)
- - 00:00.159
+ - 00:00.137
- 0.0
* - :ref:`sphx_glr_deep_dive_relax_tutorials_relax_creation.py` (``../deep_dive/relax/tutorials/relax_creation.py``)
- - 00:00.092
+ - 00:00.086
- 0.0
* - :ref:`sphx_glr_deep_dive_relax_tutorials_relax_transformation.py` (``../deep_dive/relax/tutorials/relax_transformation.py``)
- - 00:00.071
+ - 00:00.072
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_bring_your_own_codegen.py` (``../how_to/tutorials/bring_your_own_codegen.py``)
- - 00:00.029
+ - 00:00.035
- 0.0
* - :ref:`sphx_glr_deep_dive_tensor_ir_tutorials_meta_schedule.py` (``../deep_dive/tensor_ir/tutorials/meta_schedule.py``)
- - 00:00.010
+ - 00:00.009
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_mix_python_and_tvm_with_pymodule.py` (``../how_to/tutorials/mix_python_and_tvm_with_pymodule.py``)
- - 00:00.005
+ - 00:00.004
- 0.0
* - :ref:`sphx_glr_how_to_tutorials_export_and_load_executable.py` (``../how_to/tutorials/export_and_load_executable.py``)
- 00:00.002
diff --git a/docs/arch/tvmscript.html b/docs/arch/tvmscript.html
index 16f138a4124..1b4209d6dc6 100644
--- a/docs/arch/tvmscript.html
+++ b/docs/arch/tvmscript.html
@@ -654,7 +654,7 @@ printer converts IR back into readable, parseable source.</p>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>Source + definition context
→ Python AST → syntax transpiler → Python builder program → TVM IR
TVM IR
- → IRDocsifier → Doc tree → Python text
+ → DocTranslator → Doc tree + origins → diagnostic paths → Python text
</pre></div>
</div>
<section id="source-and-frontend">
@@ -752,9 +752,16 @@ protocol.</p>
</section>
<section id="printing-and-round-trips">
<h2>Printing and round trips<a class="headerlink" href="#printing-and-round-trips" title="Link to this heading">#</a></h2>
-<p><code class="docutils literal notranslate"><span class="pre">IRDocsifier</span></code> dispatches on IR types and context to produce a <code class="docutils literal notranslate"><span class="pre">Doc</span></code> tree of
-expressions and statements. It tracks scopes and names; <code class="docutils literal notranslate"><span class="pre">DocToPythonScript</span></code> formats
-the tree as Python text. This document tree is separate from the parser’s Python AST.</p>
+<p><code class="docutils literal notranslate"><span class="pre">DocTranslator</span></code> invokes native type and operation hooks to produce a <code class="docutils literal notranslate"><span class="pre">Doc</span></code> tree
+of expressions and statements. The translation engine tracks scopes, names and each
+Doc’s original IR object. The script entry point maps these origins to diagnostic
+paths; the private Doc printer formats the tree, annotations and underlines as Python
+text. Printer configuration stays read-only throughout. <code class="docutils literal notranslate"><span class="pre">DocToPythonScript</span></code> also
+formats an existing Doc directly. This tree is separate from the parser’s Python AST.</p>
+<p>The public <code class="docutils literal notranslate"><span class="pre">Script</span></code> text entry points are declared in
+<code class="docutils literal notranslate"><span class="pre">tvm/script/printer/printer.h</span></code>. Their orchestration and diagnostic path mapping
+live in <code class="docutils literal notranslate"><span class="pre">src/script/printer/printer.cc</span></code>; <code class="docutils literal notranslate"><span class="pre">doc_translator.h</span></code> exposes the
+IR-to-Doc translation protocol.</p>
<p>For example, a small function can be authored, printed and parsed again:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">tvm</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">tvm.script</span><span class="w"> </span><span class="kn">import</span> <span class="n">tirx</span> <span class="k">as</span> <span class="n">T</span>
@@ -765,7 +772,7 @@ the tree as Python text. This document tree is separate from the parser’s Pyth
<span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="mf">1.0</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">increment</span><span class="o">.</span><span class="n">script</span><span class="p">()</span>
-<span class="n">reparsed</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">script</span><span class="o">.</span><span class="n">from_source</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
+<span class="n">reparsed</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">script</span><span class="o">.</span><span class="n">from_source</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">extra_vars</span><span class="o">=</span><span class="p">{</span><span class="s2">"T"</span><span class="p">:</span> <span class="n">T</span><span class="p">})</span>
<span class="n">tvm</span><span class="o">.</span><span class="n">ir</span><span class="o">.</span><span class="n">assert_structural_equal</span><span class="p">(</span><span class="n">increment</span><span class="p">,</span> <span class="n">reparsed</span><span class="p">)</span>
</pre></div>
</div>
@@ -779,7 +786,10 @@ the text does not serialize arbitrary Python state.</p>
registers its aliases with <code class="docutils literal notranslate"><span class="pre">register_namespace</span></code>. <code class="docutils literal notranslate"><span class="pre">register_namespace_initializer</span></code>
supports lazy setup. <code class="docutils literal notranslate"><span class="pre">tvm.script.register_dialect</span></code> exposes a package through the
public script namespace. Syntax policies are registered beside the operations that
-need them, while IR printing is extended through docsifier registrations.</p>
+need them. IR printing uses <code class="docutils literal notranslate"><span class="pre">FDocTranslate</span></code> hooks from
+<code class="docutils literal notranslate"><span class="pre">tvm/script/printer/doc_translator.h</span></code>, registered through the existing type or
+operation attributes. A hook returns an expression Doc or emits completed statements
+through its translator context.</p>
<p>This division keeps source acquisition, syntax translation and formatting shared.
Language-specific construction and validation remain with the namespace and its
builders.</p>
diff --git a/docs/commit_hash b/docs/commit_hash
index 10289d8a66d..e16c60e3cb3 100644
--- a/docs/commit_hash
+++ b/docs/commit_hash
@@ -1 +1 @@
-5285aa67ed43d84c07f09295cc3643a500d2c080
+b38e214658c11cc6d188c425f20f4f1da51568ea
diff --git a/docs/deep_dive/relax/tutorials/relax_creation.html b/docs/deep_dive/relax/tutorials/relax_creation.html
index 91a19731ca8..b1447f6f1d1 100644
--- a/docs/deep_dive/relax/tutorials/relax_creation.html
+++ b/docs/deep_dive/relax/tutorials/relax_creation.html
@@ -691,7 +691,9 @@ high-level Relax operators using TVMScript.</p>
<span class="n">RelaxModule</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
n = I.dynamic("n", dtype="int64")
@@ -747,34 +749,38 @@ TensorIR functions in Relax function.</p>
<span class="n">RelaxModuleWithTIR</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
-m = I.dynamic("m", dtype="int64")
n = I.dynamic("n", dtype="int64")
+m = I.dynamic("m", dtype="int64")
@I.ir_module
class Module:
@Ts.prim_func
def relu(X: T.Buffer((n, m), "float32"), Y: T.Buffer((n, m), "float32")):
- # with Ts.sblock("root"):
- for i, j in T.grid(n, m):
- with Ts.sblock("relu"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(X[v, v_1])
- Ts.writes(Y[v, v_1])
- Y[v, v_1] = T.max(X[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i in range(T.int64(0), n):
+ for j in range(T.int64(0), m):
+ with Ts.sblock("relu"):
+ v = Ts.axis.spatial(n, i, dtype="int64")
+ v_1 = Ts.axis.spatial(m, j, dtype="int64")
+ Ts.reads(X[v, v_1])
+ Ts.writes(Y[v, v_1])
+ Y[v, v_1] = T.max(X[v, v_1], T.float32(0.0))
@R.function
def forward(data: R.Tensor((n, 784), dtype="float32"), w0: R.Tensor((128, 784), dtype="float32"), b0: R.Tensor((128,), dtype="float32"), w1: R.Tensor((10, 128), dtype="float32"), b1: R.Tensor((10,), dtype="float32")) -> R.Tensor((n, 10), dtype="float32"):
- cls = Module
with R.dataflow():
lv: R.Tensor((784, 128), dtype="float32") = R.permute_dims(w0, axes=None)
lv1: R.Tensor((n, 128), dtype="float32") = R.matmul(data, lv, out_dtype=None)
lv0: R.Tensor((n, 128), dtype="float32") = R.add(lv1, b0)
- lv1_1 = R.call_tir(cls.relu, (lv0,), out_ty=R.Tensor((n, 128), dtype="float32"))
+ lv1_1 = R.call_tir(Module.relu, (lv0,), out_ty=R.Tensor((n, 128), dtype="float32"))
lv4: R.Tensor((128, 10), dtype="float32") = R.permute_dims(w1, axes=None)
lv5: R.Tensor((n, 10), dtype="float32") = R.matmul(lv1_1, lv4, out_dtype=None)
lv2: R.Tensor((n, 10), dtype="float32") = R.add(lv5, b1)
@@ -830,7 +836,9 @@ Relax NNModule API.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
n = I.dynamic("n", dtype="int64")
@@ -910,15 +918,16 @@ Tensor Expression(TE), TensorIR functions or other TVM packed functions.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
-K = I.dynamic("K", dtype="int64")
M = I.dynamic("M", dtype="int64")
+K = I.dynamic("K", dtype="int64")
N = I.dynamic("N", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@I.ir_module
@@ -926,40 +935,51 @@ class Module:
@Ts.prim_func(private=True)
def relu(env_linear: T.Buffer((n, T.int64(128)), "float32"), compute: T.Buffer((n, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(n, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(env_linear[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(env_linear[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n):
+ for i1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(n, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ Ts.reads(env_linear[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(env_linear[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func
def tir_linear(X: T.Buffer((M, K), "float32"), W: T.Buffer((N, K), "float32"), B: T.Buffer((N,), "float32"), Z: T.Buffer((M, N), "float32")):
- # with Ts.sblock("root"):
- for i, j, k in T.grid(M, N, K):
- with Ts.sblock("linear"):
- v, v_1, v_2 = Ts.axis.remap("SSR", [i, j, k])
- Ts.reads(X[v, v_2], W[v_1, v_2])
- Ts.writes(Z[v, v_1])
- with Ts.init():
- Z[v, v_1] = T.float32(0.0)
- Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
- for i, j in T.grid(M, N):
- with Ts.sblock("add"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(Z[v, v_1], B[v_1])
- Ts.writes(Z[v, v_1])
- Z[v, v_1] = Z[v, v_1] + B[v_1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i in range(T.int64(0), M):
+ for j in range(T.int64(0), N):
+ for k in range(T.int64(0), K):
+ with Ts.sblock("linear"):
+ v = Ts.axis.spatial(M, i, dtype="int64")
+ v_1 = Ts.axis.spatial(N, j, dtype="int64")
+ v_2 = Ts.axis.reduce(K, k, dtype="int64")
+ Ts.reads(X[v, v_2], W[v_1, v_2])
+ Ts.writes(Z[v, v_1])
+ with Ts.init():
+ Z[v, v_1] = T.float32(0.0)
+ Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
+ for i_1 in range(T.int64(0), M):
+ for j_1 in range(T.int64(0), N):
+ with Ts.sblock("add"):
+ v_3 = Ts.axis.spatial(M, i_1, dtype="int64")
+ v_4 = Ts.axis.spatial(N, j_1, dtype="int64")
+ Ts.reads(Z[v_3, v_4], B[v_4])
+ Ts.writes(Z[v_3, v_4])
+ Z[v_3, v_4] = Z[v_3, v_4] + B[v_4]
@R.function
def forward(x: R.Tensor((n_1, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
env_linear = R.call_dps_packed("env.linear", (x, fc1_weight, fc1_bias), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv = R.call_tir(cls.relu, (env_linear,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv1 = R.call_tir(cls.tir_linear, (lv, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
+ lv = R.call_tir(Module.relu, (env_linear,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
+ lv1 = R.call_tir(Module.tir_linear, (lv, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
gv: R.Tensor((n_1, 10), dtype="float32") = lv1
R.output(gv)
return gv
@@ -991,7 +1011,9 @@ customized pass.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
n = I.dynamic("n", dtype="int64")
@@ -1039,15 +1061,16 @@ Relax functions, TensorIR functions and other TVM packed functions.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
-K = I.dynamic("K", dtype="int64")
M = I.dynamic("M", dtype="int64")
+K = I.dynamic("K", dtype="int64")
N = I.dynamic("N", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@I.ir_module
@@ -1055,39 +1078,50 @@ class Module:
@Ts.prim_func(private=True)
def relu(lv: T.Buffer((n, T.int64(128)), "float32"), compute: T.Buffer((n, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(n, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(lv[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(lv[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n):
+ for i1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(n, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ Ts.reads(lv[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(lv[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func
def tir_linear(X: T.Buffer((M, K), "float32"), W: T.Buffer((N, K), "float32"), B: T.Buffer((N,), "float32"), Z: T.Buffer((M, N), "float32")):
- # with Ts.sblock("root"):
- for i, j, k in T.grid(M, N, K):
- with Ts.sblock("linear"):
- v, v_1, v_2 = Ts.axis.remap("SSR", [i, j, k])
- Ts.reads(X[v, v_2], W[v_1, v_2])
- Ts.writes(Z[v, v_1])
- with Ts.init():
- Z[v, v_1] = T.float32(0.0)
- Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
- for i, j in T.grid(M, N):
- with Ts.sblock("add"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(Z[v, v_1], B[v_1])
- Ts.writes(Z[v, v_1])
- Z[v, v_1] = Z[v, v_1] + B[v_1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i in range(T.int64(0), M):
+ for j in range(T.int64(0), N):
+ for k in range(T.int64(0), K):
+ with Ts.sblock("linear"):
+ v = Ts.axis.spatial(M, i, dtype="int64")
+ v_1 = Ts.axis.spatial(N, j, dtype="int64")
+ v_2 = Ts.axis.reduce(K, k, dtype="int64")
+ Ts.reads(X[v, v_2], W[v_1, v_2])
+ Ts.writes(Z[v, v_1])
+ with Ts.init():
+ Z[v, v_1] = T.float32(0.0)
+ Z[v, v_1] = Z[v, v_1] + X[v, v_2] * W[v_1, v_2]
+ for i_1 in range(T.int64(0), M):
+ for j_1 in range(T.int64(0), N):
+ with Ts.sblock("add"):
+ v_3 = Ts.axis.spatial(M, i_1, dtype="int64")
+ v_4 = Ts.axis.spatial(N, j_1, dtype="int64")
+ Ts.reads(Z[v_3, v_4], B[v_4])
+ Ts.writes(Z[v_3, v_4])
+ Z[v_3, v_4] = Z[v_3, v_4] + B[v_4]
@R.function
def forward(x: R.Tensor((n_1, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_1, 10), dtype="float32"):
- cls = Module
with R.dataflow():
lv = R.call_dps_packed("env.linear", (x, fc1_weight, fc1_bias), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv1 = R.call_tir(cls.relu, (lv,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
- lv2 = R.call_tir(cls.tir_linear, (lv1, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
+ lv1 = R.call_tir(Module.relu, (lv,), out_ty=R.Tensor((n_1, 128), dtype="float32"))
+ lv2 = R.call_tir(Module.tir_linear, (lv1, fc2_weight, fc2_bias), out_ty=R.Tensor((n_1, 10), dtype="float32"))
gv: R.Tensor((n_1, 10), dtype="float32") = lv2
R.output(gv)
return lv2
diff --git a/docs/deep_dive/relax/tutorials/relax_transformation.html b/docs/deep_dive/relax/tutorials/relax_transformation.html
index 9c626c5f354..8080e5bac1b 100644
--- a/docs/deep_dive/relax/tutorials/relax_transformation.html
+++ b/docs/deep_dive/relax/tutorials/relax_transformation.html
@@ -680,7 +680,9 @@ the <a class="reference internal" href="relax_creation.html#relax-creation"><spa
<span class="n">origin_mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
n = I.dynamic("n", dtype="int64")
@@ -712,11 +714,12 @@ into low-level operators.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@@ -729,96 +732,127 @@ class Module:
@Ts.prim_func(private=True)
def add(matmul: T.Buffer((n, T.int64(128)), "float32"), fc1_bias: T.Buffer((T.int64(128),), "float32"), T_add: T.Buffer((n, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(n, T.int64(128)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul[v_ax0, v_ax1], fc1_bias[v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = matmul[v_ax0, v_ax1] + fc1_bias[v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), n):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(matmul[v_ax0, v_ax1], fc1_bias[v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = matmul[v_ax0, v_ax1] + fc1_bias[v_ax1]
@Ts.prim_func(private=True)
def add1(matmul1: T.Buffer((n_1, T.int64(10)), "float32"), fc2_bias: T.Buffer((T.int64(10),), "float32"), T_add: T.Buffer((n_1, T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(n_1, T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul1[v_ax0, v_ax1], fc2_bias[v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = matmul1[v_ax0, v_ax1] + fc2_bias[v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), n_1):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n_1, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(matmul1[v_ax0, v_ax1], fc2_bias[v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = matmul1[v_ax0, v_ax1] + fc2_bias[v_ax1]
@Ts.prim_func(private=True)
def matmul(x: T.Buffer((n_2, T.int64(784)), "float32"), permute_dims: T.Buffer((T.int64(784), T.int64(128)), "float32"), matmul: T.Buffer((n_2, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(n_2, T.int64(128), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n_2):
+ for i1 in range(T.int64(0), T.int64(128)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n_2, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
@Ts.prim_func(private=True)
def matmul1(relu: T.Buffer((n_3, T.int64(128)), "float32"), permute_dims1: T.Buffer((T.int64(128), T.int64(10)), "float32"), matmul: T.Buffer((n_3, T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(n_3, T.int64(10), T.int64(128)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n_3):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n_3, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(128), k, dtype="int64")
+ Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
@Ts.prim_func(private=True)
def relu(add: T.Buffer((n_4, T.int64(128)), "float32"), compute: T.Buffer((n_4, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(n_4, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(add[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(add[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), n_4):
+ for i1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(n_4, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ Ts.reads(add[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(add[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(128), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(128)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(10), T.int64(128)), "float32"), T_transpose: T.Buffer((T.int64(128), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(128), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(128)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(128), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
@R.function
def forward(x: R.Tensor((n_5, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_5, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
- matmul = R.call_tir(cls.matmul, (x, permute_dims), out_ty=R.Tensor((n_5, 128), dtype="float32"))
- add = R.call_tir(cls.add, (matmul, fc1_bias), out_ty=R.Tensor((n_5, 128), dtype="float32"))
- relu = R.call_tir(cls.relu, (add,), out_ty=R.Tensor((n_5, 128), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
- matmul1 = R.call_tir(cls.matmul1, (relu, permute_dims1), out_ty=R.Tensor((n_5, 10), dtype="float32"))
- add1 = R.call_tir(cls.add1, (matmul1, fc2_bias), out_ty=R.Tensor((n_5, 10), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
+ matmul = R.call_tir(Module.matmul, (x, permute_dims), out_ty=R.Tensor((n_5, 128), dtype="float32"))
+ add = R.call_tir(Module.add, (matmul, fc1_bias), out_ty=R.Tensor((n_5, 128), dtype="float32"))
+ relu = R.call_tir(Module.relu, (add,), out_ty=R.Tensor((n_5, 128), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
+ matmul1 = R.call_tir(Module.matmul1, (relu, permute_dims1), out_ty=R.Tensor((n_5, 10), dtype="float32"))
+ add1 = R.call_tir(Module.add1, (matmul1, fc2_bias), out_ty=R.Tensor((n_5, 10), dtype="float32"))
gv: R.Tensor((n_5, 10), dtype="float32") = add1
R.output(gv)
return gv
@@ -839,11 +873,12 @@ a set of passes. We can apply them in a sequence.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
n = I.dynamic("n", dtype="int64")
n_1 = I.dynamic("n", dtype="int64")
@@ -853,81 +888,106 @@ class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(relu: T.Buffer((n, T.int64(128)), "float32"), permute_dims1: T.Buffer((T.int64(128), T.int64(10)), "float32"), fc2_bias: T.Buffer((T.int64(10),), "float32"), T_add_intermediate: T.Buffer((n, T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((n, T.int64(10)))
- for i0, i1, k in T.grid(n, T.int64(10), T.int64(128)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
- for ax0, ax1 in T.grid(n, T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc2_bias[v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc2_bias[v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((n, T.int64(10)), "float32")
+ for i0 in range(T.int64(0), n):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(128), k, dtype="int64")
+ Ts.reads(relu[v_i0, v_k], permute_dims1[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + relu[v_i0, v_k] * permute_dims1[v_k, v_i1]
+ for ax0 in range(T.int64(0), n):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc2_bias[v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc2_bias[v_ax1]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((n_1, T.int64(784)), "float32"), permute_dims: T.Buffer((T.int64(784), T.int64(128)), "float32"), fc1_bias: T.Buffer((T.int64(128),), "float32"), compute_intermediate: T.Buffer((n_1, T.int64(128)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)))
- T_add_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)))
- for i0, i1, k in T.grid(n_1, T.int64(128), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
- for ax0, ax1 in T.grid(n_1, T.int64(128)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc1_bias[v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc1_bias[v_ax1]
- for i0, i1 in T.grid(n_1, T.int64(128)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(T_add_intermediate[v_i0, v_i1])
- Ts.writes(compute_intermediate[v_i0, v_i1])
- compute_intermediate[v_i0, v_i1] = T.max(T_add_intermediate[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)), "float32")
+ T_add_intermediate = Ts.sblock_alloc_buffer((n_1, T.int64(128)), "float32")
+ for i0 in range(T.int64(0), n_1):
+ for i1 in range(T.int64(0), T.int64(128)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(n_1, i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(128), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], permute_dims[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * permute_dims[v_k, v_i1]
+ for ax0 in range(T.int64(0), n_1):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(n_1, ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(matmul_intermediate[v_ax0, v_ax1], fc1_bias[v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = matmul_intermediate[v_ax0, v_ax1] + fc1_bias[v_ax1]
+ for i0_1 in range(T.int64(0), n_1):
+ for i1_1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("compute"):
+ v_i0_1 = Ts.axis.spatial(n_1, i0_1, dtype="int64")
+ v_i1_1 = Ts.axis.spatial(T.int64(128), i1_1, dtype="int64")
+ Ts.reads(T_add_intermediate[v_i0_1, v_i1_1])
+ Ts.writes(compute_intermediate[v_i0_1, v_i1_1])
+ compute_intermediate[v_i0_1, v_i1_1] = T.max(T_add_intermediate[v_i0_1, v_i1_1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(128), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(128)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(128)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(128)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(128), ax1, dtype="int64")
+ Ts.reads(fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(10), T.int64(128)), "float32"), T_transpose: T.Buffer((T.int64(128), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(128), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(128)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(128), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = fc2_weight[v_ax1, v_ax0]
@R.function
def forward(x: R.Tensor((n_2, 784), dtype="float32"), fc1_weight: R.Tensor((128, 784), dtype="float32"), fc1_bias: R.Tensor((128,), dtype="float32"), fc2_weight: R.Tensor((10, 128), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((n_2, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
- lv = R.call_tir(cls.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((n_2, 128), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (lv, permute_dims1, fc2_bias), out_ty=R.Tensor((n_2, 10), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((784, 128), dtype="float32"))
+ lv = R.call_tir(Module.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((n_2, 128), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((128, 10), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (lv, permute_dims1, fc2_bias), out_ty=R.Tensor((n_2, 10), dtype="float32"))
R.output(gv)
return gv
</pre></div>
@@ -974,7 +1034,9 @@ operator to <code class="docutils literal notranslate"><span class="pre">gelu</s
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
n = I.dynamic("n", dtype="int64")
diff --git a/docs/deep_dive/relax/tutorials/sg_execution_times.html b/docs/deep_dive/relax/tutorials/sg_execution_times.html
index 5157a5d2f7c..6a2774baf43 100644
--- a/docs/deep_dive/relax/tutorials/sg_execution_times.html
+++ b/docs/deep_dive/relax/tutorials/sg_execution_times.html
@@ -634,7 +634,7 @@ document.write(`
<section id="computation-times">
<span id="sphx-glr-deep-dive-relax-tutorials-sg-execution-times"></span><h1>Computation times<a class="headerlink" href="#computation-times" title="Link to this heading">#</a></h1>
-<p><strong>00:00.163</strong> total execution time for 2 files <strong>from deep_dive/relax/tutorials</strong>:</p>
+<p><strong>00:00.159</strong> total execution time for 2 files <strong>from deep_dive/relax/tutorials</strong>:</p>
<div class="docutils container">
<style scoped>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet" />
@@ -656,11 +656,11 @@ $(document).ready( function () {
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference internal" href="relax_creation.html#sphx-glr-deep-dive-relax-tutorials-relax-creation-py"><span class="std std-ref">Relax Creation</span></a> (<code class="docutils literal notranslate"><span class="pre">relax_creation.py</span></code>)</p></td>
-<td><p>00:00.092</p></td>
+<td><p>00:00.086</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="relax_transformation.html#sphx-glr-deep-dive-relax-tutorials-relax-transformation-py"><span class="std std-ref">Transformation</span></a> (<code class="docutils literal notranslate"><span class="pre">relax_transformation.py</span></code>)</p></td>
-<td><p>00:00.071</p></td>
+<td><p>00:00.072</p></td>
<td><p>0.0</p></td>
</tr>
</tbody>
diff --git a/docs/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.html b/docs/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.html
index ffa4848a756..3f772a57e36 100644
--- a/docs/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.html
+++ b/docs/deep_dive/tensor_ir/tutorials/dlight_gpu_scheduling.html
@@ -748,170 +748,182 @@ scheduled again by a later <code class="docutils literal notranslate"><span clas
<span class="n">scheduled_mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims1: T.Buffer((T.int64(768), T.int64(256)), "float32"), fc2_bias: T.Buffer((T.int64(256),), "float32"), T_add_intermediate: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("T_add"):
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc2_bias[v0])
- Ts.writes(T_add_intermediate[T.int64(0), v0])
- T_add_intermediate[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + fc2_bias[v0]
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("T_add"):
+ v0_3 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc2_bias[v0_3])
+ Ts.writes(T_add_intermediate[T.int64(0), v0_3])
+ T_add_intermediate[T.int64(0), v0_3] = matmul_intermediate_local[T.int64(0), v0_3] + fc2_bias[v0_3]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims: T.Buffer((T.int64(768), T.int64(768)), "float32"), fc1_bias: T.Buffer((T.int64(768),), "float32"), compute_intermediate: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("compute"):
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc1_bias[v0])
- Ts.writes(compute_intermediate[T.int64(0), v0])
- compute_intermediate[T.int64(0), v0] = T.max(matmul_intermediate_local[T.int64(0), v0] + fc1_bias[v0], T.float32(0.0))
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("compute"):
+ v0_3 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc1_bias[v0_3])
+ Ts.writes(compute_intermediate[T.int64(0), v0_3])
+ compute_intermediate[T.int64(0), v0_3] = T.max(matmul_intermediate_local[T.int64(0), v0_3] + fc1_bias[v0_3], T.float32(0.0))
@Ts.prim_func(private=True)
def layer_norm(relu: T.Buffer((T.int64(1), T.int64(768)), "float32"), norm_weight: T.Buffer((T.int64(768),), "float32"), norm_bias: T.Buffer((T.int64(768),), "float32"), T_layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 4, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1])
- Ts.writes(relu_sum_shared[T.int64(0)])
- with Ts.init():
- relu_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_var_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)])
- Ts.writes(relu_var_sum_shared[T.int64(0)])
- with Ts.init():
- relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
- for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("T_layer_norm"):
- v0 = Ts.axis.spatial(T.int64(1), T.int64(0))
- v1 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1], norm_bias[v1])
- Ts.writes(T_layer_norm[T.int64(0), v1])
- T_layer_norm[T.int64(0), v1] = (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * T.rsqrt(relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)) * norm_weight[v1] + norm_bias[v1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_sum"):
+ v0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1])
+ Ts.writes(relu_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
+ for ax0_1 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0_1 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_var_sum"):
+ v0_1 = Ts.axis.spatial(T.int64(1), ax0_1, dtype="int64")
+ v1_1 = Ts.axis.reduce(T.int64(768), ax1_fused_0_1 * T.int64(256) + ax1_fused_1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_1], relu_sum_shared[T.int64(0)])
+ Ts.writes(relu_var_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
+ for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("T_layer_norm"):
+ v0_2 = Ts.axis.spatial(T.int64(1), T.int64(0), dtype="int64")
+ v1_2 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_2], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1_2], norm_bias[v1_2])
+ Ts.writes(T_layer_norm[T.int64(0), v1_2])
+ T_layer_norm[T.int64(0), v1_2] = (relu[T.int64(0), v1_2] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * I.Call("tirx.rsqrt", [relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)], ty="float32") * norm_weight[v1_2] + norm_bias[v1_2]
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(768), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768))
- v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768))
- Ts.reads(fc1_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc1_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768), dtype="int64")
+ Ts.reads(fc1_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc1_weight[v1, v0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(256), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(256)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256))
- v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256))
- Ts.reads(fc2_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc2_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256), dtype="int64")
+ Ts.reads(fc2_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc2_weight[v1, v0]
@R.function
def forward(x: R.Tensor((1, 768), dtype="float32"), fc1_weight: R.Tensor((768, 768), dtype="float32"), fc1_bias: R.Tensor((768,), dtype="float32"), norm_weight: R.Tensor((768,), dtype="float32"), norm_bias: R.Tensor((768,), dtype="float32"), fc2_weight: R.Tensor((256, 768), dtype="float32"), fc2_bias: R.Tensor((256,), dtype="float32")) -> R.Tensor((1, 256), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
- lv = R.call_tir(cls.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- layer_norm = R.call_tir(cls.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
+ lv = R.call_tir(Module.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ layer_norm = R.call_tir(Module.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
R.output(gv)
return gv
</pre></div>
@@ -1135,170 +1147,182 @@ with <code class="docutils literal notranslate"><span class="pre">op_names</span
<span class="n">custom_mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims1: T.Buffer((T.int64(768), T.int64(256)), "float32"), fc2_bias: T.Buffer((T.int64(256),), "float32"), T_add_intermediate: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(256)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(16), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("T_add"):
- v0 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc2_bias[v0])
- Ts.writes(T_add_intermediate[T.int64(0), v0])
- T_add_intermediate[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + fc2_bias[v0]
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + layer_norm[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("T_add"):
+ v0_3 = Ts.axis.spatial(T.int64(256), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc2_bias[v0_3])
+ Ts.writes(T_add_intermediate[T.int64(0), v0_3])
+ T_add_intermediate[T.int64(0), v0_3] = matmul_intermediate_local[T.int64(0), v0_3] + fc2_bias[v0_3]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((T.int64(1), T.int64(768)), "float32"), permute_dims: T.Buffer((T.int64(768), T.int64(768)), "float32"), fc1_bias: T.Buffer((T.int64(768),), "float32"), compute_intermediate: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), scope="local")
- matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(48), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate_local = Ts.sblock_alloc_buffer((T.int64(1), T.int64(768)), "float32", scope="local")
+ matmul_intermediate_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(768)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(48), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1 = Ts.axis.reduce(T.int64(16), ax0)
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused)
- Ts.reads(matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul_intermediate_local[T.int64(0), v0])
- with Ts.init():
- matmul_intermediate_local[T.int64(0), v0] = T.float32(0.0)
- matmul_intermediate_local[T.int64(0), v0] = matmul_intermediate_local[T.int64(0), v0] + matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0]
- for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
- for ax0_fused_1 in range(T.int64(1)):
- with Ts.sblock("compute"):
- v0 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1)
- Ts.reads(matmul_intermediate_local[T.int64(0), v0], fc1_bias[v0])
- Ts.writes(compute_intermediate[T.int64(0), v0])
- compute_intermediate[T.int64(0), v0] = T.max(matmul_intermediate_local[T.int64(0), v0] + fc1_bias[v0], T.float32(0.0))
+ matmul_intermediate_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(48)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(48), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1], x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_intermediate_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + x[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax1_fused, dtype="int64")
+ Ts.reads(matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul_intermediate_local[T.int64(0), v0_2])
+ with Ts.init():
+ matmul_intermediate_local[T.int64(0), v0_2] = T.float32(0.0)
+ matmul_intermediate_local[T.int64(0), v0_2] = matmul_intermediate_local[T.int64(0), v0_2] + matmul_intermediate_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
+ for ax0_fused_0_1 in T.thread_binding(T.int64(16), thread="threadIdx.x"):
+ for ax0_fused_1_1 in range(T.int64(0), T.int64(1)):
+ with Ts.sblock("compute"):
+ v0_3 = Ts.axis.spatial(T.int64(768), ax0_fused_0 * T.int64(16) + ax0_fused_0_1 + ax0_fused_1_1, dtype="int64")
+ Ts.reads(matmul_intermediate_local[T.int64(0), v0_3], fc1_bias[v0_3])
+ Ts.writes(compute_intermediate[T.int64(0), v0_3])
+ compute_intermediate[T.int64(0), v0_3] = T.max(matmul_intermediate_local[T.int64(0), v0_3] + fc1_bias[v0_3], T.float32(0.0))
@Ts.prim_func(private=True)
def layer_norm(relu: T.Buffer((T.int64(1), T.int64(768)), "float32"), norm_weight: T.Buffer((T.int64(768),), "float32"), norm_bias: T.Buffer((T.int64(768),), "float32"), T_layer_norm: T.Buffer((T.int64(1), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 4, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), scope="shared")
- for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1])
- Ts.writes(relu_sum_shared[T.int64(0)])
- with Ts.init():
- relu_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
- for ax0 in range(T.int64(1)):
- for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_fused_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("relu_var_sum"):
- v0 = Ts.axis.spatial(T.int64(1), ax0)
- v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)])
- Ts.writes(relu_var_sum_shared[T.int64(0)])
- with Ts.init():
- relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
- relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
- for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
- for ax1_0 in T.serial(T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
- with Ts.sblock("T_layer_norm"):
- v0 = Ts.axis.spatial(T.int64(1), T.int64(0))
- v1 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1)
- Ts.reads(relu[T.int64(0), v1], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1], norm_bias[v1])
- Ts.writes(T_layer_norm[T.int64(0), v1])
- T_layer_norm[T.int64(0), v1] = (relu[T.int64(0), v1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * T.rsqrt(relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)) * norm_weight[v1] + norm_bias[v1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ relu_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ relu_var_sum_shared = Ts.sblock_alloc_buffer((T.int64(1),), "float32", scope="shared")
+ for ax0_fused in T.thread_binding(T.int64(1), thread="blockIdx.x"):
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_sum"):
+ v0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v1 = Ts.axis.reduce(T.int64(768), ax1_fused_0 * T.int64(256) + ax1_fused_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1])
+ Ts.writes(relu_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_sum_shared[T.int64(0)] = relu_sum_shared[T.int64(0)] + relu[T.int64(0), v1]
+ for ax0_1 in range(T.int64(0), T.int64(1)):
+ for ax1_fused_1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_fused_0_1 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("relu_var_sum"):
+ v0_1 = Ts.axis.spatial(T.int64(1), ax0_1, dtype="int64")
+ v1_1 = Ts.axis.reduce(T.int64(768), ax1_fused_0_1 * T.int64(256) + ax1_fused_1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_1], relu_sum_shared[T.int64(0)])
+ Ts.writes(relu_var_sum_shared[T.int64(0)])
+ with Ts.init():
+ relu_var_sum_shared[T.int64(0)] = T.float32(0.0)
+ relu_var_sum_shared[T.int64(0)] = relu_var_sum_shared[T.int64(0)] + (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * (relu[T.int64(0), v1_1] - relu_sum_shared[T.int64(0)] / T.float32(768.0))
+ for ax1_1 in T.thread_binding(T.int64(256), thread="threadIdx.x"):
+ for ax1_0 in T.serial(T.int64(0), T.int64(3), annotations={"pragma_auto_unroll_max_step": 256, "pragma_unroll_explicit": 1}):
+ with Ts.sblock("T_layer_norm"):
+ v0_2 = Ts.axis.spatial(T.int64(1), T.int64(0), dtype="int64")
+ v1_2 = Ts.axis.spatial(T.int64(768), ax1_0 * T.int64(256) + ax1_1, dtype="int64")
+ Ts.reads(relu[T.int64(0), v1_2], relu_sum_shared[T.int64(0)], relu_var_sum_shared[T.int64(0)], norm_weight[v1_2], norm_bias[v1_2])
+ Ts.writes(T_layer_norm[T.int64(0), v1_2])
+ T_layer_norm[T.int64(0), v1_2] = (relu[T.int64(0), v1_2] - relu_sum_shared[T.int64(0)] / T.float32(768.0)) * I.Call("tirx.rsqrt", [relu_var_sum_shared[T.int64(0)] / T.float32(768.0) + T.float32(1.0000000000000001e-05)], ty="float32") * norm_weight[v1_2] + norm_bias[v1_2]
@Ts.prim_func(private=True)
def transpose(fc1_weight: T.Buffer((T.int64(768), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(768)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768))
- v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768))
- Ts.reads(fc1_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc1_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(576), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(768), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(768), dtype="int64")
+ Ts.reads(fc1_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc1_weight[v1, v0]
@Ts.prim_func(private=True)
def transpose1(fc2_weight: T.Buffer((T.int64(256), T.int64(768)), "float32"), T_transpose: T.Buffer((T.int64(768), T.int64(256)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256))
- v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256))
- Ts.reads(fc2_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc2_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(192), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(768), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(256), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(256), dtype="int64")
+ Ts.reads(fc2_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc2_weight[v1, v0]
@R.function
def forward(x: R.Tensor((1, 768), dtype="float32"), fc1_weight: R.Tensor((768, 768), dtype="float32"), fc1_bias: R.Tensor((768,), dtype="float32"), norm_weight: R.Tensor((768,), dtype="float32"), norm_bias: R.Tensor((768,), dtype="float32"), fc2_weight: R.Tensor((256, 768), dtype="float32"), fc2_bias: R.Tensor((256,), dtype="float32")) -> R.Tensor((1, 256), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- permute_dims = R.call_tir(cls.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
- lv = R.call_tir(cls.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- layer_norm = R.call_tir(cls.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
+ permute_dims = R.call_tir(Module.transpose, (fc1_weight,), out_ty=R.Tensor((768, 768), dtype="float32"))
+ lv = R.call_tir(Module.fused_matmul_add_relu, (x, permute_dims, fc1_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ layer_norm = R.call_tir(Module.layer_norm, (lv, norm_weight, norm_bias), out_ty=R.Tensor((1, 768), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose1, (fc2_weight,), out_ty=R.Tensor((768, 256), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (layer_norm, permute_dims1, fc2_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
R.output(gv)
return gv
</pre></div>
diff --git a/docs/deep_dive/tensor_ir/tutorials/sg_execution_times.html b/docs/deep_dive/tensor_ir/tutorials/sg_execution_times.html
index 7413bf70746..554788c059d 100644
--- a/docs/deep_dive/tensor_ir/tutorials/sg_execution_times.html
+++ b/docs/deep_dive/tensor_ir/tutorials/sg_execution_times.html
@@ -634,7 +634,7 @@ document.write(`
<section id="computation-times">
<span id="sphx-glr-deep-dive-tensor-ir-tutorials-sg-execution-times"></span><h1>Computation times<a class="headerlink" href="#computation-times" title="Link to this heading">#</a></h1>
-<p><strong>00:00.634</strong> total execution time for 4 files <strong>from deep_dive/tensor_ir/tutorials</strong>:</p>
+<p><strong>00:00.575</strong> total execution time for 4 files <strong>from deep_dive/tensor_ir/tutorials</strong>:</p>
<div class="docutils container">
<style scoped>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet" />
@@ -656,19 +656,19 @@ $(document).ready( function () {
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference internal" href="tir_transformation.html#sphx-glr-deep-dive-tensor-ir-tutorials-tir-transformation-py"><span class="std std-ref">Transformation</span></a> (<code class="docutils literal notranslate"><span class="pre">tir_transformation.py</span></code>)</p></td>
-<td><p>00:00.304</p></td>
+<td><p>00:00.264</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="dlight_gpu_scheduling.html#sphx-glr-deep-dive-tensor-ir-tutorials-dlight-gpu-scheduling-py"><span class="std std-ref">DLight: Rule-Based GPU Scheduling</span></a> (<code class="docutils literal notranslate"><span class="pre">dlight_gpu_scheduling.py</span></code>)</p></td>
-<td><p>00:00.161</p></td>
+<td><p>00:00.165</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="tir_creation.html#sphx-glr-deep-dive-tensor-ir-tutorials-tir-creation-py"><span class="std std-ref">TensorIR Creation</span></a> (<code class="docutils literal notranslate"><span class="pre">tir_creation.py</span></code>)</p></td>
-<td><p>00:00.159</p></td>
+<td><p>00:00.137</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="meta_schedule.html#sphx-glr-deep-dive-tensor-ir-tutorials-meta-schedule-py"><span class="std std-ref">MetaSchedule: Search-Based Auto-Tuning</span></a> (<code class="docutils literal notranslate"><span class="pre">meta_schedule.py</span></code>)</p></td>
-<td><p>00:00.010</p></td>
+<td><p>00:00.009</p></td>
<td><p>0.0</p></td>
</tr>
</tbody>
diff --git a/docs/deep_dive/tensor_ir/tutorials/tir_creation.html b/docs/deep_dive/tensor_ir/tutorials/tir_creation.html
index 54a61ee240c..327ddc60cee 100644
--- a/docs/deep_dive/tensor_ir/tutorials/tir_creation.html
+++ b/docs/deep_dive/tensor_ir/tutorials/tir_creation.html
@@ -908,32 +908,41 @@ and one output parameter <strong>C</strong>.</p>
<span class="n">TEModule</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def mm_relu(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- Y = Ts.sblock_alloc_buffer((128, 128))
- for i, j, k in T.grid(128, 128, 128):
- with Ts.sblock("Y"):
- v_i, v_j, v_k = Ts.axis.remap("SSR", [i, j, k])
- Ts.reads(A[v_i, v_k], B[v_k, v_j])
- Ts.writes(Y[v_i, v_j])
- with Ts.init():
- Y[v_i, v_j] = T.float32(0.0)
- Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
- for i, j in T.grid(128, 128):
- with Ts.sblock("C"):
- v_i, v_j = Ts.axis.remap("SS", [i, j])
- Ts.reads(Y[v_i, v_j])
- Ts.writes(C[v_i, v_j])
- C[v_i, v_j] = T.max(Y[v_i, v_j], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ Y = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j in range(128):
+ for k in range(128):
+ with Ts.sblock("Y"):
+ v_i = Ts.axis.spatial(128, i)
+ v_j = Ts.axis.spatial(128, j)
+ v_k = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_i, v_k], B[v_k, v_j])
+ Ts.writes(Y[v_i, v_j])
+ with Ts.init():
+ Y[v_i, v_j] = T.float32(0.0)
+ Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
+ for i_1 in range(128):
+ for j_1 in range(128):
+ with Ts.sblock("C"):
+ v_i_1 = Ts.axis.spatial(128, i_1)
+ v_j_1 = Ts.axis.spatial(128, j_1)
+ Ts.reads(Y[v_i_1, v_j_1])
+ Ts.writes(C[v_i_1, v_j_1])
+ C[v_i_1, v_j_1] = T.max(Y[v_i_1, v_j_1], T.float32(0.0))
</pre></div>
</div>
</section>
@@ -954,35 +963,44 @@ is that we need to specify the shape of the input tensors as symbolic variables.
<span class="n">DynamicTEModule</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
-k = I.dynamic("k", dtype="int32")
m = I.dynamic("m", dtype="int32")
n = I.dynamic("n", dtype="int32")
+k = I.dynamic("k", dtype="int32")
@I.ir_module
class Module:
@Ts.prim_func
def mm_relu(A: T.Buffer((m, n), "float32"), B: T.Buffer((k, n), "float32"), C: T.Buffer((m, n), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- Y = Ts.sblock_alloc_buffer((m, n))
- for i, j, k_1 in T.grid(m, n, k):
- with Ts.sblock("Y"):
- v_i, v_j, v_k = Ts.axis.remap("SSR", [i, j, k_1])
- Ts.reads(A[v_i, v_k], B[v_k, v_j])
- Ts.writes(Y[v_i, v_j])
- with Ts.init():
- Y[v_i, v_j] = T.float32(0.0)
- Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
- for i, j in T.grid(m, n):
- with Ts.sblock("C"):
- v_i, v_j = Ts.axis.remap("SS", [i, j])
- Ts.reads(Y[v_i, v_j])
- Ts.writes(C[v_i, v_j])
- C[v_i, v_j] = T.max(Y[v_i, v_j], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ Y = Ts.sblock_alloc_buffer((m, n), "float32")
+ for i in range(m):
+ for j in range(n):
+ for k_1 in range(k):
+ with Ts.sblock("Y"):
+ v_i = Ts.axis.spatial(m, i)
+ v_j = Ts.axis.spatial(n, j)
+ v_k = Ts.axis.reduce(k, k_1)
+ Ts.reads(A[v_i, v_k], B[v_k, v_j])
+ Ts.writes(Y[v_i, v_j])
+ with Ts.init():
+ Y[v_i, v_j] = T.float32(0.0)
+ Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
+ for i_1 in range(m):
+ for j_1 in range(n):
+ with Ts.sblock("C"):
+ v_i_1 = Ts.axis.spatial(m, i_1)
+ v_j_1 = Ts.axis.spatial(n, j_1)
+ Ts.reads(Y[v_i_1, v_j_1])
+ Ts.writes(C[v_i_1, v_j_1])
+ C[v_i_1, v_j_1] = T.max(Y[v_i_1, v_j_1], T.float32(0.0))
</pre></div>
</div>
<div class="sphx-glr-footer sphx-glr-footer-example docutils container" id="sphx-glr-download-deep-dive-tensor-ir-tutorials-tir-creation-py">
diff --git a/docs/deep_dive/tensor_ir/tutorials/tir_transformation.html b/docs/deep_dive/tensor_ir/tutorials/tir_transformation.html
index 1df0b1ace37..8fb571f2c7e 100644
--- a/docs/deep_dive/tensor_ir/tutorials/tir_transformation.html
+++ b/docs/deep_dive/tensor_ir/tutorials/tir_transformation.html
@@ -722,7 +722,7 @@ original implementation.</p>
</div>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
- 2.7527 2.7527 2.7527 2.7527 0.0000
+ 2.5870 2.5870 2.5870 2.5870 0.0000
</pre></div>
</div>
<section id="initialization-schedule">
@@ -753,34 +753,42 @@ non-existence of variable <code class="docutils literal notranslate"><span class
<div class="highlight-Python notranslate"><div class="highlight"><pre><span></span><span class="n">sch</span><span class="o">.</span><span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0, j_1, k in T.grid(128, 16, 8, 128):
- with Ts.sblock("Y"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- with Ts.init():
- buffer[v, v_1] = T.float32(0.0)
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for i, j in T.grid(128, 128):
- with Ts.sblock("C"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for j_1 in range(8):
+ for k in range(128):
+ with Ts.sblock("Y"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_3 = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_1, v_3], B[v_3, v_2])
+ Ts.writes(v[v_1, v_2])
+ with Ts.init():
+ v[v_1, v_2] = T.float32(0.0)
+ v[v_1, v_2] = v[v_1, v_2] + A[v_1, v_3] * B[v_3, v_2]
+ for i_1 in range(128):
+ for j in range(128):
+ with Ts.sblock("C"):
+ v_4 = Ts.axis.spatial(128, i_1)
+ v_5 = Ts.axis.spatial(128, j)
+ Ts.reads(v[v_4, v_5])
+ Ts.writes(C[v_4, v_5])
+ C[v_4, v_5] = T.max(v[v_4, v_5], T.float32(0.0))
</pre></div>
</div>
<p>Following the initial transformation phase, two supplementary loops, <code class="docutils literal notranslate"><span class="pre">j_0</span></code> and <code class="docutils literal notranslate"><span class="pre">j_1</span></code>,
@@ -791,38 +799,46 @@ action involves reordering these two loops.</p>
<span class="n">evaluate</span><span class="p">(</span><span class="n">sch</span><span class="o">.</span><span class="n">mod</span><span class="p">)</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0, k, j_1 in T.grid(128, 16, 128, 8):
- with Ts.sblock("Y"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- with Ts.init():
- buffer[v, v_1] = T.float32(0.0)
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for i, j in T.grid(128, 128):
- with Ts.sblock("C"):
- v, v_1 = Ts.axis.remap("SS", [i, j])
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_3 = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_1, v_3], B[v_3, v_2])
+ Ts.writes(v[v_1, v_2])
+ with Ts.init():
+ v[v_1, v_2] = T.float32(0.0)
+ v[v_1, v_2] = v[v_1, v_2] + A[v_1, v_3] * B[v_3, v_2]
+ for i_1 in range(128):
+ for j in range(128):
+ with Ts.sblock("C"):
+ v_4 = Ts.axis.spatial(128, i_1)
+ v_5 = Ts.axis.spatial(128, j)
+ Ts.reads(v[v_4, v_5])
+ Ts.writes(C[v_4, v_5])
+ C[v_4, v_5] = T.max(v[v_4, v_5], T.float32(0.0))
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
- 0.8645 0.8645 0.8645 0.8645 0.0000
+ 0.8631 0.8631 0.8631 0.8631 0.0000
</pre></div>
</div>
</section>
@@ -836,36 +852,41 @@ variant. First, we employ a primitive known as <strong>reverse_compute_at</stron
<span class="n">sch</span><span class="o">.</span><span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0 in T.grid(128, 16):
- for k, j_1 in T.grid(128, 8):
- with Ts.sblock("Y"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- with Ts.init():
- buffer[v, v_1] = T.float32(0.0)
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for ax0 in range(8):
- with Ts.sblock("C"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + ax0)
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_3 = Ts.axis.reduce(128, k)
+ Ts.reads(A[v_1, v_3], B[v_3, v_2])
+ Ts.writes(v[v_1, v_2])
+ with Ts.init():
+ v[v_1, v_2] = T.float32(0.0)
+ v[v_1, v_2] = v[v_1, v_2] + A[v_1, v_3] * B[v_3, v_2]
+ for ax0 in range(8):
+ with Ts.sblock("C"):
+ v_4 = Ts.axis.spatial(128, i)
+ v_5 = Ts.axis.spatial(128, j_0 * 8 + ax0)
+ Ts.reads(v[v_4, v_5])
+ Ts.writes(C[v_4, v_5])
+ C[v_4, v_5] = T.max(v[v_4, v_5], T.float32(0.0))
</pre></div>
</div>
</section>
@@ -882,45 +903,50 @@ from the reduction update via the <strong>decompose_reduction</strong> primitive
<span class="n">evaluate</span><span class="p">(</span><span class="n">sch</span><span class="o">.</span><span class="n">mod</span><span class="p">)</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0 in T.grid(128, 16):
- for j_1_init in range(8):
- with Ts.sblock("Y_init"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
- Ts.reads()
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = T.float32(0.0)
- for k, j_1 in T.grid(128, 8):
- with Ts.sblock("Y_update"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(buffer[v, v_1], A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for ax0 in range(8):
- with Ts.sblock("C"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + ax0)
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for j_1_init in range(8):
+ with Ts.sblock("Y_init"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
+ Ts.reads()
+ Ts.writes(v[v_1, v_2])
+ v[v_1, v_2] = T.float32(0.0)
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y_update"):
+ v_3 = Ts.axis.spatial(128, i)
+ v_4 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_5 = Ts.axis.reduce(128, k)
+ Ts.reads(v[v_3, v_4], A[v_3, v_5], B[v_5, v_4])
+ Ts.writes(v[v_3, v_4])
+ v[v_3, v_4] = v[v_3, v_4] + A[v_3, v_5] * B[v_5, v_4]
+ for ax0 in range(8):
+ with Ts.sblock("C"):
+ v_6 = Ts.axis.spatial(128, i)
+ v_7 = Ts.axis.spatial(128, j_0 * 8 + ax0)
+ Ts.reads(v[v_6, v_7])
+ Ts.writes(C[v_6, v_7])
+ C[v_6, v_7] = T.max(v[v_6, v_7], T.float32(0.0))
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
- 0.3367 0.3367 0.3367 0.3367 0.0000
+ 0.3447 0.3447 0.3447 0.3447 0.0000
</pre></div>
</div>
</section>
@@ -949,41 +975,46 @@ def apply_trace(sch: s_tir.Schedule) -> None:
<div class="highlight-Python notranslate"><div class="highlight"><pre><span></span><span class="n">sch</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func
def main(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- buffer = Ts.sblock_alloc_buffer((128, 128))
- for i, j_0 in T.grid(128, 16):
- for j_1_init in range(8):
- with Ts.sblock("Y_init"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
- Ts.reads()
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = T.float32(0.0)
- for k, j_1 in T.grid(128, 8):
- with Ts.sblock("Y_update"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + j_1)
- v_2 = Ts.axis.reduce(128, k)
- Ts.reads(buffer[v, v_1], A[v, v_2], B[v_2, v_1])
- Ts.writes(buffer[v, v_1])
- buffer[v, v_1] = buffer[v, v_1] + A[v, v_2] * B[v_2, v_1]
- for ax0 in range(8):
- with Ts.sblock("C"):
- v = Ts.axis.spatial(128, i)
- v_1 = Ts.axis.spatial(128, j_0 * 8 + ax0)
- Ts.reads(buffer[v, v_1])
- Ts.writes(C[v, v_1])
- C[v, v_1] = T.max(buffer[v, v_1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ v = Ts.sblock_alloc_buffer((128, 128), "float32")
+ for i in range(128):
+ for j_0 in range(16):
+ for j_1_init in range(8):
+ with Ts.sblock("Y_init"):
+ v_1 = Ts.axis.spatial(128, i)
+ v_2 = Ts.axis.spatial(128, j_0 * 8 + j_1_init)
+ Ts.reads()
+ Ts.writes(v[v_1, v_2])
+ v[v_1, v_2] = T.float32(0.0)
+ for k in range(128):
+ for j_1 in range(8):
+ with Ts.sblock("Y_update"):
+ v_3 = Ts.axis.spatial(128, i)
+ v_4 = Ts.axis.spatial(128, j_0 * 8 + j_1)
+ v_5 = Ts.axis.reduce(128, k)
+ Ts.reads(v[v_3, v_4], A[v_3, v_5], B[v_5, v_4])
+ Ts.writes(v[v_3, v_4])
+ v[v_3, v_4] = v[v_3, v_4] + A[v_3, v_5] * B[v_5, v_4]
+ for ax0 in range(8):
+ with Ts.sblock("C"):
+ v_6 = Ts.axis.spatial(128, i)
+ v_7 = Ts.axis.spatial(128, j_0 * 8 + ax0)
+ Ts.reads(v[v_6, v_7])
+ Ts.writes(C[v_6, v_7])
+ C[v_6, v_7] = T.max(v[v_6, v_7], T.float32(0.0))
# from tvm import s_tir
def apply_trace(sch: s_tir.Schedule) -> None:
diff --git a/docs/genindex.html b/docs/genindex.html
index a6b88bbea11..5a4eceb0420 100644
--- a/docs/genindex.html
+++ b/docs/genindex.html
@@ -1363,6 +1363,8 @@ document.write(`
<li><a href="reference/api/python/s_tir/analysis.html#tvm.s_tir.analysis.calculate_allocated_bytes">calculate_allocated_bytes() (in module tvm.s_tir.analysis)</a>
</li>
<li><a href="reference/api/python/ir.html#tvm.ir.Call">Call (class in tvm.ir)</a>
+</li>
+ <li><a href="reference/api/python/script/ir_builder.html#tvm.script.ir_builder.Call">Call() (in module tvm.script.ir_builder)</a>
</li>
<li><a href="reference/api/python/relax/op.html#tvm.relax.op.call_builtin_with_ctx">call_builtin_with_ctx() (in module tvm.relax.op)</a>
@@ -4105,7 +4107,11 @@ document.write(`
<li><a href="tirx/api/cuda.html#tvm.backend.cuda.lang.SmemDescriptor.make_lo_uniform">make_lo_uniform() (tvm.backend.cuda.lang.SmemDescriptor method)</a>
</li>
<li><a href="reference/api/python/ir.html#tvm.ir.make_node">make_node() (in module tvm.ir)</a>
+
+ <ul>
+ <li><a href="reference/api/python/script/ir_builder.html#tvm.script.ir_builder.make_node">(in module tvm.script.ir_builder)</a>
</li>
+ </ul></li>
<li><a href="tirx/api/transform.html#tvm.tirx.transform.MakePackedAPI">MakePackedAPI() (in module tvm.tirx.transform)</a>
</li>
<li><a href="reference/api/python/ir.html#tvm.ir.Map">Map (class in tvm.ir)</a>
@@ -4882,6 +4888,8 @@ document.write(`
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="reference/api/python/contrib.html#tvm.contrib.hexagon.pack_imports">pack_imports() (in module tvm.contrib.hexagon)</a>
+</li>
+ <li><a href="reference/api/python/script/script.html#tvm.script.relax.PackedFunc">PackedFunc (in module tvm.script.relax)</a>
</li>
<li><a href="reference/api/python/relax/relax.html#tvm.relax.PackedFuncType">PackedFuncType (class in tvm.relax)</a>
</li>
@@ -5012,11 +5020,11 @@ document.write(`
<li><a href="reference/api/python/topi.html#tvm.topi.nn.pool3d">pool3d() (in module tvm.topi.nn)</a>
</li>
<li><a href="reference/api/python/relax/op.html#tvm.relax.op.op_attrs.Pool3DAttrs">Pool3DAttrs (class in tvm.relax.op.op_attrs)</a>
-</li>
- <li><a href="reference/api/python/topi.html#tvm.topi.nn.pool_grad">pool_grad() (in module tvm.topi.nn)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="reference/api/python/topi.html#tvm.topi.nn.pool_grad">pool_grad() (in module tvm.topi.nn)</a>
+</li>
<li><a href="reference/api/python/topi.html#tvm.topi.testing.pool_grad_nchw">pool_grad_nchw() (in module tvm.topi.testing)</a>
</li>
<li><a href="reference/api/python/relax/op.html#tvm.relax.op.op_attrs.Pool1DAttrs.pool_size">pool_size (tvm.relax.op.op_attrs.Pool1DAttrs property)</a>
diff --git a/docs/get_started/tutorials/ir_module.html b/docs/get_started/tutorials/ir_module.html
index 02c16dd030b..601b78a2465 100644
--- a/docs/get_started/tutorials/ir_module.html
+++ b/docs/get_started/tutorials/ir_module.html
@@ -727,6 +727,8 @@ from PyTorch.</p>
</div>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>/opt/uv/python/cpython-3.10-linux-x86_64-gnu/lib/python3.10/copyreg.py:101: FutureWarning: `isinstance(treespec, LeafSpec)` is deprecated, use `isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
return cls.__new__(cls, *args)
+from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -776,7 +778,9 @@ write the IRModule directly.</p>
<span class="n">mod_from_relax</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
@I.ir_module
@@ -835,7 +839,9 @@ parse the TVMScript to obtain an IRModule.</p>
<span class="n">mod_from_script</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
@I.ir_module
@@ -865,7 +871,7 @@ class Module:
<span class="nb">print</span><span class="p">(</span><span class="n">mod</span><span class="o">.</span><span class="n">get_global_vars</span><span class="p">())</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>(I.GlobalVar("main"),)
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>(Module.main,)
</pre></div>
</div>
<p>We can access the functions in the IRModule by indexing with the GlobalVars
@@ -877,7 +883,9 @@ or their names</p>
<span class="k">assert</span> <span class="n">mod</span><span class="p">[</span><a href="../../reference/api/python/ir.html#tvm.ir.GlobalVar" title="tvm.ir.GlobalVar" class="sphx-glr-backref-module-tvm-ir sphx-glr-backref-type-py-class sphx-glr-backref-instance"><span class="n">gv</span></a><span class="p">]</span> <span class="o">==</span> <span class="n">mod</span><span class="p">[</span><span class="s2">"main"</span><span class="p">]</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import relax as R
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import relax as R
@R.function
def main(x: R.Tensor((1, 784), dtype="float32"), p_fc1_weight: R.Tensor((256, 784), dtype="float32"), p_fc1_bias: R.Tensor((256,), dtype="float32"), p_fc2_weight: R.Tensor((10, 256), dtype="float32"), p_fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
@@ -913,107 +921,139 @@ within the same module. Meanwhile, the Relax operators will be converted into <c
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def add(p_fc1_bias: T.Buffer((T.int64(256),), "float32"), lv1: T.Buffer((T.int64(1), T.int64(256)), "float32"), T_add: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_bias[v_ax1], lv1[v_ax0, v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + lv1[v_ax0, v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_bias[v_ax1], lv1[v_ax0, v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + lv1[v_ax0, v_ax1]
@Ts.prim_func(private=True)
def add1(p_fc2_bias: T.Buffer((T.int64(10),), "float32"), lv5: T.Buffer((T.int64(1), T.int64(10)), "float32"), T_add: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(1), T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_bias[v_ax1], lv5[v_ax0, v_ax1])
- Ts.writes(T_add[v_ax0, v_ax1])
- T_add[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + lv5[v_ax0, v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_bias[v_ax1], lv5[v_ax0, v_ax1])
+ Ts.writes(T_add[v_ax0, v_ax1])
+ T_add[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + lv5[v_ax0, v_ax1]
@Ts.prim_func(private=True)
def matmul(x: T.Buffer((T.int64(1), T.int64(784)), "float32"), lv: T.Buffer((T.int64(784), T.int64(256)), "float32"), matmul: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(T.int64(1), T.int64(256), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(256)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(256), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
@Ts.prim_func(private=True)
def matmul1(lv3: T.Buffer((T.int64(1), T.int64(256)), "float32"), lv4: T.Buffer((T.int64(256), T.int64(10)), "float32"), matmul: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1, k in T.grid(T.int64(1), T.int64(10), T.int64(256)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
- Ts.writes(matmul[v_i0, v_i1])
- with Ts.init():
- matmul[v_i0, v_i1] = T.float32(0.0)
- matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(256), k, dtype="int64")
+ Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
+ Ts.writes(matmul[v_i0, v_i1])
+ with Ts.init():
+ matmul[v_i0, v_i1] = T.float32(0.0)
+ matmul[v_i0, v_i1] = matmul[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
@Ts.prim_func(private=True)
def relu(lv2: T.Buffer((T.int64(1), T.int64(256)), "float32"), compute: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for i0, i1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(lv2[v_i0, v_i1])
- Ts.writes(compute[v_i0, v_i1])
- compute[v_i0, v_i1] = T.max(lv2[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("compute"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(256), i1, dtype="int64")
+ Ts.reads(lv2[v_i0, v_i1])
+ Ts.writes(compute[v_i0, v_i1])
+ compute[v_i0, v_i1] = T.max(lv2[v_i0, v_i1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(p_fc1_weight: T.Buffer((T.int64(256), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(256)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(p_fc2_weight: T.Buffer((T.int64(10), T.int64(256)), "float32"), T_transpose: T.Buffer((T.int64(256), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(256), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(256)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(256), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
@R.function
def main(x: R.Tensor((1, 784), dtype="float32"), p_fc1_weight: R.Tensor((256, 784), dtype="float32"), p_fc1_bias: R.Tensor((256,), dtype="float32"), p_fc2_weight: R.Tensor((10, 256), dtype="float32"), p_fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- lv = R.call_tir(cls.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
- lv1 = R.call_tir(cls.matmul, (x, lv), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv2 = R.call_tir(cls.add, (p_fc1_bias, lv1), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv3 = R.call_tir(cls.relu, (lv2,), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv4 = R.call_tir(cls.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
- lv5 = R.call_tir(cls.matmul1, (lv3, lv4), out_ty=R.Tensor((1, 10), dtype="float32"))
- lv6 = R.call_tir(cls.add1, (p_fc2_bias, lv5), out_ty=R.Tensor((1, 10), dtype="float32"))
+ lv = R.call_tir(Module.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
+ lv1 = R.call_tir(Module.matmul, (x, lv), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv2 = R.call_tir(Module.add, (p_fc1_bias, lv1), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv3 = R.call_tir(Module.relu, (lv2,), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv4 = R.call_tir(Module.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
+ lv5 = R.call_tir(Module.matmul1, (lv3, lv4), out_ty=R.Tensor((1, 10), dtype="float32"))
+ lv6 = R.call_tir(Module.add1, (p_fc2_bias, lv5), out_ty=R.Tensor((1, 10), dtype="float32"))
gv: R.Tensor((1, 10), dtype="float32") = lv6
R.output(gv)
return gv
@@ -1024,7 +1064,7 @@ the global vars again.</p>
<div class="highlight-Python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="n">mod</span><span class="o">.</span><span class="n">get_global_vars</span><span class="p">())</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>(I.GlobalVar("add"), I.GlobalVar("add1"), I.GlobalVar("main"), I.GlobalVar("matmul"), I.GlobalVar("matmul1"), I.GlobalVar("relu"), I.GlobalVar("transpose"), I.GlobalVar("transpose1"))
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>(Module.add, Module.add1, Module.main, Module.matmul, Module.matmul1, Module.relu, Module.transpose, Module.transpose1)
</pre></div>
</div>
<p>Next, Apache TVM provides a set of default transformation pipelines for users,
@@ -1053,92 +1093,118 @@ IRModule inputs. This design can help users to construct their own pipeline.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@Ts.prim_func(private=True)
def fused_matmul1_add1(lv3: T.Buffer((T.int64(1), T.int64(256)), "float32"), lv4: T.Buffer((T.int64(256), T.int64(10)), "float32"), p_fc2_bias: T.Buffer((T.int64(10),), "float32"), T_add_intermediate: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(10)))
- for i0, i1, k in T.grid(T.int64(1), T.int64(10), T.int64(256)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
- for ax0, ax1 in T.grid(T.int64(1), T.int64(10)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(10)), "float32")
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(10)):
+ for k in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(10), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(256), k, dtype="int64")
+ Ts.reads(lv3[v_i0, v_k], lv4[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + lv3[v_i0, v_k] * lv4[v_k, v_i1]
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = p_fc2_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
@Ts.prim_func(private=True)
def fused_matmul_add_relu(x: T.Buffer((T.int64(1), T.int64(784)), "float32"), lv: T.Buffer((T.int64(784), T.int64(256)), "float32"), p_fc1_bias: T.Buffer((T.int64(256),), "float32"), compute_intermediate: T.Buffer((T.int64(1), T.int64(256)), "float32")):
T.func_attr({"tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)))
- T_add_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)))
- for i0, i1, k in T.grid(T.int64(1), T.int64(256), T.int64(784)):
- with Ts.sblock("matmul"):
- v_i0, v_i1, v_k = Ts.axis.remap("SSR", [i0, i1, k])
- Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
- Ts.writes(matmul_intermediate[v_i0, v_i1])
- with Ts.init():
- matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
- matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
- for ax0, ax1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("T_add"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
- Ts.writes(T_add_intermediate[v_ax0, v_ax1])
- T_add_intermediate[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
- for i0, i1 in T.grid(T.int64(1), T.int64(256)):
- with Ts.sblock("compute"):
- v_i0, v_i1 = Ts.axis.remap("SS", [i0, i1])
- Ts.reads(T_add_intermediate[v_i0, v_i1])
- Ts.writes(compute_intermediate[v_i0, v_i1])
- compute_intermediate[v_i0, v_i1] = T.max(T_add_intermediate[v_i0, v_i1], T.float32(0.0))
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32")
+ T_add_intermediate = Ts.sblock_alloc_buffer((T.int64(1), T.int64(256)), "float32")
+ for i0 in range(T.int64(0), T.int64(1)):
+ for i1 in range(T.int64(0), T.int64(256)):
+ for k in range(T.int64(0), T.int64(784)):
+ with Ts.sblock("matmul"):
+ v_i0 = Ts.axis.spatial(T.int64(1), i0, dtype="int64")
+ v_i1 = Ts.axis.spatial(T.int64(256), i1, dtype="int64")
+ v_k = Ts.axis.reduce(T.int64(784), k, dtype="int64")
+ Ts.reads(x[v_i0, v_k], lv[v_k, v_i1])
+ Ts.writes(matmul_intermediate[v_i0, v_i1])
+ with Ts.init():
+ matmul_intermediate[v_i0, v_i1] = T.float32(0.0)
+ matmul_intermediate[v_i0, v_i1] = matmul_intermediate[v_i0, v_i1] + x[v_i0, v_k] * lv[v_k, v_i1]
+ for ax0 in range(T.int64(0), T.int64(1)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_add"):
+ v_ax0 = Ts.axis.spatial(T.int64(1), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_bias[v_ax1], matmul_intermediate[v_ax0, v_ax1])
+ Ts.writes(T_add_intermediate[v_ax0, v_ax1])
+ T_add_intermediate[v_ax0, v_ax1] = p_fc1_bias[v_ax1] + matmul_intermediate[v_ax0, v_ax1]
+ for i0_1 in range(T.int64(0), T.int64(1)):
+ for i1_1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("compute"):
+ v_i0_1 = Ts.axis.spatial(T.int64(1), i0_1, dtype="int64")
+ v_i1_1 = Ts.axis.spatial(T.int64(256), i1_1, dtype="int64")
+ Ts.reads(T_add_intermediate[v_i0_1, v_i1_1])
+ Ts.writes(compute_intermediate[v_i0_1, v_i1_1])
+ compute_intermediate[v_i0_1, v_i1_1] = T.max(T_add_intermediate[v_i0_1, v_i1_1], T.float32(0.0))
@Ts.prim_func(private=True)
def transpose(p_fc1_weight: T.Buffer((T.int64(256), T.int64(784)), "float32"), T_transpose: T.Buffer((T.int64(784), T.int64(256)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(784), T.int64(256)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc1_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(784)):
+ for ax1 in range(T.int64(0), T.int64(256)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(784), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(256), ax1, dtype="int64")
+ Ts.reads(p_fc1_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc1_weight[v_ax1, v_ax0]
@Ts.prim_func(private=True)
def transpose1(p_fc2_weight: T.Buffer((T.int64(10), T.int64(256)), "float32"), T_transpose: T.Buffer((T.int64(256), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0, ax1 in T.grid(T.int64(256), T.int64(10)):
- with Ts.sblock("T_transpose"):
- v_ax0, v_ax1 = Ts.axis.remap("SS", [ax0, ax1])
- Ts.reads(p_fc2_weight[v_ax1, v_ax0])
- Ts.writes(T_transpose[v_ax0, v_ax1])
- T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0 in range(T.int64(0), T.int64(256)):
+ for ax1 in range(T.int64(0), T.int64(10)):
+ with Ts.sblock("T_transpose"):
+ v_ax0 = Ts.axis.spatial(T.int64(256), ax0, dtype="int64")
+ v_ax1 = Ts.axis.spatial(T.int64(10), ax1, dtype="int64")
+ Ts.reads(p_fc2_weight[v_ax1, v_ax0])
+ Ts.writes(T_transpose[v_ax0, v_ax1])
+ T_transpose[v_ax0, v_ax1] = p_fc2_weight[v_ax1, v_ax0]
@R.function
def main(x: R.Tensor((1, 784), dtype="float32"), p_fc1_weight: R.Tensor((256, 784), dtype="float32"), p_fc1_bias: R.Tensor((256,), dtype="float32"), p_fc2_weight: R.Tensor((10, 256), dtype="float32"), p_fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
- lv = R.call_tir(cls.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
- lv_1 = R.call_tir(cls.fused_matmul_add_relu, (x, lv, p_fc1_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
- lv4 = R.call_tir(cls.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
- gv = R.call_tir(cls.fused_matmul1_add1, (lv_1, lv4, p_fc2_bias), out_ty=R.Tensor((1, 10), dtype="float32"))
+ lv = R.call_tir(Module.transpose, (p_fc1_weight,), out_ty=R.Tensor((784, 256), dtype="float32"))
+ lv_1 = R.call_tir(Module.fused_matmul_add_relu, (x, lv, p_fc1_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
+ lv4 = R.call_tir(Module.transpose1, (p_fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
+ gv = R.call_tir(Module.fused_matmul1_add1, (lv_1, lv4, p_fc2_bias), out_ty=R.Tensor((1, 10), dtype="float32"))
R.output(gv)
return gv
</pre></div>
@@ -1163,8 +1229,8 @@ backends.</p>
<span class="nb">print</span><span class="p">(</span><span class="n">cpu_out</span><span class="p">)</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[-0.07639622 0.09393998 0.15279326 0.0067593 0.0712965 0.11450908
- -0.0593667 0.1031519 -0.02436247 0.06724901]]
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[ 0.02156833 0.1480602 -0.18894392 -0.12359875 -0.15182018 -0.0406852
+ 0.03429064 0.21808206 -0.1431902 -0.09069045]]
</pre></div>
</div>
</section>
@@ -1198,8 +1264,8 @@ the details of <code class="docutils literal notranslate"><span class="pre">DLig
<span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">allclose</span><span class="p">(</span><span class="n">cpu_out</span><span class="p">,</span> <span class="n">gpu_out</span><span class="p">,</span> <span class="n">atol</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[-0.07639617 0.09394001 0.15279323 0.00675932 0.07129654 0.11450911
- -0.05936672 0.10315201 -0.02436246 0.06724904]]
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[ 0.0215683 0.14806023 -0.18894392 -0.12359875 -0.15182015 -0.04068519
+ 0.03429066 0.21808198 -0.14319019 -0.09069046]]
</pre></div>
</div>
</section>
diff --git a/docs/get_started/tutorials/quick_start.html b/docs/get_started/tutorials/quick_start.html
index c94457535b0..533a065516b 100644
--- a/docs/get_started/tutorials/quick_start.html
+++ b/docs/get_started/tutorials/quick_start.html
@@ -740,7 +740,9 @@ in TVM.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
@I.ir_module
@@ -802,8 +804,8 @@ different devices.</p>
<span class="nb">print</span><span class="p">(</span><span class="n">vm</span><span class="p">[</span><span class="s2">"forward"</span><span class="p">](</span><span class="n">tvm_data</span><span class="p">,</span> <span class="o">*</span><a href="https://docs.python.org/3/builtins/stdtypes.html#list" title="builtins.list" class="sphx-glr-backref-module-builtins sphx-glr-backref-type-py-class sphx-glr-backref-instance"><span class="n">params</span></a><span class="p">)</span>< [...]
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[26971.541 24163.498 26412.727 24472.064 25188.469 26570.77 24381.45
- 25214.668 25924.244 25916.143]]
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[24394.262 23714.424 25465.494 23587.584 25657.525 23834.256 24638.521
+ 25145.371 26069.785 23032.725]]
</pre></div>
</div>
<p>Our goal is to bring machine learning to the application with any language of interest,
diff --git a/docs/get_started/tutorials/sg_execution_times.html b/docs/get_started/tutorials/sg_execution_times.html
index 693ad2f5769..64804f6af73 100644
--- a/docs/get_started/tutorials/sg_execution_times.html
+++ b/docs/get_started/tutorials/sg_execution_times.html
@@ -634,7 +634,7 @@ document.write(`
<section id="computation-times">
<span id="sphx-glr-get-started-tutorials-sg-execution-times"></span><h1>Computation times<a class="headerlink" href="#computation-times" title="Link to this heading">#</a></h1>
-<p><strong>00:06.380</strong> total execution time for 2 files <strong>from get_started/tutorials</strong>:</p>
+<p><strong>00:05.454</strong> total execution time for 2 files <strong>from get_started/tutorials</strong>:</p>
<div class="docutils container">
<style scoped>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet" />
@@ -656,11 +656,11 @@ $(document).ready( function () {
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference internal" href="ir_module.html#sphx-glr-get-started-tutorials-ir-module-py"><span class="std std-ref">IRModule</span></a> (<code class="docutils literal notranslate"><span class="pre">ir_module.py</span></code>)</p></td>
-<td><p>00:06.191</p></td>
+<td><p>00:05.293</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="quick_start.html#sphx-glr-get-started-tutorials-quick-start-py"><span class="std std-ref">Quick Start</span></a> (<code class="docutils literal notranslate"><span class="pre">quick_start.py</span></code>)</p></td>
-<td><p>00:00.189</p></td>
+<td><p>00:00.161</p></td>
<td><p>0.0</p></td>
</tr>
</tbody>
diff --git a/docs/how_to/tutorials/bring_your_own_codegen.html b/docs/how_to/tutorials/bring_your_own_codegen.html
index 2ea59f898af..d498a5ed202 100644
--- a/docs/how_to/tutorials/bring_your_own_codegen.html
+++ b/docs/how_to/tutorials/bring_your_own_codegen.html
@@ -775,6 +775,8 @@ printed module.</p>
</pre></div>
</div>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>After partitioning for the example NPU:
+from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -788,7 +790,7 @@ class Module:
@R.function
def local_func(data_1: R.Tensor((1, 3, 32, 32), dtype="float32"), weight_1: R.Tensor((16, 3, 3, 3), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
R.func_attr({"Composite": "example_npu.conv2d_relu_fused"})
- conv: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, weight_1, strides=[1, 1], padding=[0, 0, 0, 0], dilation=[1, 1], groups=1, data_layout="NCHW", kernel_layout="OIHW", out_layout="NCHW", out_dtype=None)
+ conv: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, weight_1, data_layout="NCHW", dilation=[1, 1], groups=1, kernel_layout="OIHW", out_dtype=None, out_layout="NCHW", padding=[0, 0, 0, 0], strides=[1, 1])
gv: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.relu(conv)
return gv
@@ -797,9 +799,8 @@ class Module:
@R.function
def main(data: R.Tensor((1, 3, 32, 32), dtype="float32"), weight: R.Tensor((16, 3, 3, 3), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
- cls = Module
with R.dataflow():
- gv: R.Tensor((1, 16, 30, 30), dtype="float32") = cls.fused_relax_nn_conv2d_relax_nn_relu_example_npu_example_npu(data, weight)
+ gv: R.Tensor((1, 16, 30, 30), dtype="float32") = Module.fused_relax_nn_conv2d_relax_nn_relu_example_npu_example_npu(data, weight)
R.output(gv)
return gv
</pre></div>
@@ -859,6 +860,8 @@ available. In CPU-only documentation builds, they produce no output.</p>
</pre></div>
</div>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>After partition_for_tensorrt:
+from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -873,7 +876,7 @@ class Module:
def gv(data_1: R.Tensor((1, 3, 32, 32), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
R.func_attr({"Composite": "tensorrt.nn.conv2d"})
with R.dataflow():
- gv_1: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, metadata["ir.GenericConst"][0], strides=[1, 1], padding=[0, 0, 0, 0], dilation=[1, 1], groups=1, data_layout="NCHW", kernel_layout="OIHW", out_layout="NCHW", out_dtype=None)
+ gv_1: R.Tensor((1, 16, 30, 30), dtype="float32") = R.nn.conv2d(data_1, metadata["ir.GenericConst"][0], data_layout="NCHW", dilation=[1, 1], groups=1, kernel_layout="OIHW", out_dtype=None, out_layout="NCHW", padding=[0, 0, 0, 0], strides=[1, 1])
R.output(gv_1)
return gv_1
@@ -893,9 +896,8 @@ class Module:
@R.function
def main(data: R.Tensor((1, 3, 32, 32), dtype="float32")) -> R.Tensor((1, 16, 30, 30), dtype="float32"):
- cls = Module
with R.dataflow():
- gv: R.Tensor((1, 16, 30, 30), dtype="float32") = cls.fused_relax_nn_conv2d_relax_nn_relu_tensorrt(data)
+ gv: R.Tensor((1, 16, 30, 30), dtype="float32") = Module.fused_relax_nn_conv2d_relax_nn_relu_tensorrt(data)
R.output(gv)
return gv
diff --git a/docs/how_to/tutorials/cross_compilation_and_rpc.html b/docs/how_to/tutorials/cross_compilation_and_rpc.html
index dc204c30664..9e2f20adf61 100644
--- a/docs/how_to/tutorials/cross_compilation_and_rpc.html
+++ b/docs/how_to/tutorials/cross_compilation_and_rpc.html
@@ -833,7 +833,7 @@ device and returns the measured cost. Network overhead is excluded.</p>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">cost</span><span class="si">:</span><span class="s2">g</span><span class="si">}</span><span class="s2"> secs/op"</span><span class="p">)</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>1.061e-07 secs/op
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>9e-08 secs/op
</pre></div>
</div>
</section>
@@ -1362,8 +1362,8 @@ for ONNX models. Simply replace <code class="docutils literal notranslate"><span
Converted PyTorch model to Relax:
- Number of parameters: 4
Using local target for demonstration
-Exported library to: /tmp/tmpi03brddb/model_deployed.so
-Saved parameters to: /tmp/tmpi03brddb/model_params.npz
+Exported library to: /tmp/tmpoxnl6xyi/model_deployed.so
+Saved parameters to: /tmp/tmpoxnl6xyi/model_params.npz
RPC workflow (works for any remote device):
==================================================
diff --git a/docs/how_to/tutorials/customize_opt.html b/docs/how_to/tutorials/customize_opt.html
index 657a4b2b55d..aac3636b0fa 100644
--- a/docs/how_to/tutorials/customize_opt.html
+++ b/docs/how_to/tutorials/customize_opt.html
@@ -726,7 +726,9 @@ with NN module frontend or TVMScript. Here we use a simple neural network model
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
@I.ir_module
@@ -794,7 +796,9 @@ patterns and dispatch them to different kernels.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
@I.ir_module
@@ -875,11 +879,12 @@ it achieves a balance between performance and compilation time.</p>
<span class="n">mod</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
-# from tvm.script import tirx as T
-# from tvm.tirx.layout import Axis
-# from tvm.script import s_tir as Ts
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
+# from tvm.script import s_tir as Ts
+# from tvm.script import tirx as T
@I.ir_module
class Module:
@@ -887,57 +892,62 @@ class Module:
@Ts.prim_func(private=True)
def matmul(lv: T.Buffer((T.int64(1), T.int64(256)), "float32"), permute_dims1: T.Buffer((T.int64(256), T.int64(10)), "float32"), matmul: T.Buffer((T.int64(1), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 4, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- matmul_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(10)), scope="local")
- for ax0_fused_0 in T.thread_binding(T.int64(1), thread="blockIdx.x"):
- for ax0_fused_1 in T.thread_binding(T.int64(10), thread="threadIdx.x"):
- for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul_rf_init"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1)
- Ts.reads()
- Ts.writes(matmul_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
- for ax1_fused_0, u in T.grid(T.int64(16), 1):
- with Ts.sblock("matmul_rf_update"):
- vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1)
- v0 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1)
- vax1_fused_0 = Ts.axis.reduce(T.int64(16), ax1_fused_0)
- Ts.reads(matmul_rf_local[vax1_fused_1, T.int64(0), v0], lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0])
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ matmul_rf_local = Ts.sblock_alloc_buffer((T.int64(16), T.int64(1), T.int64(10)), "float32", scope="local")
+ for ax0_fused_0 in T.thread_binding(T.int64(1), thread="blockIdx.x"):
+ for ax0_fused_1 in T.thread_binding(T.int64(10), thread="threadIdx.x"):
+ for ax1_fused_1 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul_rf_init"):
+ vax1_fused_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1, dtype="int64")
+ Ts.reads()
Ts.writes(matmul_rf_local[vax1_fused_1, T.int64(0), v0])
- matmul_rf_local[vax1_fused_1, T.int64(0), v0] = matmul_rf_local[vax1_fused_1, T.int64(0), v0] + lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1, v0]
- for ax1_fused in T.thread_binding(T.int64(10), thread="threadIdx.x"):
- for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
- with Ts.sblock("matmul"):
- vax1_fused_1, v0 = Ts.axis.remap("RS", [ax0, ax1_fused])
- Ts.reads(matmul_rf_local[vax1_fused_1, T.int64(0), v0])
- Ts.writes(matmul[T.int64(0), v0])
- with Ts.init():
- matmul[T.int64(0), v0] = T.float32(0.0)
- matmul[T.int64(0), v0] = matmul[T.int64(0), v0] + matmul_rf_local[vax1_fused_1, T.int64(0), v0]
+ matmul_rf_local[vax1_fused_1, T.int64(0), v0] = T.float32(0.0)
+ for ax1_fused_0 in range(T.int64(0), T.int64(16)):
+ for u in range(1):
+ with Ts.sblock("matmul_rf_update"):
+ vax1_fused_1_1 = Ts.axis.spatial(T.int64(16), ax1_fused_1, dtype="int64")
+ v0_1 = Ts.axis.spatial(T.int64(10), ax0_fused_0 * T.int64(10) + ax0_fused_1, dtype="int64")
+ vax1_fused_0 = Ts.axis.reduce(T.int64(16), ax1_fused_0, dtype="int64")
+ Ts.reads(matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1], lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1], permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1])
+ Ts.writes(matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1])
+ matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1] = matmul_rf_local[vax1_fused_1_1, T.int64(0), v0_1] + lv[T.int64(0), vax1_fused_0 * T.int64(16) + vax1_fused_1_1] * permute_dims1[vax1_fused_0 * T.int64(16) + vax1_fused_1_1, v0_1]
+ for ax1_fused in T.thread_binding(T.int64(10), thread="threadIdx.x"):
+ for ax0 in T.thread_binding(T.int64(16), thread="threadIdx.y"):
+ with Ts.sblock("matmul"):
+ vax1_fused_1_2 = Ts.axis.reduce(T.int64(16), ax0, dtype="int64")
+ v0_2 = Ts.axis.spatial(T.int64(10), ax1_fused, dtype="int64")
+ Ts.reads(matmul_rf_local[vax1_fused_1_2, T.int64(0), v0_2])
+ Ts.writes(matmul[T.int64(0), v0_2])
+ with Ts.init():
+ matmul[T.int64(0), v0_2] = T.float32(0.0)
+ matmul[T.int64(0), v0_2] = matmul[T.int64(0), v0_2] + matmul_rf_local[vax1_fused_1_2, T.int64(0), v0_2]
@Ts.prim_func(private=True)
def transpose(fc2_weight: T.Buffer((T.int64(10), T.int64(256)), "float32"), T_transpose: T.Buffer((T.int64(256), T.int64(10)), "float32")):
T.func_attr({"op_pattern": 2, "tirx.is_scheduled": True, "tirx.noalias": True})
- # with Ts.sblock("root"):
- for ax0_ax1_fused_0 in T.thread_binding(T.int64(3), thread="blockIdx.x"):
- for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
- with Ts.sblock("T_transpose"):
- v0 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(10))
- v1 = Ts.axis.spatial(T.int64(10), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(10))
- Ts.where(ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1 < T.int64(2560))
- Ts.reads(fc2_weight[v1, v0])
- Ts.writes(T_transpose[v0, v1])
- T_transpose[v0, v1] = fc2_weight[v1, v0]
+ with Ts.sblock("root"):
+ Ts.reads()
+ Ts.writes()
+ for ax0_ax1_fused_0 in T.thread_binding(T.int64(3), thread="blockIdx.x"):
+ for ax0_ax1_fused_1 in T.thread_binding(T.int64(1024), thread="threadIdx.x"):
+ with Ts.sblock("T_transpose"):
+ v0 = Ts.axis.spatial(T.int64(256), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) // T.int64(10), dtype="int64")
+ v1 = Ts.axis.spatial(T.int64(10), (ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1) % T.int64(10), dtype="int64")
+ Ts.where(ax0_ax1_fused_0 * T.int64(1024) + ax0_ax1_fused_1 < T.int64(2560))
+ Ts.reads(fc2_weight[v1, v0])
+ Ts.writes(T_transpose[v0, v1])
+ T_transpose[v0, v1] = fc2_weight[v1, v0]
@R.function
def forward(x: R.Tensor((1, 784), dtype="float32"), fc1_weight: R.Tensor((256, 784), dtype="float32"), fc1_bias: R.Tensor((256,), dtype="float32"), fc2_weight: R.Tensor((10, 256), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
- cls = Module
with R.dataflow():
lv = R.call_dps_packed("fused_relax_permute_dims_relax_matmul_relax_add_relax_nn_relu_cublas", (fc1_weight, x, fc1_bias), out_ty=R.Tensor((1, 256), dtype="float32"))
- permute_dims1 = R.call_tir(cls.transpose, (fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
- gv = R.call_tir(cls.matmul, (lv, permute_dims1), out_ty=R.Tensor((1, 10), dtype="float32"))
+ permute_dims1 = R.call_tir(Module.transpose, (fc2_weight,), out_ty=R.Tensor((256, 10), dtype="float32"))
+ gv = R.call_tir(Module.matmul, (lv, permute_dims1), out_ty=R.Tensor((1, 10), dtype="float32"))
R.output(gv)
return gv
diff --git a/docs/how_to/tutorials/e2e_opt_model.html b/docs/how_to/tutorials/e2e_opt_model.html
index 212f81ac540..e537d7a0d92 100644
--- a/docs/how_to/tutorials/e2e_opt_model.html
+++ b/docs/how_to/tutorials/e2e_opt_model.html
@@ -674,8 +674,8 @@ PyTorch.</p>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>Downloading: "https://download.pytorch.org/models/resnet18-f37072fd.pth" to /workspace/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth
0%| | 0.00/44.7M [00:00<?, ?B/s]
- 51%|█████ | 22.9M/44.7M [00:00<00:00, 240MB/s]
-100%|██████████| 44.7M/44.7M [00:00<00:00, 262MB/s]
+ 76%|███████▋ | 34.1M/44.7M [00:00<00:00, 358MB/s]
+100%|██████████| 44.7M/44.7M [00:00<00:00, 379MB/s]
</pre></div>
</div>
</section>
diff --git a/docs/how_to/tutorials/import_model.html b/docs/how_to/tutorials/import_model.html
index 8dd5f80fbb5..7a9e72b1c3b 100644
--- a/docs/how_to/tutorials/import_model.html
+++ b/docs/how_to/tutorials/import_model.html
@@ -756,6 +756,8 @@ needed — we only care about the graph structure.</p>
</div>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>/opt/uv/python/cpython-3.10-linux-x86_64-gnu/lib/python3.10/copyreg.py:101: FutureWarning: `isinstance(treespec, LeafSpec)` is deprecated, use `isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
return cls.__new__(cls, *args)
+from __future__ import annotations
+
# from tvm.script import ir as I
# from tvm.script import relax as R
@@ -765,10 +767,10 @@ class Module:
def main(x: R.Tensor((1, 3, 32, 32), dtype="float32"), p_conv_weight: R.Tensor((16, 3, 3, 3), dtype="float32"), p_conv_bias: R.Tensor((16,), dtype="float32"), p_bn_weight: R.Tensor((16,), dtype="float32"), p_bn_bias: R.Tensor((16,), dtype="float32"), p_fc_weight: R.Tensor((10, 16), dtype="float32"), p_fc_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):
R.func_attr({"num_input": 1})
with R.dataflow():
- lv: R.Tensor((1, 16, 32, 32), dtype="float32") = R.nn.conv2d(x, p_conv_weight, strides=[1, 1], padding=[1, 1, 1, 1], dilation=[1, 1], groups=1, data_layout="NCHW", kernel_layout="OIHW", out_layout="NCHW", out_dtype="float32")
+ lv: R.Tensor((1, 16, 32, 32), dtype="float32") = R.nn.conv2d(x, p_conv_weight, data_layout="NCHW", dilation=[1, 1], groups=1, kernel_layout="OIHW", out_dtype="float32", out_layout="NCHW", padding=[1, 1, 1, 1], strides=[1, 1])
lv1: R.Tensor((1, 16, 1, 1), dtype="float32") = R.reshape(p_conv_bias, R.shape([1, 16, 1, 1]))
lv2: R.Tensor((1, 16, 32, 32), dtype="float32") = R.add(lv, lv1)
- lv3: R.Tuple(R.Tensor((1, 16, 32, 32), dtype="float32"), R.Tensor((16,), dtype="float32"), R.Tensor((16,), dtype="float32")) = R.nn.batch_norm(lv2, p_bn_weight, p_bn_bias, metadata["ir.GenericConst"][0], metadata["ir.GenericConst"][1], axis=1, epsilon=1.0000000000000001e-05, center=True, scale=True, momentum=0.10000000000000001, training=False)
+ lv3: R.Tuple(R.Tensor((1, 16, 32, 32), dtype="float32"), R.Tensor((16,), dtype="float32"), R.Tensor((16,), dtype="float32")) = R.nn.batch_norm(lv2, p_bn_weight, p_bn_bias, metadata["ir.GenericConst"][0], metadata["ir.GenericConst"][1], axis=1, center=True, epsilon=1.0000000000000001e-05, momentum=0.10000000000000001, scale=True, training=False)
lv4: R.Tensor((1, 16, 32, 32), dtype="float32") = lv3[0]
lv5: R.Tensor((1, 16, 32, 32), dtype="float32") = R.nn.relu(lv4)
lv6: R.Tensor((1, 16, 1, 1), dtype="float32") = R.mean(lv5, axis=[-1, -2], keepdims=True)
@@ -1008,7 +1010,9 @@ Older versions use <code class="docutils literal notranslate"><span class="pre">
<span class="n">mod_tflite</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import ir as I
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>from __future__ import annotations
+
+# from tvm.script import ir as I
# from tvm.script import relax as R
@I.ir_module
diff --git a/docs/how_to/tutorials/optimize_llm.html b/docs/how_to/tutorials/optimize_llm.html
index 13356bc987d..8f4f67c8d08 100644
--- a/docs/how_to/tutorials/optimize_llm.html
+++ b/docs/how_to/tutorials/optimize_llm.html
@@ -987,11 +987,10 @@ For demonstration, we only show the part of the model architecture. and paramete
<a href="https://docs.python.org/3/library/pprint.html#pprint.pprint" title="pprint.pprint" class="sphx-glr-backref-module-pprint sphx-glr-backref-type-py-function"><span class="n">pprint</span></a><span class="p">(</span><a href="https://docs.python.org/3/builtins/stdtypes.html#list" title="builtins.list" class="sphx-glr-backref-module-builtins sphx-glr-backref-type-py-class sphx-glr-backref-instance"><span class="n">named_params</span></a><span class="p">[:</span><span class="mi">5</sp [...]
</pre></div>
</div>
-<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import relax as R
+<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span># from tvm.script import tirx as T
-seq_len = I.dynamic("seq_len", dtype="int64")
@R.function
-def prefill(input_embed: R.Tensor((1, seq_len, 2048), dtype="float16"), paged_kv_cache: R.Any, packed_params: R.Tuple(R.Tensor((32000, 2048), dtype="float16"), R.Tensor((2560, 2048), dtype="float16"), R.Tensor((2048, 2048), dtype="float16"), R.Tensor((11264, 2048), dtype="float16"), R.Tensor((2048, 5632), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2560, [...]
+def prefill[seq_len](input_embed: R.Tensor((1, seq_len, 2048), dtype="float16"), paged_kv_cache: R.Any, packed_params: R.Tuple(R.Tensor((32000, 2048), dtype="float16"), R.Tensor((2560, 2048), dtype="float16"), R.Tensor((2048, 2048), dtype="float16"), R.Tensor((11264, 2048), dtype="float16"), R.Tensor((2048, 5632), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tensor((2048,), dtype="float16"), R.Tens [...]
R.func_attr({"num_input": 2})
with R.dataflow():
model_embed_tokens_weight1: R.Tensor((32000, 2048), dtype="float16") = packed_params[0]
@@ -1004,6 +1003,7 @@ def prefill(input_embed: R.Tensor((1, seq_len, 2048), dtype="float16")
model_layers_1_self_attn_qkv_proj_weight1: R.Tensor((2560, 2048), dtype="float16") = packed_params[7]
model_layers_1_self_attn_o_proj_weight1: R.Tensor((2048, 2048), dtype="float16") = packed_params[8]
model_layers_1_mlp_gate_up_proj_weight1: R.Tensor((11264, 2048), dtype="float16") = packed_params[9]
+ model_layers_1_mlp_down_proj_weight1: R.Tensor((2048, 5632), dtype="float16") = packed_params[10]
...
Parameters:
diff --git a/docs/how_to/tutorials/sg_execution_times.html b/docs/how_to/tutorials/sg_execution_times.html
index 64f04bdd344..bb51c27610a 100644
--- a/docs/how_to/tutorials/sg_execution_times.html
+++ b/docs/how_to/tutorials/sg_execution_times.html
@@ -634,7 +634,7 @@ document.write(`
<section id="computation-times">
<span id="sphx-glr-how-to-tutorials-sg-execution-times"></span><h1>Computation times<a class="headerlink" href="#computation-times" title="Link to this heading">#</a></h1>
-<p><strong>00:16.258</strong> total execution time for 8 files <strong>from how_to/tutorials</strong>:</p>
+<p><strong>00:15.381</strong> total execution time for 8 files <strong>from how_to/tutorials</strong>:</p>
<div class="docutils container">
<style scoped>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet" />
@@ -656,31 +656,31 @@ $(document).ready( function () {
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference internal" href="optimize_llm.html#sphx-glr-how-to-tutorials-optimize-llm-py"><span class="std std-ref">Optimize Large Language Model</span></a> (<code class="docutils literal notranslate"><span class="pre">optimize_llm.py</span></code>)</p></td>
-<td><p>00:10.866</p></td>
+<td><p>00:10.625</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="import_model.html#sphx-glr-how-to-tutorials-import-model-py"><span class="std std-ref">Importing Models from ML Frameworks</span></a> (<code class="docutils literal notranslate"><span class="pre">import_model.py</span></code>)</p></td>
-<td><p>00:03.657</p></td>
+<td><p>00:03.278</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="e2e_opt_model.html#sphx-glr-how-to-tutorials-e2e-opt-model-py"><span class="std std-ref">End-to-End Optimize Model</span></a> (<code class="docutils literal notranslate"><span class="pre">e2e_opt_model.py</span></code>)</p></td>
-<td><p>00:00.778</p></td>
+<td><p>00:00.669</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="cross_compilation_and_rpc.html#sphx-glr-how-to-tutorials-cross-compilation-and-rpc-py"><span class="std std-ref">Cross Compilation and RPC</span></a> (<code class="docutils literal notranslate"><span class="pre">cross_compilation_and_rpc.py</span></code>)</p></td>
-<td><p>00:00.573</p></td>
+<td><p>00:00.474</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="customize_opt.html#sphx-glr-how-to-tutorials-customize-opt-py"><span class="std std-ref">Customize Optimization</span></a> (<code class="docutils literal notranslate"><span class="pre">customize_opt.py</span></code>)</p></td>
-<td><p>00:00.348</p></td>
+<td><p>00:00.293</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="bring_your_own_codegen.html#sphx-glr-how-to-tutorials-bring-your-own-codegen-py"><span class="std std-ref">Bring Your Own Codegen</span></a> (<code class="docutils literal notranslate"><span class="pre">bring_your_own_codegen.py</span></code>)</p></td>
-<td><p>00:00.029</p></td>
+<td><p>00:00.035</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="mix_python_and_tvm_with_pymodule.html#sphx-glr-how-to-tutorials-mix-python-and-tvm-with-pymodule-py"><span class="std std-ref">Mix Python/PyTorch with TVM Using BasePyModule</span></a> (<code class="docutils literal notranslate"><span class="pre">mix_python_and_tvm_with_pymodule.py</span></code>)</p></td>
-<td><p>00:00.005</p></td>
+<td><p>00:00.004</p></td>
<td><p>0.0</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="export_and_load_executable.html#sphx-glr-how-to-tutorials-export-and-load-executable-py"><span class="std std-ref">Export and Load Relax Executables</span></a> (<code class="docutils literal notranslate"><span class="pre">export_and_load_executable.py</span></code>)</p></td>
diff --git a/docs/objects.inv b/docs/objects.inv
index 562c401b375..5518a547aa7 100644
Binary files a/docs/objects.inv and b/docs/objects.inv differ
diff --git a/docs/reference/api/doxygen/annotated.html b/docs/reference/api/doxygen/annotated.html
index 0ed754efbd5..1017d8d3a27 100644
--- a/docs/reference/api/doxygen/annotated.html
+++ b/docs/reference/api/doxygen/annotated.html
@@ -581,34 +581,33 @@ $(function() {
<tr id="row_0_6_1_19_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1DocNode.html" target="_self">DocNode</a></td><td class="desc">The base class of all <a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> </td></tr>
<tr id="row_0_6_1_20_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1DocStringDoc.html" target="_self">DocStringDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1DocStringDocNode.html" title="Doc that represents docstring.">DocStringDocNode</a> </td></tr>
<tr id="row_0_6_1_21_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1DocStringDocNode.html" target="_self">DocStringDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents docstring </td></tr>
-<tr id="row_0_6_1_22_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprDoc.html" target="_self">ExprDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ExprDocNode.html" title="The base class of expression doc.">ExprDocNode</a> </td></tr>
-<tr id="row_0_6_1_23_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprDocNode.html" target="_self">ExprDocNode</a></td><td class="desc">The base class of expression doc </td></tr>
-<tr id="row_0_6_1_24_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStmtDoc.html" target="_self">ExprStmtDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStmtDocNode.html" title="Doc that represents an expression as statement.">ExprStmtDocNode</a> </td></tr>
-<tr id="row_0_6_1_25_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStmtDocNode.html" target="_self">ExprStmtDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents an expression as statement </td></tr>
-<tr id="row_0_6_1_26_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStringDoc.html" target="_self">ExprStringDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStringDocNode.html" title="Doc that renders an expression as a Python string literal.">ExprStringDocN [...]
-<tr id="row_0_6_1_27_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStringDocNode.html" target="_self">ExprStringDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that renders an expression as a Python string literal </td></tr>
-<tr id="row_0_6_1_28_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ForDoc.html" target="_self">ForDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ForDocNode.html" title="Doc that represents for statement.">ForDocNode</a> </td></tr>
-<tr id="row_0_6_1_29_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ForDocNode.html" target="_self">ForDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents for statement </td></tr>
-<tr id="row_0_6_1_30_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1Frame.html" target="_self">Frame</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1FrameNode.html">FrameNode</a> </td></tr>
-<tr id="row_0_6_1_31_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1FrameNode.html" target="_self">FrameNode</a></td><td class="desc"></td></tr>
-<tr id="row_0_6_1_32_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1FunctionDoc.html" target="_self">FunctionDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1FunctionDocNode.html" title="Doc that represents function definition.">FunctionDocNode</a> </td></tr>
-<tr id="row_0_6_1_33_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1FunctionDocNode.html" target="_self">FunctionDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents function definition </td></tr>
-<tr id="row_0_6_1_34_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IdDoc.html" target="_self">IdDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IdDocNode.html" title="Doc that represents identifier.">IdDocNode</a> </td></tr>
-<tr id="row_0_6_1_35_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IdDocNode.html" target="_self">IdDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents identifier </td></tr>
-<tr id="row_0_6_1_36_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IfDoc.html" target="_self">IfDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IfDocNode.html" title="Doc that represent if-then-else statement.">IfDocNode</a> </td></tr>
-<tr id="row_0_6_1_37_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IfDocNode.html" target="_self">IfDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represent if-then-else statement </td></tr>
-<tr id="row_0_6_1_38_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IndexDoc.html" target="_self">IndexDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IndexDocNode.html" title="Doc that represents index access on another expression.">IndexDocNode</a> </td></tr>
-<tr id="row_0_6_1_39_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IndexDocNode.html" target="_self">IndexDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents index access on another expression </td></tr>
-<tr id="row_0_6_1_40_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IRDocsifier.html" target="_self">IRDocsifier</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IRDocsifierNode.html" title="IRDocsifier is the top-level interface in the IR->Doc process.">IRDocsifierNo [...]
-<tr id="row_0_6_1_41_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IRDocsifierFunctor.html" target="_self">IRDocsifierFunctor</a></td><td class="desc">Dynamic dispatch functor based on AccessPath </td></tr>
-<tr id="row_0_6_1_42_" class="odd" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span id="arr_0_6_1_42_" class="arrow" onclick="toggleFolder('0_6_1_42_')">►</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IRDocsifierNode.html" target="_self">IRDocsifierNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1IRDocsifier.html" title="Refer [...]
-<tr id="row_0_6_1_42_0_" class="odd" style="display:none;"><td class="entry"><span style="width:80px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtvm_1_1script_1_1printer_1_1IRDocsifierNode_1_1VariableInfo.html" target="_self">VariableInfo</a></td><td class="desc">Information about a variable, including its optional name and its doc creator </td></tr>
-<tr id="row_0_6_1_43_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LambdaDoc.html" target="_self">LambdaDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1LambdaDocNode.html" title="Doc that represents anonymous function.">LambdaDocNode</a> </td></tr>
-<tr id="row_0_6_1_44_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LambdaDocNode.html" target="_self">LambdaDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents anonymous function </td></tr>
-<tr id="row_0_6_1_45_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ListDoc.html" target="_self">ListDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ListDocNode.html" title="Doc that represents list literal.">ListDocNode</a> </td></tr>
-<tr id="row_0_6_1_46_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ListDocNode.html" target="_self">ListDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents list literal </td></tr>
-<tr id="row_0_6_1_47_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LiteralDoc.html" target="_self">LiteralDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1LiteralDocNode.html" title="Doc that represents literal value.">LiteralDocNode</a> </td></tr>
-<tr id="row_0_6_1_48_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LiteralDocNode.html" target="_self">LiteralDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents literal value </td></tr>
+<tr id="row_0_6_1_22_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1DocTranslator.html" target="_self">DocTranslator</a></td><td class="desc">Owning reference to a hook translation context </td></tr>
+<tr id="row_0_6_1_23_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1DocTranslatorObj.html" target="_self">DocTranslatorObj</a></td><td class="desc">Eager translation context shared by registered hooks. Hooks construct Docs, use explicit lexical scopes, and attach origins when emitting </td></tr>
+<tr id="row_0_6_1_24_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtvm_1_1script_1_1printer_1_1DocTranslatorVTable.html" target="_self">DocTranslatorVTable</a></td><td class="desc">Engine callbacks borrowed for the translator's lifetime </td></tr>
+<tr id="row_0_6_1_25_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprDoc.html" target="_self">ExprDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ExprDocNode.html" title="The base class of expression doc.">ExprDocNode</a> </td></tr>
+<tr id="row_0_6_1_26_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprDocNode.html" target="_self">ExprDocNode</a></td><td class="desc">The base class of expression doc </td></tr>
+<tr id="row_0_6_1_27_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStmtDoc.html" target="_self">ExprStmtDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStmtDocNode.html" title="Doc that represents an expression as statement.">ExprStmtDocNode</a> </td></tr>
+<tr id="row_0_6_1_28_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStmtDocNode.html" target="_self">ExprStmtDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents an expression as statement </td></tr>
+<tr id="row_0_6_1_29_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStringDoc.html" target="_self">ExprStringDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStringDocNode.html" title="Doc that renders an expression as a Python string literal.">ExprStringDocN [...]
+<tr id="row_0_6_1_30_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ExprStringDocNode.html" target="_self">ExprStringDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that renders an expression as a Python string literal </td></tr>
+<tr id="row_0_6_1_31_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ForDoc.html" target="_self">ForDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ForDocNode.html" title="Doc that represents for statement.">ForDocNode</a> </td></tr>
+<tr id="row_0_6_1_32_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ForDocNode.html" target="_self">ForDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents for statement </td></tr>
+<tr id="row_0_6_1_33_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1FunctionDoc.html" target="_self">FunctionDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1FunctionDocNode.html" title="Doc that represents function definition.">FunctionDocNode</a> </td></tr>
+<tr id="row_0_6_1_34_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1FunctionDocNode.html" target="_self">FunctionDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents function definition </td></tr>
+<tr id="row_0_6_1_35_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IdDoc.html" target="_self">IdDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IdDocNode.html" title="Doc that represents identifier.">IdDocNode</a> </td></tr>
+<tr id="row_0_6_1_36_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IdDocNode.html" target="_self">IdDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents identifier </td></tr>
+<tr id="row_0_6_1_37_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IfDoc.html" target="_self">IfDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IfDocNode.html" title="Doc that represent if-then-else statement.">IfDocNode</a> </td></tr>
+<tr id="row_0_6_1_38_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IfDocNode.html" target="_self">IfDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represent if-then-else statement </td></tr>
+<tr id="row_0_6_1_39_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IndexDoc.html" target="_self">IndexDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1IndexDocNode.html" title="Doc that represents index access on another expression.">IndexDocNode</a> </td></tr>
+<tr id="row_0_6_1_40_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1IndexDocNode.html" target="_self">IndexDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents index access on another expression </td></tr>
+<tr id="row_0_6_1_41_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LambdaDoc.html" target="_self">LambdaDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1LambdaDocNode.html" title="Doc that represents anonymous function.">LambdaDocNode</a> </td></tr>
+<tr id="row_0_6_1_42_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LambdaDocNode.html" target="_self">LambdaDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents anonymous function </td></tr>
+<tr id="row_0_6_1_43_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ListDoc.html" target="_self">ListDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1ListDocNode.html" title="Doc that represents list literal.">ListDocNode</a> </td></tr>
+<tr id="row_0_6_1_44_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1ListDocNode.html" target="_self">ListDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents list literal </td></tr>
+<tr id="row_0_6_1_45_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LiteralDoc.html" target="_self">LiteralDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1LiteralDocNode.html" title="Doc that represents literal value.">LiteralDocNode</a> </td></tr>
+<tr id="row_0_6_1_46_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1LiteralDocNode.html" target="_self">LiteralDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents literal value </td></tr>
+<tr id="row_0_6_1_47_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1NamespaceDoc.html" target="_self">NamespaceDoc</a></td><td class="desc">An owning reference to a deferred script namespace </td></tr>
+<tr id="row_0_6_1_48_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1NamespaceDocNode.html" target="_self">NamespaceDocNode</a></td><td class="desc">A reference to a canonical script namespace </td></tr>
<tr id="row_0_6_1_49_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1OpCallDoc.html" target="_self">OpCallDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1OpCallDocNode.html" title="Doc that represents call to an TIRX operator.">OpCallDocNode</a> </td></tr>
<tr id="row_0_6_1_50_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1OpCallDocNode.html" target="_self">OpCallDocNode</a></td><td class="desc"><a class="el" href="classtvm_1_1script_1_1printer_1_1Doc.html" title="Reference type of DocNode.">Doc</a> that represents call to an TIRX operator </td></tr>
<tr id="row_0_6_1_51_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1script_1_1printer_1_1OperationDoc.html" target="_self">OperationDoc</a></td><td class="desc">Reference type of <a class="el" href="classtvm_1_1script_1_1printer_1_1OperationDocNode.html" title="Doc that represents operation.">OperationDocNode</a> </td></tr>
@@ -886,18 +885,17 @@ $(function() {
<tr id="row_0_105_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TupleNode.html" target="_self">TupleNode</a></td><td class="desc"><a class="el" href="classtvm_1_1Tuple.html" title="Managed reference to TupleNode.">Tuple</a> container </td></tr>
<tr id="row_0_106_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TupleType.html" target="_self">TupleType</a></td><td class="desc">Managed reference to <a class="el" href="classtvm_1_1TupleTypeNode.html" title="The type of tuple values.">TupleTypeNode</a> </td></tr>
<tr id="row_0_107_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TupleTypeNode.html" target="_self">TupleTypeNode</a></td><td class="desc">The type of tuple values </td></tr>
-<tr id="row_0_108_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TVMScriptPrinter.html" target="_self">TVMScriptPrinter</a></td><td class="desc">Dispatch table for TVMScript printing and repr registration </td></tr>
-<tr id="row_0_109_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1Type.html" target="_self">Type</a></td><td class="desc">Managed reference to <a class="el" href="classtvm_1_1TypeNode.html" title="Type is the base type of all types.">TypeNode</a> </td></tr>
-<tr id="row_0_110_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypedEnvFunc.html" target="_self">TypedEnvFunc</a></td><td class="desc">Please refer to <a class="el" href="classtvm_1_1TypedEnvFunc_3_01R_07Args_8_8_8_08_4.html#TypedEnvFuncAnchor">TypedEnvFunc<R(Args..)></a> </td></tr>
-<tr id="row_0_111_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypedEnvFunc_3_01R_07Args_8_8_8_08_4.html" target="_self">TypedEnvFunc< R(Args...)></a></td><td class="desc">A typed version of <a class="el" href="classtvm_1_1EnvFunc.html" title="Managed reference to EnvFuncNode.">EnvFunc</a>. It is backed by a GlobalFuncNode intern [...]
-<tr id="row_0_112_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypedExpr.html" target="_self">TypedExpr</a></td><td class="desc">Typed reference/view over an expression whose result type is a specific <a class="el" href="classtvm_1_1Type.html" title="Managed reference to TypeNode.">Type</a> subtype </td></tr>
-<tr id="row_0_113_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypeNode.html" target="_self">TypeNode</a></td><td class="desc"><a class="el" href="classtvm_1_1Type.html" title="Managed reference to TypeNode.">Type</a> is the base type of all types </td></tr>
-<tr id="row_0_114_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1UniqueNameSupply.html" target="_self">UniqueNameSupply</a></td><td class="desc">Managed reference class to <a class="el" href="classtvm_1_1UniqueNameSupplyNode.html" title="UniqueNameSupply can be used to generate unique names.">UniqueNameSupplyNode</a> </td></tr>
-<tr id="row_0_115_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1UniqueNameSupplyNode.html" target="_self">UniqueNameSupplyNode</a></td><td class="desc"><a class="el" href="classtvm_1_1UniqueNameSupply.html" title="Managed reference class to UniqueNameSupplyNode.">UniqueNameSupply</a> can be used to generate unique names </td></tr>
-<tr id="row_0_116_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1Var.html" target="_self">Var</a></td><td class="desc">Managed reference to <a class="el" href="classtvm_1_1VarNode.html" title="A local variable in the IR.">VarNode</a> </td></tr>
-<tr id="row_0_117_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1VarNode.html" target="_self">VarNode</a></td><td class="desc">A local variable in the IR </td></tr>
-<tr id="row_0_118_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1With.html" target="_self">With</a></td><td class="desc">RAII wrapper function to enter and exit a context object similar to python's with syntax </td></tr>
-<tr id="row_0_119_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1WithGroup.html" target="_self">WithGroup</a></td><td class="desc">A group of RAII contexts managed together </td></tr>
+<tr id="row_0_108_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1Type.html" target="_self">Type</a></td><td class="desc">Managed reference to <a class="el" href="classtvm_1_1TypeNode.html" title="Type is the base type of all types.">TypeNode</a> </td></tr>
+<tr id="row_0_109_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypedEnvFunc.html" target="_self">TypedEnvFunc</a></td><td class="desc">Please refer to <a class="el" href="classtvm_1_1TypedEnvFunc_3_01R_07Args_8_8_8_08_4.html#TypedEnvFuncAnchor">TypedEnvFunc<R(Args..)></a> </td></tr>
+<tr id="row_0_110_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypedEnvFunc_3_01R_07Args_8_8_8_08_4.html" target="_self">TypedEnvFunc< R(Args...)></a></td><td class="desc">A typed version of <a class="el" href="classtvm_1_1EnvFunc.html" title="Managed reference to EnvFuncNode.">EnvFunc</a>. It is backed by a GlobalFuncNode intern [...]
+<tr id="row_0_111_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypedExpr.html" target="_self">TypedExpr</a></td><td class="desc">Typed reference/view over an expression whose result type is a specific <a class="el" href="classtvm_1_1Type.html" title="Managed reference to TypeNode.">Type</a> subtype </td></tr>
+<tr id="row_0_112_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1TypeNode.html" target="_self">TypeNode</a></td><td class="desc"><a class="el" href="classtvm_1_1Type.html" title="Managed reference to TypeNode.">Type</a> is the base type of all types </td></tr>
+<tr id="row_0_113_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1UniqueNameSupply.html" target="_self">UniqueNameSupply</a></td><td class="desc">Managed reference class to <a class="el" href="classtvm_1_1UniqueNameSupplyNode.html" title="UniqueNameSupply can be used to generate unique names.">UniqueNameSupplyNode</a> </td></tr>
+<tr id="row_0_114_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1UniqueNameSupplyNode.html" target="_self">UniqueNameSupplyNode</a></td><td class="desc"><a class="el" href="classtvm_1_1UniqueNameSupply.html" title="Managed reference class to UniqueNameSupplyNode.">UniqueNameSupply</a> can be used to generate unique names </td></tr>
+<tr id="row_0_115_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1Var.html" target="_self">Var</a></td><td class="desc">Managed reference to <a class="el" href="classtvm_1_1VarNode.html" title="A local variable in the IR.">VarNode</a> </td></tr>
+<tr id="row_0_116_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1VarNode.html" target="_self">VarNode</a></td><td class="desc">A local variable in the IR </td></tr>
+<tr id="row_0_117_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1With.html" target="_self">With</a></td><td class="desc">RAII wrapper function to enter and exit a context object similar to python's with syntax </td></tr>
+<tr id="row_0_118_" class="odd" style="display:none;"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtvm_1_1WithGroup.html" target="_self">WithGroup</a></td><td class="desc">A group of RAII contexts managed together </td></tr>
<tr id="row_1_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structTVMParallelGroupEnv.html" target="_self">TVMParallelGroupEnv</a></td><td class="desc">Environment for TVM parallel task </td></tr>
</table>
</div><!-- directory -->
diff --git a/docs/reference/api/doxygen/base__expr_8h.html b/docs/reference/api/doxygen/base__expr_8h.html
index 8482384c632..e132bc61eaa 100644
--- a/docs/reference/api/doxygen/base__expr_8h.html
+++ b/docs/reference/api/doxygen/base__expr_8h.html
@@ -103,7 +103,7 @@ Include dependency graph for base_expr.h:</div>
</div><div class="textblock"><div class="dynheader">
This graph shows which files directly or indirectly include this file:</div>
<div class="dyncontent">
-<div class="center"><iframe scrolling="no" frameborder="0" src="base__expr_8h__dep__incl.svg" width="13542" height="1811"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
+<div class="center"><iframe scrolling="no" frameborder="0" src="base__expr_8h__dep__incl.svg" width="13584" height="1811"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
</div>
</div>
<p><a href="base__expr_8h_source.html">Go to the source code of this file.</a></p>
diff --git a/docs/reference/api/doxygen/base__expr_8h__dep__incl.svg b/docs/reference/api/doxygen/base__expr_8h__dep__incl.svg
index 4317f899bbc..7b390cf9b0f 100644
--- a/docs/reference/api/doxygen/base__expr_8h__dep__incl.svg
+++ b/docs/reference/api/doxygen/base__expr_8h__dep__incl.svg
@@ -4,17 +4,17 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: include/tvm/ir/base_expr.h Pages: 1 -->
-<svg width="10156pt" height="1358pt"
- viewBox="0.00 0.00 10156.00 1358.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<svg width="10188pt" height="1358pt"
+ viewBox="0.00 0.00 10188.23 1358.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1354)">
<title>include/tvm/ir/base_expr.h</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title="Base expression and primitive type nodes.">
-<polygon fill="#999999" stroke="#666666" points="7234,-1350 7124,-1350 7124,-1320 7234,-1320 7234,-1350"/>
-<text text-anchor="start" x="7132" y="-1338" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/base</text>
-<text text-anchor="middle" x="7179" y="-1327" font-family="Helvetica,sans-Serif" font-size="10.00">_expr.h</text>
+<polygon fill="#999999" stroke="#666666" points="6219.5,-1350 6109.5,-1350 6109.5,-1320 6219.5,-1320 6219.5,-1350"/>
+<text text-anchor="start" x="6117.5" y="-1338" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/base</text>
+<text text-anchor="middle" x="6164.5" y="-1327" font-family="Helvetica,sans-Serif" font-size="10.00">_expr.h</text>
</a>
</g>
</g>
@@ -22,8 +22,8 @@
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="ir_2expr_8h.html" target="_top" xlink:title="Base expr nodes in TVM.">
-<polygon fill="white" stroke="#666666" points="7488.5,-1284 7371.5,-1284 7371.5,-1265 7488.5,-1265 7488.5,-1284"/>
-<text text-anchor="middle" x="7430" y="-1272" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/expr.h</text>
+<polygon fill="white" stroke="#666666" points="6180,-1284 6063,-1284 6063,-1265 6180,-1265 6180,-1284"/>
+<text text-anchor="middle" x="6121.5" y="-1272" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/expr.h</text>
</a>
</g>
</g>
@@ -31,8 +31,8 @@
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1->Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7243.97,-1318.86C7291.47,-1307.79 7354.16,-1293.18 7393.28,-1284.06"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7243.03,-1315.48 7234.08,-1321.16 7244.62,-1322.3 7243.03,-1315.48"/>
+<path fill="none" stroke="#63b8ff" d="M6147.97,-1311.51C6140.97,-1301.99 6133.24,-1291.47 6127.94,-1284.27"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6145.35,-1313.85 6154.09,-1319.84 6150.99,-1309.71 6145.35,-1313.85"/>
</a>
</g>
</g>
@@ -40,8 +40,8 @@
<g id="Node000155" class="node">
<title>Node155</title>
<g id="a_Node000155"><a xlink:href="ir_2type_8h.html" target="_top" xlink:title="IR/AST nodes for TVM types shared across IR variants.">
-<polygon fill="white" stroke="#666666" points="6969,-1223.5 6851,-1223.5 6851,-1204.5 6969,-1204.5 6969,-1223.5"/>
-<text text-anchor="middle" x="6910" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/type.h</text>
+<polygon fill="white" stroke="#666666" points="6576.5,-1223.5 6458.5,-1223.5 6458.5,-1204.5 6576.5,-1204.5 6576.5,-1223.5"/>
+<text text-anchor="middle" x="6517.5" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/type.h</text>
</a>
</g>
</g>
@@ -49,8 +49,8 @@
<g id="edge445_Node000001_Node000155" class="edge">
<title>Node1->Node155</title>
<g id="a_edge445_Node000001_Node000155"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7137.98,-1315.85C7079.09,-1289.8 6972.91,-1242.83 6929.4,-1223.58"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7136.79,-1319.15 7147.35,-1320 7139.62,-1312.75 7136.79,-1319.15"/>
+<path fill="none" stroke="#63b8ff" d="M6215.97,-1316.65C6292.73,-1290.77 6434.36,-1243.03 6492.05,-1223.58"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6214.39,-1313.49 6206.03,-1320 6216.63,-1320.12 6214.39,-1313.49"/>
</a>
</g>
</g>
@@ -58,9 +58,9 @@
<g id="Node000003" class="node">
<title>Node3</title>
<g id="a_Node000003"><a xlink:href="ir_2expr__functor_8h.html" target="_top" xlink:title="Native visiting and mutation of core IR expressions.">
-<polygon fill="white" stroke="#666666" points="7324.5,-833 7215.5,-833 7215.5,-803 7324.5,-803 7324.5,-833"/>
-<text text-anchor="start" x="7223.5" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/expr</text>
-<text text-anchor="middle" x="7270" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
+<polygon fill="white" stroke="#666666" points="3016,-833 2907,-833 2907,-803 3016,-803 3016,-833"/>
+<text text-anchor="start" x="2915" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/expr</text>
+<text text-anchor="middle" x="2961.5" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
</a>
</g>
</g>
@@ -68,8 +68,8 @@
<g id="edge2_Node000002_Node000003" class="edge">
<title>Node2->Node3</title>
<g id="a_edge2_Node000002_Node000003"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7444.32,-1257.09C7450.75,-1249.05 7458,-1238.98 7463,-1229 7479.64,-1195.82 7487,-1186.12 7487,-1149 7487,-1149 7487,-1149 7487,-1081 7487,-1009.95 7426.96,-1015.52 7377,-965 7334.35,-921.88 7295.19,-860.79 7278.5,-833.34"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7441.52,-1254.98 7437.81,-1264.9 7446.9,-1259.46 7441.52,-1254.98"/>
+<path fill="none" stroke="#63b8ff" d="M6052.58,-1272.5C5603.83,-1265.77 3115.5,-1225.04 3115.5,-1149 3115.5,-1149 3115.5,-1149 3115.5,-949 3115.5,-889.52 3047.59,-851.71 3001.96,-833.02"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.75,-1276 6062.8,-1272.65 6052.86,-1269 6052.75,-1276"/>
</a>
</g>
</g>
@@ -77,18 +77,18 @@
<g id="Node000016" class="node">
<title>Node16</title>
<g id="a_Node000016"><a xlink:href="tune__context_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7157.5,-162 7016.5,-162 7016.5,-132 7157.5,-132 7157.5,-162"/>
-<text text-anchor="start" x="7024.5" y="-150" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="7087" y="-139" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/tune_context.h</text>
+<polygon fill="white" stroke="#666666" points="626,-162 485,-162 485,-132 626,-132 626,-162"/>
+<text text-anchor="start" x="493" y="-150" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="555.5" y="-139" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/tune_context.h</text>
</a>
</g>
</g>
<!-- Node2->Node16 -->
-<g id="edge408_Node000002_Node000016" class="edge">
+<g id="edge407_Node000002_Node000016" class="edge">
<title>Node2->Node16</title>
-<g id="a_edge408_Node000002_Node000016"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.72,-1273.11C7891.22,-1270.8 9836.06,-1257.92 9959,-1229 10039.5,-1210.07 10127,-1231.7 10127,-1149 10127,-1149 10127,-1149 10127,-278 10127,-261.35 10227.1,-263.14 9984,-198 9843.4,-160.32 7588.06,-149.9 7157.66,-148.25"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.63,-1269.61 7488.65,-1273.17 7498.67,-1276.61 7498.63,-1269.61"/>
+<g id="a_edge407_Node000002_Node000016"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.61,-1273.44C5541.04,-1272.88 2326.18,-1267.88 1352.5,-1229 1226.4,-1223.96 219.5,-1275.2 219.5,-1149 219.5,-1149 219.5,-1149 219.5,-883 219.5,-599.61 208.57,-495.17 372.5,-264 396.14,-230.67 402.76,-221.05 436.5,-198 459.08,-182.58 487.16,-170.5 510.38,-162.08"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.79,-1276.94 6062.79,-1273.45 6052.8,-1269.94 6052.79,-1276.94"/>
</a>
</g>
</g>
@@ -96,18 +96,18 @@
<g id="Node000017" class="node">
<title>Node17</title>
<g id="a_Node000017"><a xlink:href="database_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3619.5,-365.5 3492.5,-365.5 3492.5,-335.5 3619.5,-335.5 3619.5,-365.5"/>
-<text text-anchor="start" x="3500.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="3556" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/database.h</text>
+<polygon fill="white" stroke="#666666" points="634,-365.5 507,-365.5 507,-335.5 634,-335.5 634,-365.5"/>
+<text text-anchor="start" x="515" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="570.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/database.h</text>
</a>
</g>
</g>
<!-- Node2->Node17 -->
-<g id="edge405_Node000002_Node000017" class="edge">
+<g id="edge404_Node000002_Node000017" class="edge">
<title>Node2->Node17</title>
-<g id="a_edge405_Node000002_Node000017"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.29,-1273.31C6808.97,-1271.74 3084.79,-1260.08 1961,-1229 1772.53,-1223.79 266,-1337.54 266,-1149 266,-1149 266,-1149 266,-685 266,-563.95 324.3,-517.19 437,-473 552.71,-427.63 1430.78,-441.13 1555,-437 2411.92,-408.54 2634.93,-497.11 3483,-371 3491.69,-369.71 3500.84,-367.76 3509.6,-365.58"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.47,-1276.81 7371.48,-1273.34 7361.49,-1269.81 7361.47,-1276.81"/>
+<g id="a_edge404_Node000002_Node000017"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.47,-1273.4C5395.82,-1272.35 274.42,-1263.1 205.5,-1229 165.18,-1209.05 143.5,-1193.98 143.5,-1149 143.5,-1149 143.5,-1149 143.5,-883 143.5,-868.92 433.16,-484.35 441.5,-473 463.13,-443.56 464.26,-432.42 490.5,-407 507.26,-390.77 529.2,-375.91 545.86,-365.66"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.71,-1276.9 6062.71,-1273.41 6052.72,-1269.9 6052.71,-1276.9"/>
</a>
</g>
</g>
@@ -115,18 +115,18 @@
<g id="Node000025" class="node">
<title>Node25</title>
<g id="a_Node000025"><a xlink:href="schedule__rule_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="6605.5,-365.5 6460.5,-365.5 6460.5,-335.5 6605.5,-335.5 6605.5,-365.5"/>
-<text text-anchor="start" x="6468.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="6533" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/schedule_rule.h</text>
+<polygon fill="white" stroke="#666666" points="3103,-365.5 2958,-365.5 2958,-335.5 3103,-335.5 3103,-365.5"/>
+<text text-anchor="start" x="2966" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="3030.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/schedule_rule.h</text>
</a>
</g>
</g>
<!-- Node2->Node25 -->
-<g id="edge407_Node000002_Node000025" class="edge">
+<g id="edge406_Node000002_Node000025" class="edge">
<title>Node2->Node25</title>
-<g id="a_edge407_Node000002_Node000025"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.24,-1269.14C7279.11,-1263.07 7147.28,-1250.35 7103,-1229 7064.77,-1210.57 7055.41,-1199.64 7034,-1163 6904.94,-942.15 6961.62,-851.42 6893,-605 6875.9,-543.61 6875.81,-523.55 6837,-473 6810.76,-438.83 6803.99,-427.33 6766,-407 6765.75,-406.87 6660.96,-381.93 6592.02,-365.53"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.02,-1272.63 7371.24,-1269.86 7361.52,-1265.65 7361.02,-1272.63"/>
+<g id="a_edge406_Node000002_Node000025"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.59,-1268.4C5633.09,-1237.21 3438.84,-1072.3 3383.5,-1031 3346.72,-1003.56 3365.24,-976.43 3345.5,-935 3250.74,-736.13 3203.84,-698.6 3102.5,-503 3076.78,-453.35 3049.14,-392.96 3036.93,-365.86"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.51,-1271.9 6062.75,-1269.15 6053.03,-1264.92 6052.51,-1271.9"/>
</a>
</g>
</g>
@@ -134,8 +134,8 @@
<g id="Node000027" class="node">
<title>Node27</title>
<g id="a_Node000027"><a xlink:href="ir_2function_8h.html" target="_top" xlink:title="Function nodes.">
-<polygon fill="white" stroke="#666666" points="9390,-1223.5 9254,-1223.5 9254,-1204.5 9390,-1204.5 9390,-1223.5"/>
-<text text-anchor="middle" x="9322" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/function.h</text>
+<polygon fill="white" stroke="#666666" points="2756.5,-1223.5 2620.5,-1223.5 2620.5,-1204.5 2756.5,-1204.5 2756.5,-1223.5"/>
+<text text-anchor="middle" x="2688.5" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/function.h</text>
</a>
</g>
</g>
@@ -143,8 +143,8 @@
<g id="edge39_Node000002_Node000027" class="edge">
<title>Node2->Node27</title>
<g id="a_edge39_Node000002_Node000027"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.9,-1273.14C7786.55,-1271.43 8892.72,-1262.74 9240,-1229 9252.79,-1227.76 9266.6,-1225.69 9279.17,-1223.51"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.59,-1269.64 7488.61,-1273.2 7498.63,-1276.64 7498.59,-1269.64"/>
+<path fill="none" stroke="#63b8ff" d="M6052.4,-1273.36C5639.13,-1272.39 3490.28,-1265.64 2831.5,-1229 2807.09,-1227.64 2780.41,-1225.27 2756.78,-1222.86"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.68,-1276.86 6062.69,-1273.38 6052.7,-1269.86 6052.68,-1276.86"/>
</a>
</g>
</g>
@@ -152,17 +152,17 @@
<g id="Node000028" class="node">
<title>Node28</title>
<g id="a_Node000028"><a xlink:href="module_8h.html" target="_top" xlink:title="IRModule that holds the functions and type definitions.">
-<polygon fill="white" stroke="#666666" points="8573.5,-1157.5 8440.5,-1157.5 8440.5,-1138.5 8573.5,-1138.5 8573.5,-1157.5"/>
-<text text-anchor="middle" x="8507" y="-1145.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/module.h</text>
+<polygon fill="white" stroke="#666666" points="1994,-1157.5 1861,-1157.5 1861,-1138.5 1994,-1138.5 1994,-1157.5"/>
+<text text-anchor="middle" x="1927.5" y="-1145.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/module.h</text>
</a>
</g>
</g>
<!-- Node2->Node28 -->
-<g id="edge306_Node000002_Node000028" class="edge">
+<g id="edge305_Node000002_Node000028" class="edge">
<title>Node2->Node28</title>
-<g id="a_edge306_Node000002_Node000028"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.71,-1271.49C7663.88,-1266.36 8079.69,-1251.56 8217,-1229 8317.75,-1212.45 8433.75,-1174.52 8482.95,-1157.52"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.56,-1267.99 7488.67,-1271.8 7498.77,-1274.99 7498.56,-1267.99"/>
+<g id="a_edge305_Node000002_Node000028"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.83,-1273.28C5579.12,-1271.65 2804.08,-1260.79 2430.5,-1229 2257.15,-1214.25 2053.15,-1174.92 1968,-1157.5"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.92,-1276.78 6062.93,-1273.31 6052.95,-1269.78 6052.92,-1276.78"/>
</a>
</g>
</g>
@@ -170,18 +170,18 @@
<g id="Node000041" class="node">
<title>Node41</title>
<g id="a_Node000041"><a xlink:href="relax_2distributed_2global__info_8h.html" target="_top" xlink:title="Data structure for distributed inference.">
-<polygon fill="white" stroke="#666666" points="8137,-1031 7979,-1031 7979,-1001 8137,-1001 8137,-1031"/>
-<text text-anchor="start" x="7987" y="-1019" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
-<text text-anchor="middle" x="8058" y="-1008" font-family="Helvetica,sans-Serif" font-size="10.00">/global_info.h</text>
+<polygon fill="white" stroke="#666666" points="3550.5,-1031 3392.5,-1031 3392.5,-1001 3550.5,-1001 3550.5,-1031"/>
+<text text-anchor="start" x="3400.5" y="-1019" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
+<text text-anchor="middle" x="3471.5" y="-1008" font-family="Helvetica,sans-Serif" font-size="10.00">/global_info.h</text>
</a>
</g>
</g>
<!-- Node2->Node41 -->
-<g id="edge402_Node000002_Node000041" class="edge">
+<g id="edge401_Node000002_Node000041" class="edge">
<title>Node2->Node41</title>
-<g id="a_edge402_Node000002_Node000041"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7488.9,-1262.95C7525.76,-1255.46 7573.89,-1244.07 7615,-1229 7737.42,-1184.12 7762.26,-1158.94 7877,-1097 7900.48,-1084.33 7904.93,-1078.52 7929,-1067 7957.71,-1053.26 7991.25,-1040.35 8016.94,-1031.09"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7487.94,-1259.57 7478.82,-1264.96 7489.31,-1266.44 7487.94,-1259.57"/>
+<g id="a_edge401_Node000002_Node000041"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6115.75,-1255.06C6101.43,-1212.66 6059.7,-1108.71 5983.5,-1067 5928.87,-1037.1 3971.53,-1020.75 3550.69,-1017.57"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6112.45,-1256.22 6118.88,-1264.65 6119.11,-1254.05 6112.45,-1256.22"/>
</a>
</g>
</g>
@@ -189,18 +189,18 @@
<g id="Node000052" class="node">
<title>Node52</title>
<g id="a_Node000052"><a xlink:href="runner_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7150.5,-365.5 7023.5,-365.5 7023.5,-335.5 7150.5,-335.5 7150.5,-365.5"/>
-<text text-anchor="start" x="7031.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="7087" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/runner.h</text>
+<polygon fill="white" stroke="#666666" points="489,-365.5 362,-365.5 362,-335.5 489,-335.5 489,-365.5"/>
+<text text-anchor="start" x="370" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="425.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/runner.h</text>
</a>
</g>
</g>
<!-- Node2->Node52 -->
-<g id="edge406_Node000002_Node000052" class="edge">
+<g id="edge405_Node000002_Node000052" class="edge">
<title>Node2->Node52</title>
-<g id="a_edge406_Node000002_Node000052"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.22,-1263.45C7263.03,-1247.51 7090.57,-1213.01 7055,-1163 6961.9,-1032.1 7163.43,-944.28 7087,-803 7043.79,-723.12 6878.78,-745.31 6931,-671 6958.16,-632.35 6991.48,-660.88 7031,-635 7081.63,-601.84 7195.64,-493.24 7218,-437 7222.93,-424.61 7225.36,-418.12 7218,-407 7202.79,-384.04 7175.98,-370.55 7150.56,-362.64"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7360.93,-1266.95 7371.36,-1265.08 7362.04,-1260.04 7360.93,-1266.95"/>
+<g id="a_edge405_Node000002_Node000052"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.46,-1273.32C5392.98,-1271.55 229.88,-1256.83 157.5,-1229 107.55,-1209.79 67.5,-1202.52 67.5,-1149 67.5,-1149 67.5,-1149 67.5,-685 67.5,-511.5 295.39,-402.56 387.53,-365.61"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.74,-1276.82 6062.75,-1273.35 6052.75,-1269.82 6052.74,-1276.82"/>
</a>
</g>
</g>
@@ -208,18 +208,18 @@
<g id="Node000056" class="node">
<title>Node56</title>
<g id="a_Node000056"><a xlink:href="script_2ir__builder_2frame_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="9754.5,-1097 9647.5,-1097 9647.5,-1067 9754.5,-1067 9754.5,-1097"/>
-<text text-anchor="start" x="9655.5" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
-<text text-anchor="middle" x="9701" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
+<polygon fill="white" stroke="#666666" points="2779,-1097 2672,-1097 2672,-1067 2779,-1067 2779,-1097"/>
+<text text-anchor="start" x="2680" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
+<text text-anchor="middle" x="2725.5" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
</a>
</g>
</g>
<!-- Node2->Node56 -->
-<g id="edge410_Node000002_Node000056" class="edge">
+<g id="edge409_Node000002_Node000056" class="edge">
<title>Node2->Node56</title>
-<g id="a_edge410_Node000002_Node000056"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.66,-1273.17C7836.29,-1271.39 9307.9,-1261.78 9399,-1229 9419.25,-1221.71 9417.29,-1207.63 9437,-1199 9530.57,-1158.02 9582.52,-1224.61 9664,-1163 9685.36,-1146.85 9694.81,-1115.39 9698.65,-1097.11"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.51,-1269.67 7488.53,-1273.22 7498.55,-1276.67 7498.51,-1269.67"/>
+<g id="a_edge409_Node000002_Node000056"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.5,-1273.28C5589.02,-1271.7 2945.31,-1261.32 2869.5,-1229 2804.33,-1201.22 2753.46,-1128.4 2734.04,-1097.36"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.71,-1276.78 6062.72,-1273.31 6052.73,-1269.78 6052.71,-1276.78"/>
</a>
</g>
</g>
@@ -227,352 +227,371 @@
<g id="Node000057" class="node">
<title>Node57</title>
<g id="a_Node000057"><a xlink:href="script_2ir__builder_2ir_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="9947,-1031 9843,-1031 9843,-1001 9947,-1001 9947,-1031"/>
-<text text-anchor="start" x="9851" y="-1019" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
-<text text-anchor="middle" x="9895" y="-1008" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
+<polygon fill="white" stroke="#666666" points="2859.5,-1031 2755.5,-1031 2755.5,-1001 2859.5,-1001 2859.5,-1031"/>
+<text text-anchor="start" x="2763.5" y="-1019" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
+<text text-anchor="middle" x="2807.5" y="-1008" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
</a>
</g>
</g>
<!-- Node2->Node57 -->
-<g id="edge411_Node000002_Node000057" class="edge">
+<g id="edge410_Node000002_Node000057" class="edge">
<title>Node2->Node57</title>
-<g id="a_edge411_Node000002_Node000057"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.7,-1273.57C7892.97,-1273.84 9851.85,-1272.94 9895,-1229 9948.51,-1174.51 9915.28,-1069.07 9900.76,-1031.08"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.59,-1270.07 7488.59,-1273.57 7498.58,-1277.07 7498.59,-1270.07"/>
+<g id="a_edge410_Node000002_Node000057"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.59,-1273.59C5608.82,-1274.05 3167.5,-1274.47 3017.5,-1229 2912.64,-1197.22 2837.71,-1073.25 2814.82,-1031.11"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.7,-1277.09 6062.7,-1273.58 6052.69,-1270.09 6052.7,-1277.09"/>
+</a>
+</g>
+</g>
+<!-- Node71 -->
+<g id="Node000071" class="node">
+<title>Node71</title>
+<g id="a_Node000071"><a xlink:href="tirx_2op_8h.html" target="_top" xlink:title="Common operators defined for Expr.">
+<polygon fill="white" stroke="#666666" points="7509.5,-761.5 7391.5,-761.5 7391.5,-742.5 7509.5,-742.5 7509.5,-761.5"/>
+<text text-anchor="middle" x="7450.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/op.h</text>
+</a>
+</g>
+</g>
+<!-- Node2->Node71 -->
+<g id="edge429_Node000002_Node000071" class="edge">
+<title>Node2->Node71</title>
+<g id="a_edge429_Node000002_Node000071"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.36,-1272.69C6422.7,-1269.71 7165.63,-1257.95 7207.5,-1229 7239.28,-1207.03 7241.5,-1187.63 7241.5,-1149 7241.5,-1149 7241.5,-1149 7241.5,-883 7241.5,-846.46 7234.97,-829.15 7260.5,-803 7278.85,-784.21 7343.88,-769.93 7392.78,-761.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.29,-1269.19 6180.34,-1272.82 6190.38,-1276.19 6190.29,-1269.19"/>
</a>
</g>
</g>
<!-- Node72 -->
<g id="Node000072" class="node">
<title>Node72</title>
-<g id="a_Node000072"><a xlink:href="tirx_2op_8h.html" target="_top" xlink:title="Common operators defined for Expr.">
-<polygon fill="white" stroke="#666666" points="1965,-761.5 1847,-761.5 1847,-742.5 1965,-742.5 1965,-761.5"/>
-<text text-anchor="middle" x="1906" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/op.h</text>
+<g id="a_Node000072"><a xlink:href="relax_2expr_8h.html" target="_top" xlink:title=" ">
+<polygon fill="white" stroke="#666666" points="5605,-695.5 5470,-695.5 5470,-676.5 5605,-676.5 5605,-695.5"/>
+<text text-anchor="middle" x="5537.5" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/expr.h</text>
</a>
</g>
</g>
<!-- Node2->Node72 -->
-<g id="edge429_Node000002_Node000072" class="edge">
+<g id="edge403_Node000002_Node000072" class="edge">
<title>Node2->Node72</title>
-<g id="a_edge429_Node000002_Node000072"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.3,-1273.49C6738.68,-1273.36 2092.89,-1270.95 2037,-1229 2007.31,-1206.72 2013,-1186.12 2013,-1149 2013,-1149 2013,-1149 2013,-883 2013,-846.46 2015.93,-832.23 1994,-803 1978.71,-782.62 1952.51,-769.29 1932.66,-761.55"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.46,-1276.99 7371.46,-1273.49 7361.46,-1269.99 7361.46,-1276.99"/>
+<g id="a_edge403_Node000002_Node000072"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6179.46,-1262.27C6201.82,-1255.6 6226.32,-1245.17 6244.5,-1229 6316.82,-1164.65 6399.67,-875.48 6335.5,-803 6291.72,-753.55 6105.71,-777.44 6040.5,-767 5972.94,-756.18 5956.95,-748.48 5889.5,-737 5790.92,-720.22 5676.15,-704.65 5605.15,-695.49"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6178.4,-1258.93 6169.7,-1264.98 6180.28,-1265.67 6178.4,-1258.93"/>
</a>
</g>
</g>
-<!-- Node73 -->
-<g id="Node000073" class="node">
-<title>Node73</title>
-<g id="a_Node000073"><a xlink:href="relax_2expr_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="5846.5,-695.5 5711.5,-695.5 5711.5,-676.5 5846.5,-676.5 5846.5,-695.5"/>
-<text text-anchor="middle" x="5779" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/expr.h</text>
+<!-- Node88 -->
+<g id="Node000088" class="node">
+<title>Node88</title>
+<g id="a_Node000088"><a xlink:href="dataflow__pattern_8h.html" target="_top" xlink:title="A pattern language for matching dataflow properties.">
+<polygon fill="white" stroke="#666666" points="6363,-635 6216,-635 6216,-605 6363,-605 6363,-635"/>
+<text text-anchor="start" x="6224" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/dataflow</text>
+<text text-anchor="middle" x="6289.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_pattern.h</text>
</a>
</g>
</g>
-<!-- Node2->Node73 -->
-<g id="edge404_Node000002_Node000073" class="edge">
-<title>Node2->Node73</title>
-<g id="a_edge404_Node000002_Node000073"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7432.16,-1254.59C7434.67,-1227.18 7437.06,-1175.09 7425,-1133 7406.36,-1067.92 7394.92,-1050.74 7349,-1001 7210.65,-851.13 7133.11,-851.52 6935,-803 6756.04,-759.17 6705.38,-784.86 6522,-767 6272.78,-742.72 5977.04,-709.58 5846.57,-694.74"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7428.66,-1254.42 7431.12,-1264.72 7435.63,-1255.13 7428.66,-1254.42"/>
+<!-- Node2->Node88 -->
+<g id="edge400_Node000002_Node000088" class="edge">
+<title>Node2->Node88</title>
+<g id="a_edge400_Node000002_Node000088"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6177.37,-1262.9C6266.4,-1244.39 6430.5,-1202.95 6430.5,-1149 6430.5,-1149 6430.5,-1149 6430.5,-883 6430.5,-776.85 6339.64,-672.29 6303.8,-635.17"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6176.52,-1259.5 6167.43,-1264.93 6177.93,-1266.36 6176.52,-1259.5"/>
</a>
</g>
</g>
-<!-- Node89 -->
-<g id="Node000089" class="node">
-<title>Node89</title>
-<g id="a_Node000089"><a xlink:href="dataflow__pattern_8h.html" target="_top" xlink:title="A pattern language for matching dataflow properties.">
-<polygon fill="white" stroke="#666666" points="4142.5,-635 3995.5,-635 3995.5,-605 4142.5,-605 4142.5,-635"/>
-<text text-anchor="start" x="4003.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/dataflow</text>
-<text text-anchor="middle" x="4069" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_pattern.h</text>
+<!-- Node93 -->
+<g id="Node000093" class="node">
+<title>Node93</title>
+<g id="a_Node000093"><a xlink:href="topi_2transform_8h.html" target="_top" xlink:title="Transform op constructors.">
+<polygon fill="white" stroke="#666666" points="9297.5,-360 9141.5,-360 9141.5,-341 9297.5,-341 9297.5,-360"/>
+<text text-anchor="middle" x="9219.5" y="-348" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/topi/transform.h</text>
</a>
</g>
</g>
-<!-- Node2->Node89 -->
-<g id="edge401_Node000002_Node000089" class="edge">
-<title>Node2->Node89</title>
-<g id="a_edge401_Node000002_Node000089"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7425.12,-1255.01C7408.4,-1195.77 7347.25,-1010.19 7220,-935 7065.25,-843.56 6998.44,-897.65 6821,-869 6634.89,-838.95 6589.03,-826.64 6402,-803 5673.45,-710.91 5487.73,-719.64 4755,-671 4503.93,-654.33 4440.62,-657.47 4190,-635 4174.62,-633.62 4158.18,-631.89 4142.52,-630.12"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7421.79,-1256.1 7427.81,-1264.82 7428.54,-1254.25 7421.79,-1256.1"/>
+<!-- Node2->Node93 -->
+<g id="edge443_Node000002_Node000093" class="edge">
+<title>Node2->Node93</title>
+<g id="a_edge443_Node000002_Node000093"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.39,-1273.13C6584.55,-1270.9 8557.54,-1258.43 9164.5,-1229 9380.53,-1218.52 10134.5,-1365.29 10134.5,-1149 10134.5,-1149 10134.5,-1149 10134.5,-487 10134.5,-461.57 10314.77,-495.06 9958.5,-407 9835,-376.48 9461.34,-359.99 9297.69,-354.07"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.26,-1269.63 6180.28,-1273.18 6190.3,-1276.63 6190.26,-1269.63"/>
</a>
</g>
</g>
-<!-- Node94 -->
-<g id="Node000094" class="node">
-<title>Node94</title>
-<g id="a_Node000094"><a xlink:href="topi_2transform_8h.html" target="_top" xlink:title="Transform op constructors.">
-<polygon fill="white" stroke="#666666" points="1776,-360 1620,-360 1620,-341 1776,-341 1776,-360"/>
-<text text-anchor="middle" x="1698" y="-348" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/topi/transform.h</text>
+<!-- Node126 -->
+<g id="Node000126" class="node">
+<title>Node126</title>
+<g id="a_Node000126"><a xlink:href="tirx_2type_8h.html" target="_top" xlink:title="Types specific to TIRX.">
+<polygon fill="white" stroke="#666666" points="1841.5,-959.5 1713.5,-959.5 1713.5,-940.5 1841.5,-940.5 1841.5,-959.5"/>
+<text text-anchor="middle" x="1777.5" y="-947.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/type.h</text>
</a>
</g>
</g>
-<!-- Node2->Node94 -->
-<g id="edge443_Node000002_Node000094" class="edge">
-<title>Node2->Node94</title>
-<g id="a_edge443_Node000002_Node000094"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.31,-1273.6C6652.6,-1274.53 690.7,-1280.8 323,-1229 192.72,-1210.65 38,-1280.56 38,-1149 38,-1149 38,-1149 38,-619 38,-466.71 199.92,-508.59 348,-473 471.33,-443.36 1371.43,-484.6 1489,-437 1507.37,-429.56 1504.81,-416.88 1522,-407 1563.39,-383.21 1616.22,-368.31 1653.15,-360.02"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.37,-1277.1 7371.37,-1273.58 7361.36,-1270.1 7361.37,-1277.1"/>
+<!-- Node2->Node126 -->
+<g id="edge433_Node000002_Node000126" class="edge">
+<title>Node2->Node126</title>
+<g id="a_edge433_Node000002_Node000126"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.67,-1273.47C5560.9,-1273.19 2588.88,-1269.81 2190.5,-1229 2038.24,-1213.4 1982.17,-1244.31 1852.5,-1163 1790.37,-1124.04 1776.69,-1100.57 1753.5,-1031 1744.97,-1005.41 1761.51,-974.78 1771.18,-959.93"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.81,-1276.97 6062.81,-1273.48 6052.81,-1269.97 6052.81,-1276.97"/>
</a>
</g>
</g>
<!-- Node127 -->
<g id="Node000127" class="node">
<title>Node127</title>
-<g id="a_Node000127"><a xlink:href="tirx_2type_8h.html" target="_top" xlink:title="Types specific to TIRX.">
-<polygon fill="white" stroke="#666666" points="8137,-959.5 8009,-959.5 8009,-940.5 8137,-940.5 8137,-959.5"/>
-<text text-anchor="middle" x="8073" y="-947.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/type.h</text>
+<g id="a_Node000127"><a xlink:href="tirx_2expr_8h.html" target="_top" xlink:title="TIRx buffer expressions and construction helpers.">
+<polygon fill="white" stroke="#666666" points="2230,-893.5 2103,-893.5 2103,-874.5 2230,-874.5 2230,-893.5"/>
+<text text-anchor="middle" x="2166.5" y="-881.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/expr.h</text>
</a>
</g>
</g>
<!-- Node2->Node127 -->
-<g id="edge433_Node000002_Node000127" class="edge">
+<g id="edge420_Node000002_Node000127" class="edge">
<title>Node2->Node127</title>
-<g id="a_edge433_Node000002_Node000127"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7499.21,-1272.72C7663.6,-1270.37 8090.28,-1261.4 8445,-1229 8656.82,-1209.65 8708.66,-1194.61 8919,-1163 9161.19,-1126.6 9327.21,-1240.54 9454,-1031 9460.9,-1019.59 9463.26,-1010.6 9454,-1001 9407.78,-953.08 8403.19,-950.67 8137.16,-950.88"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.72,-1269.23 7488.77,-1272.86 7498.82,-1276.22 7498.72,-1269.23"/>
+<g id="a_edge420_Node000002_Node000127"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.76,-1273.18C5565.58,-1270.81 2651.06,-1255.58 2564.5,-1229 2503.23,-1210.18 2444.5,-1213.1 2444.5,-1149 2444.5,-1149 2444.5,-1149 2444.5,-1081 2444.5,-965.99 2283.61,-912.54 2206.63,-893.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.79,-1276.68 6062.81,-1273.22 6052.83,-1269.68 6052.79,-1276.68"/>
</a>
</g>
</g>
<!-- Node128 -->
<g id="Node000128" class="node">
<title>Node128</title>
-<g id="a_Node000128"><a xlink:href="tirx_2expr_8h.html" target="_top" xlink:title="TIRx buffer expressions and construction helpers.">
-<polygon fill="white" stroke="#666666" points="7984.5,-893.5 7857.5,-893.5 7857.5,-874.5 7984.5,-874.5 7984.5,-893.5"/>
-<text text-anchor="middle" x="7921" y="-881.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/expr.h</text>
+<g id="a_Node000128"><a xlink:href="script_2ir__builder_2base_8h.html" target="_top" xlink:title=" ">
+<polygon fill="white" stroke="#666666" points="2577.5,-1163 2473.5,-1163 2473.5,-1133 2577.5,-1133 2577.5,-1163"/>
+<text text-anchor="start" x="2481.5" y="-1151" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
+<text text-anchor="middle" x="2525.5" y="-1140" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/base.h</text>
</a>
</g>
</g>
<!-- Node2->Node128 -->
-<g id="edge420_Node000002_Node000128" class="edge">
+<g id="edge408_Node000002_Node000128" class="edge">
<title>Node2->Node128</title>
-<g id="a_edge420_Node000002_Node000128"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7474.79,-1261.97C7525.45,-1245.91 7601,-1211.49 7601,-1149 7601,-1149 7601,-1149 7601,-1081 7601,-1001.33 7638.79,-979.3 7705,-935 7750.27,-904.71 7811.48,-892.63 7857.19,-887.88"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7473.57,-1258.68 7465.02,-1264.94 7475.6,-1265.38 7473.57,-1258.68"/>
+<g id="a_edge408_Node000002_Node000128"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.49,-1273.31C5568.05,-1271.91 2694.38,-1262.2 2611.5,-1229 2577.99,-1215.58 2549.71,-1182.47 2535.44,-1163.32"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.82,-1276.81 6062.83,-1273.34 6052.84,-1269.81 6052.82,-1276.81"/>
</a>
</g>
</g>
<!-- Node129 -->
<g id="Node000129" class="node">
<title>Node129</title>
-<g id="a_Node000129"><a xlink:href="script_2ir__builder_2base_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="10046,-1163 9942,-1163 9942,-1133 10046,-1133 10046,-1163"/>
-<text text-anchor="start" x="9950" y="-1151" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
-<text text-anchor="middle" x="9994" y="-1140" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/base.h</text>
+<g id="a_Node000129"><a xlink:href="target_8h.html" target="_top" xlink:title="Compilation target object.">
+<polygon fill="white" stroke="#666666" points="1093,-1097 986,-1097 986,-1067 1093,-1067 1093,-1097"/>
+<text text-anchor="start" x="994" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/target</text>
+<text text-anchor="middle" x="1039.5" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">/target.h</text>
</a>
</g>
</g>
<!-- Node2->Node129 -->
-<g id="edge409_Node000002_Node000129" class="edge">
+<g id="edge419_Node000002_Node000129" class="edge">
<title>Node2->Node129</title>
-<g id="a_edge409_Node000002_Node000129"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.92,-1273.06C7895.59,-1270.46 9871.77,-1256.12 9928,-1229 9956.71,-1215.15 9977.27,-1182.21 9987.22,-1163.2"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.72,-1269.56 7488.75,-1273.13 7498.77,-1276.56 7498.72,-1269.56"/>
+<g id="a_edge419_Node000002_Node000129"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.41,-1273.45C5492.81,-1272.93 1716.93,-1268.04 1481.5,-1229 1322.05,-1202.56 1141.96,-1128.32 1070.81,-1097.11"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.73,-1276.95 6062.74,-1273.46 6052.74,-1269.95 6052.73,-1276.95"/>
</a>
</g>
</g>
-<!-- Node130 -->
-<g id="Node000130" class="node">
-<title>Node130</title>
-<g id="a_Node000130"><a xlink:href="target_8h.html" target="_top" xlink:title="Compilation target object.">
-<polygon fill="white" stroke="#666666" points="9318.5,-1097 9211.5,-1097 9211.5,-1067 9318.5,-1067 9318.5,-1097"/>
-<text text-anchor="start" x="9219.5" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/target</text>
-<text text-anchor="middle" x="9265" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">/target.h</text>
+<!-- Node133 -->
+<g id="Node000133" class="node">
+<title>Node133</title>
+<g id="a_Node000133"><a xlink:href="ir_2op_8h.html" target="_top" xlink:title="Canonical primitive operators and their registration.">
+<polygon fill="white" stroke="#666666" points="7485.5,-959.5 7377.5,-959.5 7377.5,-940.5 7485.5,-940.5 7485.5,-959.5"/>
+<text text-anchor="middle" x="7431.5" y="-947.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/op.h</text>
</a>
</g>
</g>
-<!-- Node2->Node130 -->
-<g id="edge419_Node000002_Node000130" class="edge">
-<title>Node2->Node130</title>
-<g id="a_edge419_Node000002_Node000130"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.82,-1272.15C7645.49,-1268.8 7999.62,-1258.15 8295,-1229 8698.2,-1189.21 8797.97,-1167.21 9197,-1097 9201.63,-1096.19 9206.43,-1095.29 9211.23,-1094.37"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.54,-1268.66 7488.62,-1272.38 7498.69,-1275.66 7498.54,-1268.66"/>
+<!-- Node2->Node133 -->
+<g id="edge306_Node000002_Node000133" class="edge">
+<title>Node2->Node133</title>
+<g id="a_edge306_Node000002_Node000133"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.27,-1273.4C6430.99,-1272.71 7226.93,-1267.52 7334.5,-1229 7389.73,-1209.22 7439.5,-1207.67 7439.5,-1149 7439.5,-1149 7439.5,-1149 7439.5,-1081 7439.5,-1035.1 7434.47,-980.25 7432.39,-959.51"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.23,-1269.9 6180.24,-1273.43 6190.25,-1276.9 6190.23,-1269.9"/>
</a>
</g>
</g>
-<!-- Node134 -->
-<g id="Node000134" class="node">
-<title>Node134</title>
-<g id="a_Node000134"><a xlink:href="ir_2op_8h.html" target="_top" xlink:title="Canonical primitive operators and their registration.">
-<polygon fill="white" stroke="#666666" points="1985,-959.5 1877,-959.5 1877,-940.5 1985,-940.5 1985,-959.5"/>
-<text text-anchor="middle" x="1931" y="-947.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/op.h</text>
+<!-- Node137 -->
+<g id="Node000137" class="node">
+<title>Node137</title>
+<g id="a_Node000137"><a xlink:href="ir_2prim_2expr_8h.html" target="_top" xlink:title="TIR expressions.">
+<polygon fill="white" stroke="#666666" points="3766.5,-899 3656.5,-899 3656.5,-869 3766.5,-869 3766.5,-899"/>
+<text text-anchor="start" x="3664.5" y="-887" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/prim</text>
+<text text-anchor="middle" x="3711.5" y="-876" font-family="Helvetica,sans-Serif" font-size="10.00">/expr.h</text>
</a>
</g>
</g>
-<!-- Node2->Node134 -->
-<g id="edge307_Node000002_Node000134" class="edge">
-<title>Node2->Node134</title>
-<g id="a_edge307_Node000002_Node000134"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7360.87,-1273.41C6734.41,-1272.49 2059.77,-1264.49 1999,-1229 1963.58,-1208.32 1953,-1190.01 1953,-1149 1953,-1149 1953,-1149 1953,-1081 1953,-1034.76 1939.3,-980.55 1933.52,-959.74"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.09,-1276.91 7371.1,-1273.42 7361.1,-1269.91 7361.09,-1276.91"/>
+<!-- Node2->Node137 -->
+<g id="edge320_Node000002_Node000137" class="edge">
+<title>Node2->Node137</title>
+<g id="a_edge320_Node000002_Node000137"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6121.5,-1254.74C6121.5,-1230.37 6121.5,-1186.51 6121.5,-1149 6121.5,-1149 6121.5,-1149 6121.5,-1081 6121.5,-958.77 4126.16,-896.7 3766.65,-886.51"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6118,-1254.75 6121.5,-1264.75 6125,-1254.75 6118,-1254.75"/>
</a>
</g>
</g>
-<!-- Node138 -->
-<g id="Node000138" class="node">
-<title>Node138</title>
-<g id="a_Node000138"><a xlink:href="ir_2prim_2expr_8h.html" target="_top" xlink:title="TIR expressions.">
-<polygon fill="white" stroke="#666666" points="3595,-899 3485,-899 3485,-869 3595,-869 3595,-899"/>
-<text text-anchor="start" x="3493" y="-887" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/prim</text>
-<text text-anchor="middle" x="3540" y="-876" font-family="Helvetica,sans-Serif" font-size="10.00">/expr.h</text>
+<!-- Node141 -->
+<g id="Node000141" class="node">
+<title>Node141</title>
+<g id="a_Node000141"><a xlink:href="bound_8h.html" target="_top" xlink:title="Bound deducers.">
+<polygon fill="white" stroke="#666666" points="6998.5,-761.5 6858.5,-761.5 6858.5,-742.5 6998.5,-742.5 6998.5,-761.5"/>
+<text text-anchor="middle" x="6928.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/bound.h</text>
</a>
</g>
</g>
-<!-- Node2->Node138 -->
-<g id="edge321_Node000002_Node000138" class="edge">
-<title>Node2->Node138</title>
-<g id="a_edge321_Node000002_Node000138"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.38,-1272.9C6873.65,-1268.38 3951,-1237.63 3951,-1149 3951,-1149 3951,-1149 3951,-1015 3951,-941.19 3707,-903.94 3595,-890.74"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.41,-1276.4 7371.44,-1272.99 7361.47,-1269.4 7361.41,-1276.4"/>
+<!-- Node2->Node141 -->
+<g id="edge415_Node000002_Node000141" class="edge">
+<title>Node2->Node141</title>
+<g id="a_edge415_Node000002_Node000141"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.49,-1273.38C6320.44,-1272.29 6596.28,-1265.57 6683.5,-1229 6704.13,-1220.35 6747.36,-1181.79 6759.5,-1163 6779.64,-1131.82 6783.5,-1120.12 6783.5,-1083 6783.5,-1083 6783.5,-1083 6783.5,-883 6783.5,-818.59 6863.79,-778.05 6904.88,-761.53"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.24,-1269.88 6180.26,-1273.46 6190.29,-1276.88 6190.24,-1269.88"/>
</a>
</g>
</g>
<!-- Node142 -->
<g id="Node000142" class="node">
<title>Node142</title>
-<g id="a_Node000142"><a xlink:href="bound_8h.html" target="_top" xlink:title="Bound deducers.">
-<polygon fill="white" stroke="#666666" points="2587,-761.5 2447,-761.5 2447,-742.5 2587,-742.5 2587,-761.5"/>
-<text text-anchor="middle" x="2517" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/bound.h</text>
+<g id="a_Node000142"><a xlink:href="int__set_8h.html" target="_top" xlink:title="Integer set.">
+<polygon fill="white" stroke="#666666" points="7038.5,-833 6924.5,-833 6924.5,-803 7038.5,-803 7038.5,-833"/>
+<text text-anchor="start" x="6932.5" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/int</text>
+<text text-anchor="middle" x="6981.5" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_set.h</text>
</a>
</g>
</g>
<!-- Node2->Node142 -->
-<g id="edge415_Node000002_Node000142" class="edge">
+<g id="edge416_Node000002_Node000142" class="edge">
<title>Node2->Node142</title>
-<g id="a_edge415_Node000002_Node000142"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.39,-1273.21C6931.95,-1271.28 4621.88,-1259.54 4309,-1229 4146.23,-1213.11 4107.04,-1196.64 3947,-1163 3328.17,-1032.91 3069.64,-1211.41 2563,-833 2538.1,-814.4 2524.52,-778.05 2519.41,-761.53"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.47,-1276.71 7371.48,-1273.25 7361.5,-1269.71 7361.47,-1276.71"/>
+<g id="a_edge416_Node000002_Node000142"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.6,-1272.88C6420.33,-1270.53 7146.15,-1260.63 7184.5,-1229 7212.69,-1205.75 7203.5,-1185.54 7203.5,-1149 7203.5,-1149 7203.5,-1149 7203.5,-949 7203.5,-872.63 7104.45,-840.28 7038.67,-827.22"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.33,-1269.38 6180.37,-1272.99 6190.4,-1276.38 6190.33,-1269.38"/>
</a>
</g>
</g>
<!-- Node143 -->
<g id="Node000143" class="node">
<title>Node143</title>
-<g id="a_Node000143"><a xlink:href="int__set_8h.html" target="_top" xlink:title="Integer set.">
-<polygon fill="white" stroke="#666666" points="2435,-833 2321,-833 2321,-803 2435,-803 2435,-833"/>
-<text text-anchor="start" x="2329" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/int</text>
-<text text-anchor="middle" x="2378" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_set.h</text>
+<g id="a_Node000143"><a xlink:href="analyzer_8h.html" target="_top" xlink:title="Algebra expression simplifications.">
+<polygon fill="white" stroke="#666666" points="8944.5,-695.5 8792.5,-695.5 8792.5,-676.5 8944.5,-676.5 8944.5,-695.5"/>
+<text text-anchor="middle" x="8868.5" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/analyzer.h</text>
</a>
</g>
</g>
<!-- Node2->Node143 -->
-<g id="edge416_Node000002_Node000143" class="edge">
+<g id="edge414_Node000002_Node000143" class="edge">
<title>Node2->Node143</title>
-<g id="a_edge416_Node000002_Node000143"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7360.9,-1273.45C6760.84,-1272.95 2453.95,-1268.01 2402,-1229 2372.32,-1206.71 2378,-1186.12 2378,-1149 2378,-1149 2378,-1149 2378,-949 2378,-906.8 2378,-856.88 2378,-833.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.12,-1276.95 7371.12,-1273.46 7361.12,-1269.95 7361.12,-1276.95"/>
+<g id="a_edge414_Node000002_Node000143"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.46,-1273.06C6698.61,-1269.56 9843.5,-1244.09 9843.5,-1149 9843.5,-1149 9843.5,-1149 9843.5,-817 9843.5,-726.44 9174.07,-696.7 8944.6,-689.17"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.31,-1269.56 6180.34,-1273.12 6190.36,-1276.56 6190.31,-1269.56"/>
</a>
</g>
</g>
<!-- Node144 -->
<g id="Node000144" class="node">
<title>Node144</title>
-<g id="a_Node000144"><a xlink:href="analyzer_8h.html" target="_top" xlink:title="Algebra expression simplifications.">
-<polygon fill="white" stroke="#666666" points="1525,-695.5 1373,-695.5 1373,-676.5 1525,-676.5 1525,-695.5"/>
-<text text-anchor="middle" x="1449" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/analyzer.h</text>
+<g id="a_Node000144"><a xlink:href="iter__affine__map_8h.html" target="_top" xlink:title="Iterator quasi-affine mapping patterns.">
+<polygon fill="white" stroke="#666666" points="3117.5,-635 2999.5,-635 2999.5,-605 3117.5,-605 3117.5,-635"/>
+<text text-anchor="start" x="3007.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/iter</text>
+<text text-anchor="middle" x="3058.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_affine_map.h</text>
</a>
</g>
</g>
<!-- Node2->Node144 -->
-<g id="edge414_Node000002_Node000144" class="edge">
+<g id="edge417_Node000002_Node000144" class="edge">
<title>Node2->Node144</title>
-<g id="a_edge414_Node000002_Node000144"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.3,-1273.49C6741.15,-1273.32 2130.49,-1270.64 2075,-1229 2045.31,-1206.72 2051,-1186.12 2051,-1149 2051,-1149 2051,-1149 2051,-817 2051,-767.65 2018.44,-758.45 1974,-737 1896.7,-699.69 1651,-690.21 1525.05,-687.81"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.42,-1276.99 7371.42,-1273.49 7361.42,-1269.99 7361.42,-1276.99"/>
+<g id="a_edge417_Node000002_Node000144"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.64,-1273.55C5695.85,-1273.62 4054.54,-1271.57 3547.5,-1229 3352.2,-1212.6 3276.08,-1269.41 3111.5,-1163 2964.9,-1068.22 2947.85,-1000.45 2898.5,-833 2871.68,-742 3028.46,-827.54 3101.5,-767 3135.44,-738.86 3146.4,-710.34 3126.5,-671 3118.56,-655.31 3103.12,-643.34 3088.96,-635.06"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.82,-1277.05 6062.82,-1273.55 6052.82,-1270.05 6052.82,-1277.05"/>
</a>
</g>
</g>
<!-- Node145 -->
<g id="Node000145" class="node">
<title>Node145</title>
-<g id="a_Node000145"><a xlink:href="iter__affine__map_8h.html" target="_top" xlink:title="Iterator quasi-affine mapping patterns.">
-<polygon fill="white" stroke="#666666" points="7201,-635 7083,-635 7083,-605 7201,-605 7201,-635"/>
-<text text-anchor="start" x="7091" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/iter</text>
-<text text-anchor="middle" x="7142" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_affine_map.h</text>
+<g id="a_Node000145"><a xlink:href="vector__expr_8h.html" target="_top" xlink:title="Primitive vector expressions.">
+<polygon fill="white" stroke="#666666" points="3336.5,-965 3226.5,-965 3226.5,-935 3336.5,-935 3336.5,-965"/>
+<text text-anchor="start" x="3234.5" y="-953" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/prim</text>
+<text text-anchor="middle" x="3281.5" y="-942" font-family="Helvetica,sans-Serif" font-size="10.00">/vector_expr.h</text>
</a>
</g>
</g>
<!-- Node2->Node145 -->
-<g id="edge417_Node000002_Node000145" class="edge">
+<g id="edge394_Node000002_Node000145" class="edge">
<title>Node2->Node145</title>
-<g id="a_edge417_Node000002_Node000145"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7451.62,-1258.95C7479.66,-1238.15 7525,-1197.09 7525,-1149 7525,-1149 7525,-1149 7525,-1081 7525,-1071.63 7340.62,-809.63 7334,-803 7297.39,-766.38 7286.43,-755.32 7238,-737 7176.02,-713.55 6985.94,-750.6 6942,-701 6933.16,-691.02 6933.79,-681.51 6942,-671 6946.47,-665.28 7025.61,-646.73 7082.98,-633.9"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7449.3,-1256.3 7443.21,-1264.97 7453.38,-1262 7449.3,-1256.3"/>
+<g id="a_edge394_Node000002_Node000145"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6052.92,-1270.58C5649.85,-1253.02 3598.42,-1157.93 3350.5,-1031 3321.77,-1016.29 3299.93,-983.99 3289.09,-965.24"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.83,-1274.08 6062.97,-1271.02 6053.13,-1267.09 6052.83,-1274.08"/>
</a>
</g>
</g>
<!-- Node146 -->
<g id="Node000146" class="node">
<title>Node146</title>
-<g id="a_Node000146"><a xlink:href="vector__expr_8h.html" target="_top" xlink:title="Primitive vector expressions.">
-<polygon fill="white" stroke="#666666" points="7211,-965 7101,-965 7101,-935 7211,-935 7211,-965"/>
-<text text-anchor="start" x="7109" y="-953" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/prim</text>
-<text text-anchor="middle" x="7156" y="-942" font-family="Helvetica,sans-Serif" font-size="10.00">/vector_expr.h</text>
+<g id="a_Node000146"><a xlink:href="unique__name__supply_8h.html" target="_top" xlink:title="UniqueNameSupply that can be used to generate unique variable names.">
+<polygon fill="white" stroke="#666666" points="7403.5,-635 7283.5,-635 7283.5,-605 7403.5,-605 7403.5,-635"/>
+<text text-anchor="start" x="7291.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/unique</text>
+<text text-anchor="middle" x="7343.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_name_supply.h</text>
</a>
</g>
</g>
<!-- Node2->Node146 -->
-<g id="edge395_Node000002_Node000146" class="edge">
+<g id="edge397_Node000002_Node000146" class="edge">
<title>Node2->Node146</title>
-<g id="a_edge395_Node000002_Node000146"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7416.25,-1256.78C7409.94,-1248.67 7402.64,-1238.63 7397,-1229 7373.38,-1188.65 7381.33,-1170.93 7354,-1133 7339.74,-1113.21 7216.79,-1004.43 7172.13,-965.15"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7413.6,-1259.06 7422.57,-1264.69 7419.07,-1254.7 7413.6,-1259.06"/>
+<g id="a_edge397_Node000002_Node000146"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.74,-1273.47C6308.69,-1272.4 6542.9,-1265.57 6615.5,-1229 6693.1,-1189.92 6745.5,-1169.88 6745.5,-1083 6745.5,-1083 6745.5,-1083 6745.5,-751 6745.5,-723.68 7131.78,-656.3 7283.42,-630.9"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.35,-1269.97 6180.38,-1273.55 6190.41,-1276.97 6190.35,-1269.97"/>
</a>
</g>
</g>
<!-- Node147 -->
<g id="Node000147" class="node">
<title>Node147</title>
-<g id="a_Node000147"><a xlink:href="unique__name__supply_8h.html" target="_top" xlink:title="UniqueNameSupply that can be used to generate unique variable names.">
-<polygon fill="white" stroke="#666666" points="8977,-635 8857,-635 8857,-605 8977,-605 8977,-635"/>
-<text text-anchor="start" x="8865" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/unique</text>
-<text text-anchor="middle" x="8917" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_name_supply.h</text>
+<g id="a_Node000147"><a xlink:href="exec__builder_8h.html" target="_top" xlink:title=" ">
+<polygon fill="white" stroke="#666666" points="6863.5,-1229 6735.5,-1229 6735.5,-1199 6863.5,-1199 6863.5,-1229"/>
+<text text-anchor="start" x="6743.5" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/exec</text>
+<text text-anchor="middle" x="6799.5" y="-1206" font-family="Helvetica,sans-Serif" font-size="10.00">_builder.h</text>
</a>
</g>
</g>
<!-- Node2->Node147 -->
-<g id="edge398_Node000002_Node000147" class="edge">
+<g id="edge402_Node000002_Node000147" class="edge">
<title>Node2->Node147</title>
-<g id="a_edge398_Node000002_Node000147"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.85,-1269.62C7688.24,-1258.03 8203,-1219.99 8203,-1149 8203,-1149 8203,-1149 8203,-1081 8203,-921.77 8287.93,-876.86 8429,-803 8521.8,-754.41 8815.14,-829.77 8899,-767 8939.48,-736.7 8928.11,-665.93 8920.88,-635.42"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.51,-1266.13 7488.74,-1270.23 7498.93,-1273.12 7498.51,-1266.13"/>
+<g id="a_edge402_Node000002_Node000147"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.16,-1270.72C6301.88,-1265.69 6529.82,-1253.24 6721.5,-1229 6726,-1228.43 6730.64,-1227.77 6735.31,-1227.07"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6189.88,-1267.23 6180.04,-1271.17 6190.19,-1274.23 6189.88,-1267.23"/>
</a>
</g>
</g>
<!-- Node148 -->
<g id="Node000148" class="node">
<title>Node148</title>
-<g id="a_Node000148"><a xlink:href="exec__builder_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="9574,-1229 9446,-1229 9446,-1199 9574,-1199 9574,-1229"/>
-<text text-anchor="start" x="9454" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/exec</text>
-<text text-anchor="middle" x="9510" y="-1206" font-family="Helvetica,sans-Serif" font-size="10.00">_builder.h</text>
+<g id="a_Node000148"><a xlink:href="doc_8h.html" target="_top" xlink:title=" ">
+<polygon fill="white" stroke="#666666" points="7373.5,-1163 7269.5,-1163 7269.5,-1133 7373.5,-1133 7373.5,-1163"/>
+<text text-anchor="start" x="7277.5" y="-1151" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
+<text text-anchor="middle" x="7321.5" y="-1140" font-family="Helvetica,sans-Serif" font-size="10.00">/printer/doc.h</text>
</a>
</g>
</g>
<!-- Node2->Node148 -->
-<g id="edge403_Node000002_Node000148" class="edge">
+<g id="edge411_Node000002_Node000148" class="edge">
<title>Node2->Node148</title>
-<g id="a_edge403_Node000002_Node000148"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7499.05,-1273.41C7805.59,-1272.77 9045.07,-1267.79 9432,-1229 9436.52,-1228.55 9441.17,-1227.98 9445.84,-1227.33"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.97,-1269.91 7488.97,-1273.43 7498.98,-1276.91 7498.97,-1269.91"/>
+<g id="a_edge411_Node000002_Node000148"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.33,-1274.05C6421.4,-1275.45 7160.36,-1276.15 7255.5,-1229 7284.06,-1214.85 7304.67,-1182.02 7314.68,-1163.11"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.06,-1270.55 6180.03,-1273.98 6190.01,-1277.55 6190.06,-1270.55"/>
</a>
</g>
</g>
<!-- Node149 -->
<g id="Node000149" class="node">
<title>Node149</title>
-<g id="a_Node000149"><a xlink:href="doc_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7345,-1163 7241,-1163 7241,-1133 7345,-1133 7345,-1163"/>
-<text text-anchor="start" x="7249" y="-1151" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
-<text text-anchor="middle" x="7293" y="-1140" font-family="Helvetica,sans-Serif" font-size="10.00">/printer/doc.h</text>
+<g id="a_Node000149"><a xlink:href="doc__translator_8h.html" target="_top" xlink:title=" ">
+<polygon fill="white" stroke="#666666" points="7407,-1097 7274,-1097 7274,-1067 7407,-1067 7407,-1097"/>
+<text text-anchor="start" x="7282" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
+<text text-anchor="middle" x="7340.5" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">/printer/doc_translator.h</text>
</a>
</g>
</g>
<!-- Node2->Node149 -->
-<g id="edge412_Node000002_Node000149" class="edge">
+<g id="edge413_Node000002_Node000149" class="edge">
<title>Node2->Node149</title>
-<g id="a_edge412_Node000002_Node000149"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7404.03,-1259.92C7389.95,-1251.91 7372.68,-1241.01 7359,-1229 7336,-1208.81 7314.44,-1180.15 7302.55,-1163.18"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7402.74,-1263.2 7413.19,-1264.97 7406.13,-1257.08 7402.74,-1263.2"/>
+<g id="a_edge413_Node000002_Node000149"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M6190.22,-1273.1C6424.43,-1271.43 7182.74,-1263.41 7286.5,-1229 7335.65,-1212.7 7358.4,-1208.82 7382.5,-1163 7394.62,-1139.95 7373.36,-1113.16 7356.92,-1097.17"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.1,-1269.6 6180.12,-1273.17 6190.15,-1276.6 6190.1,-1269.6"/>
</a>
</g>
</g>
@@ -580,8 +599,8 @@
<g id="Node000150" class="node">
<title>Node150</title>
<g id="a_Node000150"><a xlink:href="pattern_8h.html" target="_top" xlink:title="Expression pattern detectors.">
-<polygon fill="white" stroke="#666666" points="9738,-1223.5 9592,-1223.5 9592,-1204.5 9738,-1204.5 9738,-1223.5"/>
-<text text-anchor="middle" x="9665" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/pattern.h</text>
+<polygon fill="white" stroke="#666666" points="7027.5,-1223.5 6881.5,-1223.5 6881.5,-1204.5 7027.5,-1204.5 7027.5,-1223.5"/>
+<text text-anchor="middle" x="6954.5" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/sym/pattern.h</text>
</a>
</g>
</g>
@@ -589,8 +608,8 @@
<g id="edge418_Node000002_Node000150" class="edge">
<title>Node2->Node150</title>
<g id="a_edge418_Node000002_Node000150"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.94,-1273.45C7819.26,-1273.02 9164.42,-1268.84 9583,-1229 9595.8,-1227.78 9609.61,-1225.72 9622.18,-1223.55"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.86,-1269.95 7488.87,-1273.47 7498.87,-1276.95 7498.86,-1269.95"/>
+<path fill="none" stroke="#63b8ff" d="M6190.12,-1271.96C6322.47,-1268.42 6622.1,-1257.71 6872.5,-1229 6884.7,-1227.6 6897.83,-1225.59 6909.94,-1223.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.02,-1268.46 6180.12,-1272.22 6190.2,-1275.46 6190.02,-1268.46"/>
</a>
</g>
</g>
@@ -598,9 +617,9 @@
<g id="Node000151" class="node">
<title>Node151</title>
<g id="a_Node000151"><a xlink:href="index__map_8h.html" target="_top" xlink:title="Defines a remapping of buffer indices.">
-<polygon fill="white" stroke="#666666" points="3863,-635 3739,-635 3739,-605 3863,-605 3863,-635"/>
-<text text-anchor="start" x="3747" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/index</text>
-<text text-anchor="middle" x="3801" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_map.h</text>
+<polygon fill="white" stroke="#666666" points="6921.5,-635 6797.5,-635 6797.5,-605 6921.5,-605 6921.5,-635"/>
+<text text-anchor="start" x="6805.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/index</text>
+<text text-anchor="middle" x="6859.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_map.h</text>
</a>
</g>
</g>
@@ -608,8 +627,8 @@
<g id="edge421_Node000002_Node000151" class="edge">
<title>Node2->Node151</title>
<g id="a_edge421_Node000002_Node000151"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.25,-1273.28C6759.49,-1271.32 2407.43,-1256.19 2277,-1229 2188.1,-1210.47 2089,-1239.81 2089,-1149 2089,-1149 2089,-1149 2089,-883 2089,-846.46 2083.27,-829.9 2108,-803 2171.63,-733.78 2216.8,-755.44 2309,-737 2450.79,-708.64 3474.3,-641.88 3738.77,-624.95"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.48,-1276.78 7371.5,-1273.31 7361.51,-1269.78 7361.48,-1276.78"/>
+<path fill="none" stroke="#63b8ff" d="M6190.31,-1274.47C6303.26,-1274.84 6521.84,-1270.01 6585.5,-1229 6619.98,-1206.79 6631.5,-1190.01 6631.5,-1149 6631.5,-1149 6631.5,-1149 6631.5,-1081 6631.5,-893.44 6607.99,-812.16 6731.5,-671 6748.39,-651.7 6773.66,-639.79 6797.3,-632.47"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.06,-1270.97 6180.04,-1274.43 6190.03,-1277.97 6190.06,-1270.97"/>
</a>
</g>
</g>
@@ -617,9 +636,9 @@
<g id="Node000152" class="node">
<title>Node152</title>
<g id="a_Node000152"><a xlink:href="tirx_2op__attr__types_8h.html" target="_top" xlink:title="Attribute types in the Op registry for TIR ops.">
-<polygon fill="white" stroke="#666666" points="2226.5,-833 2117.5,-833 2117.5,-803 2226.5,-803 2226.5,-833"/>
-<text text-anchor="start" x="2125.5" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/op</text>
-<text text-anchor="middle" x="2172" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_attr_types.h</text>
+<polygon fill="white" stroke="#666666" points="6326,-833 6217,-833 6217,-803 6326,-803 6326,-833"/>
+<text text-anchor="start" x="6225" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/op</text>
+<text text-anchor="middle" x="6271.5" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_attr_types.h</text>
</a>
</g>
</g>
@@ -627,8 +646,8 @@
<g id="edge430_Node000002_Node000152" class="edge">
<title>Node2->Node152</title>
<g id="a_edge430_Node000002_Node000152"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7361.13,-1273.44C6765.27,-1272.86 2500.81,-1267.39 2376,-1229 2314.73,-1210.16 2256,-1213.1 2256,-1149 2256,-1149 2256,-1149 2256,-949 2256,-900.09 2213.54,-855.02 2189,-833.05"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7361.28,-1276.94 7371.28,-1273.45 7361.29,-1269.94 7361.28,-1276.94"/>
+<path fill="none" stroke="#63b8ff" d="M6155.81,-1261.12C6198.12,-1243.38 6264.5,-1206.41 6264.5,-1149 6264.5,-1149 6264.5,-1149 6264.5,-949 6264.5,-906.73 6268.24,-856.85 6270.25,-833.03"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6154.37,-1257.93 6146.41,-1264.91 6156.99,-1264.42 6154.37,-1257.93"/>
</a>
</g>
</g>
@@ -636,8 +655,8 @@
<g id="Node000153" class="node">
<title>Node153</title>
<g id="a_Node000153"><a xlink:href="var_8h.html" target="_top" xlink:title="Variables in the TIR.">
-<polygon fill="white" stroke="#666666" points="7184.5,-1157.5 7063.5,-1157.5 7063.5,-1138.5 7184.5,-1138.5 7184.5,-1157.5"/>
-<text text-anchor="middle" x="7124" y="-1145.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/var.h</text>
+<polygon fill="white" stroke="#666666" points="3045,-1157.5 2924,-1157.5 2924,-1138.5 3045,-1138.5 3045,-1157.5"/>
+<text text-anchor="middle" x="2984.5" y="-1145.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/var.h</text>
</a>
</g>
</g>
@@ -645,8 +664,8 @@
<g id="edge434_Node000002_Node000153" class="edge">
<title>Node2->Node153</title>
<g id="a_edge434_Node000002_Node000153"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7399.35,-1261.03C7337.32,-1235.79 7198.29,-1179.23 7145.18,-1157.62"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7398.39,-1264.42 7408.97,-1264.94 7401.02,-1257.93 7398.39,-1264.42"/>
+<path fill="none" stroke="#63b8ff" d="M6052.67,-1273.24C5605.63,-1271.47 3130.27,-1260.27 3059.5,-1229 3025.37,-1213.92 2999.54,-1175.04 2989.3,-1157.64"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6052.84,-1276.74 6062.85,-1273.28 6052.86,-1269.74 6052.84,-1276.74"/>
</a>
</g>
</g>
@@ -654,8 +673,8 @@
<g id="Node000154" class="node">
<title>Node154</title>
<g id="a_Node000154"><a xlink:href="topi_2utils_8h.html" target="_top" xlink:title="Topi utility function.">
-<polygon fill="white" stroke="#666666" points="9885.5,-1223.5 9756.5,-1223.5 9756.5,-1204.5 9885.5,-1204.5 9885.5,-1223.5"/>
-<text text-anchor="middle" x="9821" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/topi/utils.h</text>
+<polygon fill="white" stroke="#666666" points="7175,-1223.5 7046,-1223.5 7046,-1204.5 7175,-1204.5 7175,-1223.5"/>
+<text text-anchor="middle" x="7110.5" y="-1211.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/topi/utils.h</text>
</a>
</g>
</g>
@@ -663,8 +682,8 @@
<g id="edge444_Node000002_Node000154" class="edge">
<title>Node2->Node154</title>
<g id="a_edge444_Node000002_Node000154"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7498.67,-1273.74C7833.21,-1274.65 9294.47,-1275.82 9747,-1229 9758.58,-1227.8 9771.05,-1225.75 9782.39,-1223.57"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7498.65,-1270.24 7488.64,-1273.71 7498.63,-1277.24 7498.65,-1270.24"/>
+<path fill="none" stroke="#63b8ff" d="M6190.24,-1273.4C6342.98,-1272.46 6721.93,-1266.23 7036.5,-1229 7047.8,-1227.66 7059.96,-1225.62 7071.1,-1223.5"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6190.05,-1269.9 6180.07,-1273.45 6190.09,-1276.9 6190.05,-1269.9"/>
</a>
</g>
</g>
@@ -672,9 +691,9 @@
<g id="Node000004" class="node">
<title>Node4</title>
<g id="a_Node000004"><a xlink:href="tirx_2expr__functor_8h.html" target="_top" xlink:title="Functors for tirx expressions.">
-<polygon fill="white" stroke="#666666" points="7228.5,-767 7109.5,-767 7109.5,-737 7228.5,-737 7228.5,-767"/>
-<text text-anchor="start" x="7117.5" y="-755" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/expr</text>
-<text text-anchor="middle" x="7169" y="-744" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
+<polygon fill="white" stroke="#666666" points="3092,-767 2973,-767 2973,-737 3092,-737 3092,-767"/>
+<text text-anchor="start" x="2981" y="-755" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/expr</text>
+<text text-anchor="middle" x="3032.5" y="-744" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
</a>
</g>
</g>
@@ -682,8 +701,8 @@
<g id="edge3_Node000003_Node000004" class="edge">
<title>Node3->Node4</title>
<g id="a_edge3_Node000003_Node000004"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7238.91,-797.3C7223.54,-787.56 7205.33,-776.02 7191.35,-767.16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7237.26,-800.4 7247.58,-802.8 7241.01,-794.49 7237.26,-800.4"/>
+<path fill="none" stroke="#63b8ff" d="M2984.88,-795.92C2995.35,-786.49 3007.42,-775.61 3016.79,-767.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2982.34,-793.5 2977.26,-802.8 2987.03,-798.7 2982.34,-793.5"/>
</a>
</g>
</g>
@@ -691,9 +710,9 @@
<g id="Node000005" class="node">
<title>Node5</title>
<g id="a_Node000005"><a xlink:href="tirx_2stmt__functor_8h.html" target="_top" xlink:title="Functors for tirx stmts utility functions to call common functors.">
-<polygon fill="white" stroke="#666666" points="7360.5,-701 7241.5,-701 7241.5,-671 7360.5,-671 7360.5,-701"/>
-<text text-anchor="start" x="7249.5" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/stmt</text>
-<text text-anchor="middle" x="7301" y="-678" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
+<polygon fill="white" stroke="#666666" points="2915,-701 2796,-701 2796,-671 2915,-671 2915,-701"/>
+<text text-anchor="start" x="2804" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/stmt</text>
+<text text-anchor="middle" x="2855.5" y="-678" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
</a>
</g>
</g>
@@ -701,8 +720,8 @@
<g id="edge38_Node000003_Node000005" class="edge">
<title>Node3->Node5</title>
<g id="a_edge38_Node000003_Node000005"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7275.71,-793.04C7282.14,-766.08 7292.37,-723.21 7297.63,-701.14"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7272.29,-792.3 7273.38,-802.84 7279.1,-793.92 7272.29,-792.3"/>
+<path fill="none" stroke="#63b8ff" d="M2943.4,-794.8C2921.54,-767.99 2885.42,-723.7 2867.03,-701.14"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2940.92,-797.3 2949.95,-802.84 2946.35,-792.88 2940.92,-797.3"/>
</a>
</g>
</g>
@@ -710,8 +729,8 @@
<g id="edge4_Node000004_Node000005" class="edge">
<title>Node4->Node5</title>
<g id="a_edge4_Node000004_Node000005"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7207.13,-732.51C7227.84,-722.47 7253.03,-710.26 7272.1,-701.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7205.44,-729.44 7197.97,-736.95 7208.49,-735.74 7205.44,-729.44"/>
+<path fill="none" stroke="#63b8ff" d="M2983.98,-733.46C2955.74,-723.25 2920.63,-710.55 2894.25,-701.01"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2983.06,-736.85 2993.66,-736.95 2985.44,-730.26 2983.06,-736.85"/>
</a>
</g>
</g>
@@ -719,9 +738,9 @@
<g id="Node000006" class="node">
<title>Node6</title>
<g id="a_Node000006"><a xlink:href="s__tir_2stmt__functor_8h.html" target="_top" xlink:title="Native traversal and statement dispatch for schedulable TIR.">
-<polygon fill="white" stroke="#666666" points="7755,-635 7631,-635 7631,-605 7755,-605 7755,-635"/>
-<text text-anchor="start" x="7639" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/stmt</text>
-<text text-anchor="middle" x="7693" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
+<polygon fill="white" stroke="#666666" points="2411.5,-635 2287.5,-635 2287.5,-605 2411.5,-605 2411.5,-635"/>
+<text text-anchor="start" x="2295.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/stmt</text>
+<text text-anchor="middle" x="2349.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
</a>
</g>
</g>
@@ -729,8 +748,8 @@
<g id="edge5_Node000005_Node000006" class="edge">
<title>Node5->Node6</title>
<g id="a_edge5_Node000005_Node000006"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7370.67,-673.62C7444.54,-661.56 7560.13,-642.69 7630.96,-631.13"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7369.84,-670.21 7360.54,-675.28 7370.97,-677.12 7369.84,-670.21"/>
+<path fill="none" stroke="#63b8ff" d="M2785.7,-670.96C2646.25,-649.21 2494.55,-634 2411.6,-626.41"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2785.3,-674.44 2795.72,-672.54 2786.38,-667.53 2785.3,-674.44"/>
</a>
</g>
</g>
@@ -738,9 +757,9 @@
<g id="Node000007" class="node">
<title>Node7</title>
<g id="a_Node000007"><a xlink:href="axis__group__graph_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7530,-569 7372,-569 7372,-539 7530,-539 7530,-569"/>
-<text text-anchor="start" x="7380" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
-<text text-anchor="middle" x="7451" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">/axis_group_graph.h</text>
+<polygon fill="white" stroke="#666666" points="2791.5,-569 2633.5,-569 2633.5,-539 2791.5,-539 2791.5,-569"/>
+<text text-anchor="start" x="2641.5" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
+<text text-anchor="middle" x="2712.5" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">/axis_group_graph.h</text>
</a>
</g>
</g>
@@ -748,8 +767,8 @@
<g id="edge6_Node000006_Node000007" class="edge">
<title>Node6->Node7</title>
<g id="a_edge6_Node000006_Node000007"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7630.18,-602.39C7591,-592.03 7541.15,-578.84 7503.98,-569.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7629.33,-605.78 7639.89,-604.95 7631.12,-599.01 7629.33,-605.78"/>
+<path fill="none" stroke="#63b8ff" d="M2421.68,-605.69C2422.96,-605.46 2424.24,-605.23 2425.5,-605 2495.7,-592.42 2575.63,-578.53 2633.28,-568.59"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2420.92,-602.27 2411.7,-607.49 2422.17,-609.15 2420.92,-602.27"/>
</a>
</g>
</g>
@@ -757,9 +776,9 @@
<g id="Node000008" class="node">
<title>Node8</title>
<g id="a_Node000008"><a xlink:href="sblock__scope_8h.html" target="_top" xlink:title="Definition of two pillar data structure for TensorIR scheduling: StmtSRef, SBlockScope.">
-<polygon fill="white" stroke="#666666" points="8247.5,-569 8114.5,-569 8114.5,-539 8247.5,-539 8247.5,-569"/>
-<text text-anchor="start" x="8122.5" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/sblock</text>
-<text text-anchor="middle" x="8181" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">_scope.h</text>
+<polygon fill="white" stroke="#666666" points="1864,-569 1731,-569 1731,-539 1864,-539 1864,-569"/>
+<text text-anchor="start" x="1739" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/sblock</text>
+<text text-anchor="middle" x="1797.5" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">_scope.h</text>
</a>
</g>
</g>
@@ -767,8 +786,8 @@
<g id="edge7_Node000006_Node000008" class="edge">
<title>Node6->Node8</title>
<g id="a_edge7_Node000006_Node000008"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7765.32,-609.52C7859.56,-597.16 8023.05,-575.71 8114.39,-563.74"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7764.76,-606.06 7755.3,-610.83 7765.67,-613 7764.76,-606.06"/>
+<path fill="none" stroke="#63b8ff" d="M2277.13,-610.61C2169.44,-598.12 1968.56,-574.83 1864.24,-562.74"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2276.92,-614.11 2287.25,-611.78 2277.72,-607.15 2276.92,-614.11"/>
</a>
</g>
</g>
@@ -776,9 +795,9 @@
<g id="Node000009" class="node">
<title>Node9</title>
<g id="a_Node000009"><a xlink:href="sblock__dependence__info_8h.html" target="_top" xlink:title="Define SBlockDependenceInfoNode that uses the SBlockScope and StmtSRef objects to store the block lev...">
-<polygon fill="white" stroke="#666666" points="8088.5,-503 7955.5,-503 7955.5,-473 8088.5,-473 8088.5,-503"/>
-<text text-anchor="start" x="7963.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/sblock</text>
-<text text-anchor="middle" x="8022" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">_dependence_info.h</text>
+<polygon fill="white" stroke="#666666" points="1868,-503 1735,-503 1735,-473 1868,-473 1868,-503"/>
+<text text-anchor="start" x="1743" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/sblock</text>
+<text text-anchor="middle" x="1801.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">_dependence_info.h</text>
</a>
</g>
</g>
@@ -786,8 +805,8 @@
<g id="edge8_Node000008_Node000009" class="edge">
<title>Node8->Node9</title>
<g id="a_edge8_Node000008_Node000009"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8136.75,-535.19C8111.5,-525.02 8080.3,-512.47 8056.81,-503.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8135.52,-538.47 8146.11,-538.95 8138.14,-531.97 8135.52,-538.47"/>
+<path fill="none" stroke="#63b8ff" d="M1799.03,-528.54C1799.56,-519.96 1800.15,-510.61 1800.61,-503.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1795.52,-528.6 1798.39,-538.8 1802.5,-529.03 1795.52,-528.6"/>
</a>
</g>
</g>
@@ -795,9 +814,9 @@
<g id="Node000010" class="node">
<title>Node10</title>
<g id="a_Node000010"><a xlink:href="state_8h.html" target="_top" xlink:title="This file defines ScheduleState, the core data structure of TensorIR scheduling.">
-<polygon fill="white" stroke="#666666" points="8251.5,-503 8106.5,-503 8106.5,-473 8251.5,-473 8251.5,-503"/>
-<text text-anchor="start" x="8114.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/schedule</text>
-<text text-anchor="middle" x="8179" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/state.h</text>
+<polygon fill="white" stroke="#666666" points="2943,-503 2798,-503 2798,-473 2943,-473 2943,-503"/>
+<text text-anchor="start" x="2806" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/schedule</text>
+<text text-anchor="middle" x="2870.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/state.h</text>
</a>
</g>
</g>
@@ -805,8 +824,8 @@
<g id="edge9_Node000008_Node000010" class="edge">
<title>Node8->Node10</title>
<g id="a_edge9_Node000008_Node000010"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8180.24,-528.54C8179.97,-519.96 8179.68,-510.61 8179.44,-503.16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8176.75,-528.91 8180.56,-538.8 8183.74,-528.69 8176.75,-528.91"/>
+<path fill="none" stroke="#63b8ff" d="M1874.29,-548.42C2073.22,-536.55 2603.33,-504.94 2797.72,-493.34"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1873.99,-544.93 1864.22,-549.02 1874.41,-551.92 1873.99,-544.93"/>
</a>
</g>
</g>
@@ -814,8 +833,8 @@
<g id="Node000026" class="node">
<title>Node26</title>
<g id="a_Node000026"><a xlink:href="s__tir_2utils_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7937.5,-497.5 7806.5,-497.5 7806.5,-478.5 7937.5,-478.5 7937.5,-497.5"/>
-<text text-anchor="middle" x="7872" y="-485.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/utils.h</text>
+<polygon fill="white" stroke="#666666" points="1717,-497.5 1586,-497.5 1586,-478.5 1717,-478.5 1717,-497.5"/>
+<text text-anchor="middle" x="1651.5" y="-485.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/utils.h</text>
</a>
</g>
</g>
@@ -823,8 +842,8 @@
<g id="edge37_Node000008_Node000026" class="edge">
<title>Node8->Node26</title>
<g id="a_edge37_Node000008_Node000026"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8104.46,-537.15C8044.08,-524.64 7962.17,-507.68 7913.44,-497.58"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8103.83,-540.59 8114.33,-539.19 8105.25,-533.74 8103.83,-540.59"/>
+<path fill="none" stroke="#63b8ff" d="M1755.94,-534.78C1728.02,-522.54 1692.52,-506.98 1670.93,-497.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1754.9,-538.15 1765.46,-538.95 1757.71,-531.73 1754.9,-538.15"/>
</a>
</g>
</g>
@@ -832,9 +851,9 @@
<g id="Node000011" class="node">
<title>Node11</title>
<g id="a_Node000011"><a xlink:href="schedule_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3744.5,-437 3599.5,-437 3599.5,-407 3744.5,-407 3744.5,-437"/>
-<text text-anchor="start" x="3607.5" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/schedule</text>
-<text text-anchor="middle" x="3672" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">/schedule.h</text>
+<polygon fill="white" stroke="#666666" points="3523,-437 3378,-437 3378,-407 3523,-407 3523,-437"/>
+<text text-anchor="start" x="3386" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/schedule</text>
+<text text-anchor="middle" x="3450.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">/schedule.h</text>
</a>
</g>
</g>
@@ -842,8 +861,8 @@
<g id="edge10_Node000010_Node000011" class="edge">
<title>Node10->Node11</title>
<g id="a_edge10_Node000010_Node000011"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8096.04,-472.97C7600.2,-431.7 4280.07,-424.09 3744.79,-423.12"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8095.95,-476.47 8106.22,-473.86 8096.56,-469.5 8095.95,-476.47"/>
+<path fill="none" stroke="#63b8ff" d="M2953.12,-477.88C3066.81,-465.34 3269.66,-442.95 3377.84,-431.02"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2952.63,-474.42 2943.08,-478.99 2953.4,-481.37 2952.63,-474.42"/>
</a>
</g>
</g>
@@ -851,9 +870,9 @@
<g id="Node000012" class="node">
<title>Node12</title>
<g id="a_Node000012"><a xlink:href="cost__model_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="4099,-294 3965,-294 3965,-264 4099,-264 4099,-294"/>
-<text text-anchor="start" x="3973" y="-282" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="4032" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/cost_model.h</text>
+<polygon fill="white" stroke="#666666" points="1131.5,-294 997.5,-294 997.5,-264 1131.5,-264 1131.5,-294"/>
+<text text-anchor="start" x="1005.5" y="-282" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="1064.5" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/cost_model.h</text>
</a>
</g>
</g>
@@ -861,8 +880,8 @@
<g id="edge11_Node000011_Node000012" class="edge">
<title>Node11->Node12</title>
<g id="a_edge11_Node000011_Node000012"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3754.43,-406.52C3806.35,-396.59 3867.95,-383.07 3892,-371 3917.07,-358.41 3916.88,-345.9 3940,-330 3959.92,-316.3 3983.98,-303.34 4002.49,-294.05"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3753.69,-403.1 3744.52,-408.39 3755,-409.97 3753.69,-403.1"/>
+<path fill="none" stroke="#63b8ff" d="M3367.69,-407.56C3282.11,-393.59 3160.3,-373.41 3155.5,-371 3131.89,-359.16 3136.89,-340.11 3112.5,-330 3019.07,-291.27 1474.31,-281.89 1131.52,-280.28"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3367.24,-411.04 3377.67,-409.19 3368.37,-404.13 3367.24,-411.04"/>
</a>
</g>
</g>
@@ -870,9 +889,9 @@
<g id="Node000013" class="node">
<title>Node13</title>
<g id="a_Node000013"><a xlink:href="search__strategy_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3926,-228 3772,-228 3772,-198 3926,-198 3926,-228"/>
-<text text-anchor="start" x="3780" y="-216" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="3849" y="-205" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/search_strategy.h</text>
+<polygon fill="white" stroke="#666666" points="739.5,-228 585.5,-228 585.5,-198 739.5,-198 739.5,-228"/>
+<text text-anchor="start" x="593.5" y="-216" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="662.5" y="-205" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/search_strategy.h</text>
</a>
</g>
</g>
@@ -880,8 +899,8 @@
<g id="edge35_Node000011_Node000013" class="edge">
<title>Node11->Node13</title>
<g id="a_edge35_Node000011_Node000013"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3662.79,-397.21C3651.57,-363.79 3637.48,-302.72 3667,-264 3680.16,-246.74 3728.45,-233.95 3771.99,-225.63"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3659.5,-398.38 3666.14,-406.63 3666.09,-396.04 3659.5,-398.38"/>
+<path fill="none" stroke="#63b8ff" d="M3367.67,-410.05C3322.02,-402.36 3264.96,-389.98 3216.5,-371 3183.29,-357.99 3181.67,-340.25 3147.5,-330 2912.28,-259.45 1133.59,-222.7 739.62,-215.38"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3367.39,-413.55 3377.82,-411.72 3368.52,-406.64 3367.39,-413.55"/>
</a>
</g>
</g>
@@ -889,8 +908,8 @@
<g id="edge19_Node000011_Node000017" class="edge">
<title>Node11->Node17</title>
<g id="a_edge19_Node000011_Node000017"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3639.83,-401.72C3620.68,-390.25 3596.8,-375.95 3579.44,-365.54"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3638.15,-404.8 3648.53,-406.94 3641.75,-398.79 3638.15,-404.8"/>
+<path fill="none" stroke="#63b8ff" d="M3367.96,-407.42C3366.47,-407.27 3364.98,-407.13 3363.5,-407 2796.7,-357.67 1371.77,-398.74 803.5,-371 746.13,-368.2 681,-362.54 634.21,-358.03"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3367.64,-410.9 3377.97,-408.52 3368.41,-403.94 3367.64,-410.9"/>
</a>
</g>
</g>
@@ -898,9 +917,9 @@
<g id="Node000018" class="node">
<title>Node18</title>
<g id="a_Node000018"><a xlink:href="measure__candidate_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3849.5,-365.5 3676.5,-365.5 3676.5,-335.5 3849.5,-335.5 3849.5,-365.5"/>
-<text text-anchor="start" x="3684.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="3763" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/measure_candidate.h</text>
+<polygon fill="white" stroke="#666666" points="985,-365.5 812,-365.5 812,-335.5 985,-335.5 985,-365.5"/>
+<text text-anchor="start" x="820" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="898.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/measure_candidate.h</text>
</a>
</g>
</g>
@@ -908,8 +927,8 @@
<g id="edge21_Node000011_Node000018" class="edge">
<title>Node11->Node18</title>
<g id="a_edge21_Node000011_Node000018"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3698.68,-400.63C3713.44,-389.35 3731.42,-375.62 3744.61,-365.54"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3696.24,-398.08 3690.42,-406.94 3700.49,-403.65 3696.24,-398.08"/>
+<path fill="none" stroke="#63b8ff" d="M3367.96,-407.43C3366.46,-407.28 3364.98,-407.13 3363.5,-407 2887.39,-363.54 1365.4,-353.67 985.2,-351.86"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3367.63,-410.92 3377.96,-408.57 3368.42,-403.96 3367.63,-410.92"/>
</a>
</g>
</g>
@@ -917,9 +936,9 @@
<g id="Node000020" class="node">
<title>Node20</title>
<g id="a_Node000020"><a xlink:href="mutator_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="4109.5,-365.5 3982.5,-365.5 3982.5,-335.5 4109.5,-335.5 4109.5,-365.5"/>
-<text text-anchor="start" x="3990.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="4046" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/mutator.h</text>
+<polygon fill="white" stroke="#666666" points="3665,-365.5 3538,-365.5 3538,-335.5 3665,-335.5 3665,-365.5"/>
+<text text-anchor="start" x="3546" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="3601.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/mutator.h</text>
</a>
</g>
</g>
@@ -927,8 +946,8 @@
<g id="edge26_Node000011_Node000020" class="edge">
<title>Node11->Node20</title>
<g id="a_edge26_Node000011_Node000020"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3754.67,-407.37C3834.87,-394.1 3947.39,-375.31 3968,-371 3975.79,-369.37 3983.97,-367.5 3992,-365.58"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3753.87,-403.96 3744.57,-409.04 3755.01,-410.87 3753.87,-403.96"/>
+<path fill="none" stroke="#63b8ff" d="M3490.36,-402.65C3515.62,-391.03 3547.77,-376.23 3570.99,-365.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3488.68,-399.58 3481.06,-406.94 3491.6,-405.93 3488.68,-399.58"/>
</a>
</g>
</g>
@@ -936,9 +955,9 @@
<g id="Node000021" class="node">
<title>Node21</title>
<g id="a_Node000021"><a xlink:href="space__generator_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="6635,-294 6477,-294 6477,-264 6635,-264 6635,-294"/>
-<text text-anchor="start" x="6485" y="-282" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="6556" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/space_generator.h</text>
+<polygon fill="white" stroke="#666666" points="3355.5,-294 3197.5,-294 3197.5,-264 3355.5,-264 3355.5,-294"/>
+<text text-anchor="start" x="3205.5" y="-282" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="3276.5" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/space_generator.h</text>
</a>
</g>
</g>
@@ -946,8 +965,8 @@
<g id="edge36_Node000011_Node000021" class="edge">
<title>Node11->Node21</title>
<g id="a_edge36_Node000011_Node000021"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3754.96,-405.49C3828.87,-391.59 3926,-373.06 3930,-371 3953.46,-358.89 3948.58,-340.05 3973,-330 4091.43,-281.25 6055.24,-279.69 6476.74,-279.92"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3753.88,-402.13 3744.7,-407.42 3755.17,-409.01 3753.88,-402.13"/>
+<path fill="none" stroke="#63b8ff" d="M3367.73,-407.56C3308.09,-397.04 3236.57,-382.33 3227.5,-371 3216.11,-356.78 3220.61,-346.87 3227.5,-330 3233.38,-315.6 3245.63,-303.1 3256.41,-294.2"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3367.49,-411.07 3377.95,-409.35 3368.7,-404.18 3367.49,-411.07"/>
</a>
</g>
</g>
@@ -955,9 +974,9 @@
<g id="Node000022" class="node">
<title>Node22</title>
<g id="a_Node000022"><a xlink:href="postproc_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="6442.5,-365.5 6315.5,-365.5 6315.5,-335.5 6442.5,-335.5 6442.5,-365.5"/>
-<text text-anchor="start" x="6323.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="6379" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/postproc.h</text>
+<polygon fill="white" stroke="#666666" points="3363,-365.5 3236,-365.5 3236,-335.5 3363,-335.5 3363,-365.5"/>
+<text text-anchor="start" x="3244" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="3299.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/postproc.h</text>
</a>
</g>
</g>
@@ -965,8 +984,8 @@
<g id="edge29_Node000011_Node000022" class="edge">
<title>Node11->Node22</title>
<g id="a_edge29_Node000011_Node000022"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3755,-418.87C4163.36,-408.38 5953.91,-362.41 6315.29,-353.14"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3754.66,-415.38 3744.76,-419.13 3754.84,-422.37 3754.66,-415.38"/>
+<path fill="none" stroke="#63b8ff" d="M3410.64,-402.65C3385.38,-391.03 3353.23,-376.23 3330.01,-365.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3409.4,-405.93 3419.94,-406.94 3412.32,-399.58 3409.4,-405.93"/>
</a>
</g>
</g>
@@ -974,10 +993,10 @@
<g id="Node000023" class="node">
<title>Node23</title>
<g id="a_Node000023"><a xlink:href="thread__bind_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3305,-371 3167,-371 3167,-330 3305,-330 3305,-371"/>
-<text text-anchor="start" x="3175" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="start" x="3175" y="-348" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/schedule/cuda</text>
-<text text-anchor="middle" x="3236" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00">/thread_bind.h</text>
+<polygon fill="white" stroke="#666666" points="3519.5,-371 3381.5,-371 3381.5,-330 3519.5,-330 3519.5,-371"/>
+<text text-anchor="start" x="3389.5" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="start" x="3389.5" y="-348" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/schedule/cuda</text>
+<text text-anchor="middle" x="3450.5" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00">/thread_bind.h</text>
</a>
</g>
</g>
@@ -985,8 +1004,8 @@
<g id="edge31_Node000011_Node000023" class="edge">
<title>Node11->Node23</title>
<g id="a_edge31_Node000011_Node000023"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3589.25,-411.97C3516.43,-403.42 3407.7,-389.2 3314,-371 3311.12,-370.44 3308.19,-369.84 3305.24,-369.21"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3588.95,-415.46 3599.29,-413.14 3589.76,-408.51 3588.95,-415.46"/>
+<path fill="none" stroke="#63b8ff" d="M3450.5,-396.91C3450.5,-388.47 3450.5,-379.1 3450.5,-371.07"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3447,-396.94 3450.5,-406.94 3454,-396.94 3447,-396.94"/>
</a>
</g>
</g>
@@ -994,10 +1013,10 @@
<g id="Node000024" class="node">
<title>Node24</title>
<g id="a_Node000024"><a xlink:href="winograd_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3474.5,-371 3323.5,-371 3323.5,-330 3474.5,-330 3474.5,-371"/>
-<text text-anchor="start" x="3331.5" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="start" x="3331.5" y="-348" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/schedule/generic</text>
-<text text-anchor="middle" x="3399" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00">/winograd.h</text>
+<polygon fill="white" stroke="#666666" points="3834,-371 3683,-371 3683,-330 3834,-330 3834,-371"/>
+<text text-anchor="start" x="3691" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="start" x="3691" y="-348" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/schedule/generic</text>
+<text text-anchor="middle" x="3758.5" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00">/winograd.h</text>
</a>
</g>
</g>
@@ -1005,8 +1024,8 @@
<g id="edge32_Node000011_Node000024" class="edge">
<title>Node11->Node24</title>
<g id="a_edge32_Node000011_Node000024"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3606.9,-404.43C3567.14,-394.31 3516.14,-381.32 3474.6,-370.74"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3606.2,-407.86 3616.75,-406.94 3607.93,-401.08 3606.2,-407.86"/>
+<path fill="none" stroke="#63b8ff" d="M3524.23,-404.71C3567.93,-395.01 3624.4,-382.41 3674.5,-371 3677.27,-370.37 3680.1,-369.72 3682.95,-369.07"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3523.26,-401.34 3514.26,-406.92 3524.78,-408.17 3523.26,-401.34"/>
</a>
</g>
</g>
@@ -1014,8 +1033,8 @@
<g id="edge33_Node000011_Node000025" class="edge">
<title>Node11->Node25</title>
<g id="a_edge33_Node000011_Node000025"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3754.83,-419.76C4209.43,-412.91 6383.41,-379.77 6452,-371 6461.76,-369.75 6472.04,-367.79 6481.89,-365.59"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3754.68,-416.26 3744.73,-419.91 3754.78,-423.26 3754.68,-416.26"/>
+<path fill="none" stroke="#63b8ff" d="M3367.93,-407.68C3366.44,-407.45 3364.96,-407.23 3363.5,-407 3254.28,-390.22 3226.15,-391.1 3117.5,-371 3108.67,-369.37 3099.38,-367.47 3090.28,-365.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3367.46,-411.15 3377.88,-409.23 3368.54,-404.24 3367.46,-411.15"/>
</a>
</g>
</g>
@@ -1023,8 +1042,8 @@
<g id="edge12_Node000012_Node000013" class="edge">
<title>Node12->Node13</title>
<g id="a_edge12_Node000012_Node000013"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3982.22,-260.59C3952.96,-250.36 3916.46,-237.59 3889.07,-228.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3981.25,-263.96 3991.84,-263.95 3983.56,-257.35 3981.25,-263.96"/>
+<path fill="none" stroke="#63b8ff" d="M987.47,-263.85C896.69,-248.63 803.47,-234.56 739.67,-225.17"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="986.94,-267.31 997.38,-265.52 988.1,-260.41 986.94,-267.31"/>
</a>
</g>
</g>
@@ -1032,9 +1051,9 @@
<g id="Node000015" class="node">
<title>Node15</title>
<g id="a_Node000015"><a xlink:href="task__scheduler_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="5704,-30 5554,-30 5554,0 5704,0 5704,-30"/>
-<text text-anchor="start" x="5562" y="-18" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="5629" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/task_scheduler.h</text>
+<polygon fill="white" stroke="#666666" points="636.5,-30 486.5,-30 486.5,0 636.5,0 636.5,-30"/>
+<text text-anchor="start" x="494.5" y="-18" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="561.5" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/task_scheduler.h</text>
</a>
</g>
</g>
@@ -1042,8 +1061,8 @@
<g id="edge18_Node000012_Node000015" class="edge">
<title>Node12->Node15</title>
<g id="a_edge18_Node000012_Node000015"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3954.76,-274.34C3884.1,-269.17 3787.02,-256.9 3763,-228 3754.48,-217.75 3756.04,-209.37 3763,-198 3796.6,-143.06 3829.93,-149.17 3892,-132 4212.07,-43.49 5262.55,-21.46 5553.63,-16.99"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3954.76,-277.85 3964.98,-275.05 3955.25,-270.86 3954.76,-277.85"/>
+<path fill="none" stroke="#63b8ff" d="M1028.44,-259.22C932.66,-209.33 673.38,-74.28 588.68,-30.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1026.97,-262.4 1037.46,-263.91 1030.2,-256.19 1026.97,-262.4"/>
</a>
</g>
</g>
@@ -1051,9 +1070,9 @@
<g id="Node000014" class="node">
<title>Node14</title>
<g id="a_Node000014"><a xlink:href="measure__callback_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="5601,-96 5435,-96 5435,-66 5601,-66 5601,-96"/>
-<text text-anchor="start" x="5443" y="-84" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="5518" y="-73" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/measure_callback.h</text>
+<polygon fill="white" stroke="#666666" points="533.5,-96 367.5,-96 367.5,-66 533.5,-66 533.5,-96"/>
+<text text-anchor="start" x="375.5" y="-84" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="450.5" y="-73" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/measure_callback.h</text>
</a>
</g>
</g>
@@ -1061,8 +1080,8 @@
<g id="edge13_Node000013_Node000014" class="edge">
<title>Node13->Node14</title>
<g id="a_edge13_Node000013_Node000014"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3866.2,-190.02C3882.76,-170.74 3909.7,-143.98 3940,-132 4009.92,-104.36 5119.41,-87.37 5434.91,-83.08"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3863.46,-187.83 3859.76,-197.76 3868.84,-192.31 3863.46,-187.83"/>
+<path fill="none" stroke="#63b8ff" d="M660.01,-187.73C656.92,-169.93 650,-146.43 634.5,-132 607.37,-106.74 568.76,-94.01 533.9,-87.68"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="656.56,-188.3 661.45,-197.7 663.49,-187.3 656.56,-188.3"/>
</a>
</g>
</g>
@@ -1070,8 +1089,8 @@
<g id="edge15_Node000013_Node000016" class="edge">
<title>Node13->Node16</title>
<g id="a_edge15_Node000013_Node000016"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3936.28,-210.27C4402.42,-201.06 6593.13,-157.76 7016.18,-149.4"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3936.17,-206.78 3926.24,-210.47 3936.31,-213.77 3936.17,-206.78"/>
+<path fill="none" stroke="#63b8ff" d="M630.22,-192.69C613.71,-182.82 593.97,-171.01 578.93,-162.01"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="628.64,-195.83 639.02,-197.95 632.23,-189.82 628.64,-195.83"/>
</a>
</g>
</g>
@@ -1079,8 +1098,8 @@
<g id="edge14_Node000014_Node000015" class="edge">
<title>Node14->Node15</title>
<g id="a_edge14_Node000014_Node000015"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M5551.48,-60.69C5568.62,-50.82 5589.09,-39.01 5604.7,-30.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="5549.27,-57.93 5542.36,-65.95 5552.77,-63.99 5549.27,-57.93"/>
+<path fill="none" stroke="#63b8ff" d="M483.98,-60.69C501.12,-50.82 521.59,-39.01 537.2,-30.01"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="481.77,-57.93 474.86,-65.95 485.27,-63.99 481.77,-57.93"/>
</a>
</g>
</g>
@@ -1088,8 +1107,8 @@
<g id="edge16_Node000016_Node000014" class="edge">
<title>Node16->Node14</title>
<g id="a_edge16_Node000016_Node000014"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7006.2,-142.7C6737.22,-131.73 5873.74,-96.51 5601.23,-85.39"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7006.14,-146.2 7016.28,-143.12 7006.43,-139.21 7006.14,-146.2"/>
+<path fill="none" stroke="#63b8ff" d="M523.83,-126.69C507.62,-116.82 488.25,-105.01 473.49,-96.01"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="522.1,-129.74 532.46,-131.95 525.74,-123.76 522.1,-129.74"/>
</a>
</g>
</g>
@@ -1097,8 +1116,8 @@
<g id="edge17_Node000016_Node000015" class="edge">
<title>Node16->Node15</title>
<g id="a_edge17_Node000016_Node000015"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7047.49,-127.92C7003.16,-108.6 6928.58,-79.03 6861,-66 6637.67,-22.96 5936.22,-16.92 5704.28,-16.11"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7046.18,-131.16 7056.74,-131.99 7049,-124.76 7046.18,-131.16"/>
+<path fill="none" stroke="#63b8ff" d="M556.62,-121.68C557.87,-94.7 559.83,-52.11 560.85,-30.14"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="553.12,-121.69 556.15,-131.84 560.11,-122.01 553.12,-121.69"/>
</a>
</g>
</g>
@@ -1106,8 +1125,8 @@
<g id="edge20_Node000017_Node000013" class="edge">
<title>Node17->Node13</title>
<g id="a_edge20_Node000017_Node000013"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3570.7,-326.85C3584.65,-307.22 3607.39,-279.59 3634,-264 3675.91,-239.45 3729.03,-226.95 3771.98,-220.59"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3567.72,-325.01 3564.93,-335.23 3573.49,-328.98 3567.72,-325.01"/>
+<path fill="none" stroke="#63b8ff" d="M585.89,-326.83C605.01,-298.67 637.06,-251.47 652.96,-228.05"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="582.89,-325.02 580.17,-335.26 588.68,-328.95 582.89,-325.02"/>
</a>
</g>
</g>
@@ -1115,8 +1134,8 @@
<g id="edge22_Node000018_Node000012" class="edge">
<title>Node18->Node12</title>
<g id="a_edge22_Node000018_Node000012"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3827.28,-332.89C3873.16,-321.04 3934.19,-305.27 3977.64,-294.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3826.24,-329.55 3817.44,-335.44 3827.99,-336.32 3826.24,-329.55"/>
+<path fill="none" stroke="#63b8ff" d="M941.59,-331.46C969.46,-319.79 1005.21,-304.82 1030.96,-294.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="939.97,-328.35 932.09,-335.44 942.67,-334.8 939.97,-328.35"/>
</a>
</g>
</g>
@@ -1124,8 +1143,8 @@
<g id="edge25_Node000018_Node000013" class="edge">
<title>Node18->Node13</title>
<g id="a_edge25_Node000018_Node000013"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3806.89,-330.59C3821.96,-321.77 3837.24,-309.69 3846,-294 3857.52,-273.37 3855.06,-244.86 3852.11,-228.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3805.17,-327.54 3798.08,-335.42 3808.54,-333.68 3805.17,-327.54"/>
+<path fill="none" stroke="#63b8ff" d="M866.31,-329.87C849.31,-319.39 828.16,-306.17 809.5,-294 789.68,-281.07 785.98,-275.87 765.5,-264 742.45,-250.65 715.31,-237.57 694.68,-228.14"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="864.93,-333.13 875.29,-335.38 868.6,-327.16 864.93,-333.13"/>
</a>
</g>
</g>
@@ -1133,8 +1152,8 @@
<g id="edge24_Node000018_Node000014" class="edge">
<title>Node18->Node14</title>
<g id="a_edge24_Node000018_Node000014"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3797.02,-330.64C3834.69,-310.67 3897.82,-279.88 3956,-264 4506.13,-113.81 5198.4,-87.55 5434.62,-82.96"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3795.17,-327.67 3788,-335.47 3798.47,-333.84 3795.17,-327.67"/>
+<path fill="none" stroke="#63b8ff" d="M842.1,-332.37C776.55,-311.51 665.94,-273.41 576.5,-228 528.69,-203.72 507.84,-204.77 475.5,-162 460.49,-142.15 454.38,-113.13 451.97,-96.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="841.24,-335.76 851.83,-335.44 843.35,-329.09 841.24,-335.76"/>
</a>
</g>
</g>
@@ -1142,9 +1161,9 @@
<g id="Node000019" class="node">
<title>Node19</title>
<g id="a_Node000019"><a xlink:href="feature__extractor_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="3837.5,-294 3676.5,-294 3676.5,-264 3837.5,-264 3837.5,-294"/>
-<text text-anchor="start" x="3684.5" y="-282" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="3757" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/feature_extractor.h</text>
+<polygon fill="white" stroke="#666666" points="979,-294 818,-294 818,-264 979,-264 979,-294"/>
+<text text-anchor="start" x="826" y="-282" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="898.5" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/feature_extractor.h</text>
</a>
</g>
</g>
@@ -1152,8 +1171,8 @@
<g id="edge23_Node000018_Node000019" class="edge">
<title>Node18->Node19</title>
<g id="a_edge23_Node000018_Node000019"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M3760.91,-325.25C3760.01,-314.81 3758.98,-302.99 3758.21,-294.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="3757.44,-325.77 3761.79,-335.44 3764.41,-325.17 3757.44,-325.77"/>
+<path fill="none" stroke="#63b8ff" d="M898.5,-325.25C898.5,-314.81 898.5,-302.99 898.5,-294.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="895,-325.44 898.5,-335.44 902,-325.44 895,-325.44"/>
</a>
</g>
</g>
@@ -1161,8 +1180,8 @@
<g id="edge27_Node000020_Node000021" class="edge">
<title>Node20->Node21</title>
<g id="a_edge27_Node000020_Node000021"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M4119.81,-347.46C4485.41,-337.33 6099.74,-292.63 6476.97,-282.19"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="4119.52,-343.96 4109.62,-347.74 4119.71,-350.96 4119.52,-343.96"/>
+<path fill="none" stroke="#63b8ff" d="M3540.83,-332.97C3536.66,-331.94 3532.52,-330.94 3528.5,-330 3470.29,-316.46 3403.97,-303.4 3353.98,-294.02"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3540,-336.37 3550.55,-335.44 3541.72,-329.59 3540,-336.37"/>
</a>
</g>
</g>
@@ -1170,8 +1189,8 @@
<g id="edge28_Node000021_Node000016" class="edge">
<title>Node21->Node16</title>
<g id="a_edge28_Node000021_Node000016"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6623.21,-261.54C6728.51,-235.77 6930.54,-186.3 7029.51,-162.08"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6622.21,-258.19 6613.33,-263.96 6623.88,-264.99 6622.21,-258.19"/>
+<path fill="none" stroke="#63b8ff" d="M3187.17,-263.07C3069.09,-244.07 2854.36,-212.02 2669.5,-198 2259.05,-166.88 945.54,-151.91 626.05,-148.68"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3186.82,-266.56 3197.25,-264.7 3187.94,-259.65 3186.82,-266.56"/>
</a>
</g>
</g>
@@ -1179,8 +1198,8 @@
<g id="edge30_Node000022_Node000021" class="edge">
<title>Node22->Node21</title>
<g id="a_edge30_Node000022_Node000021"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6424.17,-331.76C6454,-320.05 6492.54,-304.92 6520.23,-294.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6422.85,-328.52 6414.82,-335.44 6425.41,-335.04 6422.85,-328.52"/>
+<path fill="none" stroke="#63b8ff" d="M3291.69,-325.9C3288.19,-315.31 3284.17,-303.18 3281.15,-294.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3288.38,-327.04 3294.85,-335.44 3295.03,-324.84 3288.38,-327.04"/>
</a>
</g>
</g>
@@ -1188,8 +1207,8 @@
<g id="edge34_Node000025_Node000021" class="edge">
<title>Node25->Node21</title>
<g id="a_edge34_Node000025_Node000021"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6540.81,-325.9C6544.31,-315.31 6548.33,-303.18 6551.35,-294.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6537.47,-324.84 6537.65,-335.44 6544.12,-327.04 6537.47,-324.84"/>
+<path fill="none" stroke="#63b8ff" d="M3090.08,-332.67C3131.94,-320.84 3187.3,-305.2 3226.79,-294.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3088.95,-329.35 3080.28,-335.44 3090.86,-336.08 3088.95,-329.35"/>
</a>
</g>
</g>
@@ -1197,71 +1216,71 @@
<g id="edge40_Node000027_Node000028" class="edge">
<title>Node27->Node28</title>
<g id="a_edge40_Node000027_Node000028"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9243.69,-1206.85C9083.98,-1194.31 8723.17,-1165.98 8573.75,-1154.24"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9243.67,-1210.36 9253.92,-1207.65 9244.22,-1203.38 9243.67,-1210.36"/>
+<path fill="none" stroke="#63b8ff" d="M2610.24,-1206.42C2460.22,-1193.8 2134.63,-1166.42 1994.19,-1154.61"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2610.04,-1209.91 2620.3,-1207.26 2610.63,-1202.94 2610.04,-1209.91"/>
</a>
</g>
</g>
<!-- Node27->Node56 -->
-<g id="edge275_Node000027_Node000056" class="edge">
+<g id="edge274_Node000027_Node000056" class="edge">
<title>Node27->Node56</title>
-<g id="a_edge275_Node000027_Node000056"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9381.35,-1202.77C9388.97,-1201.49 9396.67,-1200.2 9404,-1199 9505.67,-1182.33 9543.14,-1213.4 9633,-1163 9660.82,-1147.4 9682.38,-1115.74 9693.24,-1097.27"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9380.69,-1199.33 9371.41,-1204.46 9381.86,-1206.24 9380.69,-1199.33"/>
+<g id="a_edge274_Node000027_Node000056"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2693.72,-1194.67C2701.19,-1168.43 2714.76,-1120.72 2721.5,-1097.07"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2690.3,-1193.89 2690.93,-1204.47 2697.03,-1195.81 2690.3,-1193.89"/>
</a>
</g>
</g>
<!-- Node27->Node57 -->
-<g id="edge276_Node000027_Node000057" class="edge">
+<g id="edge275_Node000027_Node000057" class="edge">
<title>Node27->Node57</title>
-<g id="a_edge276_Node000027_Node000057"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9400.12,-1203.32C9493.35,-1191.5 9639.77,-1171.97 9664,-1163 9752.1,-1130.4 9842.11,-1060.89 9878.37,-1031.07"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9399.63,-1199.86 9390.15,-1204.58 9400.51,-1206.8 9399.63,-1199.86"/>
+<g id="a_edge275_Node000027_Node000057"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2706.36,-1197.48C2728.96,-1176.84 2767.49,-1138.12 2788.5,-1097 2799.41,-1075.64 2804.18,-1047.86 2806.18,-1031.29"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2703.92,-1194.97 2698.81,-1204.24 2708.59,-1200.18 2703.92,-1194.97"/>
</a>
</g>
</g>
-<!-- Node69 -->
-<g id="Node000069" class="node">
-<title>Node69</title>
-<g id="a_Node000069"><a xlink:href="tirx_2function_8h.html" target="_top" xlink:title="TIR Function.">
-<polygon fill="white" stroke="#666666" points="7985,-761.5 7839,-761.5 7839,-742.5 7985,-742.5 7985,-761.5"/>
-<text text-anchor="middle" x="7912" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/function.h</text>
+<!-- Node68 -->
+<g id="Node000068" class="node">
+<title>Node68</title>
+<g id="a_Node000068"><a xlink:href="tirx_2function_8h.html" target="_top" xlink:title="TIR Function.">
+<polygon fill="white" stroke="#666666" points="2092.5,-761.5 1946.5,-761.5 1946.5,-742.5 2092.5,-742.5 2092.5,-761.5"/>
+<text text-anchor="middle" x="2019.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/function.h</text>
</a>
</g>
</g>
-<!-- Node27->Node69 -->
-<g id="edge305_Node000027_Node000069" class="edge">
-<title>Node27->Node69</title>
-<g id="a_edge305_Node000027_Node000069"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9345.39,-1198.87C9395.73,-1166.52 9506.95,-1083.5 9471,-1001 9458.09,-971.38 9287.85,-815.38 9258,-803 9198.93,-778.51 8258.02,-759.37 7985.45,-754.31"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9343.35,-1196.02 9336.75,-1204.31 9347.08,-1201.94 9343.35,-1196.02"/>
+<!-- Node27->Node68 -->
+<g id="edge304_Node000027_Node000068" class="edge">
+<title>Node27->Node68</title>
+<g id="a_edge304_Node000027_Node000068"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2673.83,-1196.69C2648.44,-1168.84 2594.17,-1110.86 2543.5,-1067 2469.03,-1002.54 2448.89,-987.41 2365.5,-935 2245.4,-859.51 2090.79,-785.97 2038.06,-761.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2671.43,-1199.26 2680.74,-1204.32 2676.62,-1194.56 2671.43,-1199.26"/>
</a>
</g>
</g>
-<!-- Node27->Node73 -->
-<g id="edge268_Node000027_Node000073" class="edge">
-<title>Node27->Node73</title>
-<g id="a_edge268_Node000027_Node000073"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9298.28,-1199.26C9251.21,-1171.32 9143.98,-1104.28 9068,-1031 9041.32,-1005.27 9030.37,-999.58 9017,-965 8990.95,-897.63 9056.32,-852.8 9004,-803 8956.73,-758.01 7895.09,-771.61 7830,-767 7709.56,-758.48 7680.45,-745.37 7560,-737 6893.08,-690.67 6082.85,-686.93 5846.63,-686.89"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9296.73,-1202.41 9307.13,-1204.47 9300.29,-1196.38 9296.73,-1202.41"/>
+<!-- Node27->Node72 -->
+<g id="edge267_Node000027_Node000072" class="edge">
+<title>Node27->Node72</title>
+<g id="a_edge267_Node000027_Node000072"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2766.81,-1213.21C3224.06,-1214.06 5538.76,-1212.57 5831.5,-1097 5966.65,-1043.65 6063.09,-918.17 5974.5,-803 5929.69,-744.75 5716.63,-709.65 5605.43,-695"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2766.68,-1209.71 2756.67,-1213.2 2766.66,-1216.71 2766.68,-1209.71"/>
</a>
</g>
</g>
-<!-- Node27->Node129 -->
-<g id="edge269_Node000027_Node000129" class="edge">
-<title>Node27->Node129</title>
-<g id="a_edge269_Node000027_Node000129"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9398.95,-1203.29C9411.65,-1201.79 9424.69,-1200.3 9437,-1199 9622.38,-1179.4 9843,-1161.08 9941.73,-1153.14"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9398.36,-1199.84 9388.85,-1204.5 9399.2,-1206.79 9398.36,-1199.84"/>
+<!-- Node27->Node128 -->
+<g id="edge268_Node000027_Node000128" class="edge">
+<title>Node27->Node128</title>
+<g id="a_edge268_Node000027_Node000128"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2657.04,-1200.65C2629.68,-1189.9 2590.05,-1174.35 2561.45,-1163.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2655.93,-1203.97 2666.52,-1204.37 2658.49,-1197.46 2655.93,-1203.97"/>
</a>
</g>
</g>
-<!-- Node27->Node130 -->
-<g id="edge277_Node000027_Node000130" class="edge">
-<title>Node27->Node130</title>
-<g id="a_edge277_Node000027_Node000130"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9314.12,-1195.02C9302.64,-1168.86 9281.58,-1120.82 9271.17,-1097.07"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9311.04,-1196.72 9318.26,-1204.47 9317.45,-1193.91 9311.04,-1196.72"/>
+<!-- Node27->Node129 -->
+<g id="edge276_Node000027_Node000129" class="edge">
+<title>Node27->Node129</title>
+<g id="a_edge276_Node000027_Node000129"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2610.09,-1209.32C2461.96,-1202.13 2130.82,-1185.01 1852.5,-1163 1565.84,-1140.33 1223.29,-1103.39 1093.19,-1089"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2610.28,-1212.83 2620.44,-1209.82 2610.62,-1205.84 2610.28,-1212.83"/>
</a>
</g>
</g>
@@ -1269,8 +1288,8 @@
<g id="edge91_Node000028_Node000008" class="edge">
<title>Node28->Node8</title>
<g id="a_edge91_Node000028_Node000008"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8574.7,-1136.7C8619.18,-1128.72 8678.15,-1115.82 8728,-1097 8785.31,-1075.37 8795.52,-1060.86 8849,-1031 8853.69,-1028.38 9012.11,-937.23 9017,-935 9061.13,-914.89 9074.48,-915.73 9120,-899 9277.86,-840.97 9524.55,-893.13 9462,-737 9429.22,-655.18 9396.73,-635.4 9314,-605 9288.85,-595.76 8486.76,-566.06 8247.64,-557.4"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8573.83,-1133.3 8564.58,-1138.47 8575.04,-1140.19 8573.83,-1133.3"/>
+<path fill="none" stroke="#63b8ff" d="M1850.34,-1146.57C1611.97,-1144.82 889.54,-1136.33 658.5,-1097 543.91,-1077.49 409.5,-1133.24 409.5,-1017 409.5,-1017 409.5,-1017 409.5,-751 409.5,-571.32 610.74,-642.35 786.5,-605 945.15,-571.28 1353.5,-577.02 1515.5,-569 1589.18,-565.35 1673.69,-561.15 1730.84,-558.31"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.62,-1150.07 1860.64,-1146.64 1850.67,-1143.07 1850.62,-1150.07"/>
</a>
</g>
</g>
@@ -1278,8 +1297,8 @@
<g id="edge92_Node000028_Node000010" class="edge">
<title>Node28->Node10</title>
<g id="a_edge92_Node000028_Node000010"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8487.14,-1132.15C8476.25,-1123.08 8463.32,-1110.63 8455,-1097 8435.65,-1065.32 8431,-1054.12 8431,-1017 8431,-1017 8431,-1017 8431,-883 8431,-845.88 8426,-826.18 8455,-803 8545.13,-730.95 8889.34,-846.48 8973,-767 9025.37,-717.25 9029.99,-662.29 8986,-605 8916.8,-514.88 8850.89,-558.79 8739,-539 8565.75,-508.35 8358.85,-496.08 8251.57,-491.49"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8484.95,-1134.89 8494.95,-1138.39 8489.32,-1129.42 8484.95,-1134.89"/>
+<path fill="none" stroke="#63b8ff" d="M2004.48,-1144.1C2319.97,-1131.87 3500.26,-1082.82 3559.5,-1031 3587.01,-1006.94 3578.5,-987.54 3578.5,-951 3578.5,-951 3578.5,-951 3578.5,-883 3578.5,-798.63 3620.37,-784.5 3632.5,-701 3639.09,-655.59 3632.75,-630.35 3594.5,-605 3539.82,-568.76 3366.34,-578.99 3301.5,-569 3172.88,-549.18 3023.78,-520.14 2938.95,-503.05"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2003.92,-1140.62 1994.07,-1144.5 2004.19,-1147.61 2003.92,-1140.62"/>
</a>
</g>
</g>
@@ -1287,8 +1306,8 @@
<g id="edge90_Node000028_Node000016" class="edge">
<title>Node28->Node16</title>
<g id="a_edge90_Node000028_Node000016"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8584.09,-1138.95C8650.21,-1131.13 8747.7,-1117.43 8831,-1097 8897.34,-1080.73 9353.45,-932.46 9413,-899 9452.89,-876.59 9456.93,-862.38 9492,-833 9565.64,-771.32 9823,-651.06 9823,-555 9823,-555 9823,-555 9823,-278 9823,-209.21 7586.84,-158.55 7157.73,-149.46"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8583.28,-1135.52 8573.75,-1140.15 8584.09,-1142.47 8583.28,-1135.52"/>
+<path fill="none" stroke="#63b8ff" d="M1850.45,-1146.92C1538.04,-1146.28 379.29,-1140.97 315.5,-1097 60.47,-921.21 119.89,-700.96 217.5,-407 250.07,-308.91 238.02,-261.6 319.5,-198 332.6,-187.77 420.21,-171 484.88,-159.74"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.76,-1150.42 1860.76,-1146.94 1850.77,-1143.42 1850.76,-1150.42"/>
</a>
</g>
</g>
@@ -1296,8 +1315,8 @@
<g id="edge86_Node000028_Node000017" class="edge">
<title>Node28->Node17</title>
<g id="a_edge86_Node000028_Node000017"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8498.33,-1129.29C8487.11,-1104.7 8469,-1058.56 8469,-1017 8469,-1017 8469,-1017 8469,-883 8469,-597.39 9081,-972.61 9081,-687 9081,-687 9081,-687 9081,-619 9081,-513.7 8960.26,-564.11 8858,-539 8649.73,-487.85 8593.77,-490.14 8380,-473 8205.29,-458.99 6974.37,-473.76 6803,-437 6769.51,-429.82 6765.53,-414 6732,-407 6398.61,-337.41 4006.11,-402.57 3667,-371 3651.61,-369.57 3635.15,-367.16 3619.74,-364.52"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8495.21,-1130.88 8502.64,-1138.43 8501.54,-1127.89 8495.21,-1130.88"/>
+<path fill="none" stroke="#63b8ff" d="M1850.96,-1147.3C1560.17,-1148.08 533.46,-1147.19 396.5,-1097 342.73,-1077.3 295.5,-1074.26 295.5,-1017 295.5,-1017 295.5,-1017 295.5,-883 295.5,-653.39 500.44,-424.11 556.48,-365.71"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1851,-1150.8 1860.99,-1147.28 1850.98,-1143.8 1851,-1150.8"/>
</a>
</g>
</g>
@@ -1305,8 +1324,8 @@
<g id="edge89_Node000028_Node000021" class="edge">
<title>Node28->Node21</title>
<g id="a_edge89_Node000028_Node000021"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8581.66,-1136.94C8635.27,-1128.75 8708.9,-1115.5 8772,-1097 8956.45,-1042.92 8993,-1002.43 9173,-935 9302.91,-886.34 9377.69,-938.31 9468,-833 9578.26,-704.43 9491.77,-553.95 9343,-473 9250.75,-422.81 7557.65,-445.81 7453,-437 7363.43,-429.46 7342.12,-418.69 7253,-407 7111.1,-388.38 7070.69,-410.03 6933,-371 6891.87,-359.34 6886.77,-342.86 6846,-330 6776.45,-308.06 6694.29,-295.04 6635.21,-287.82"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8580.92,-1133.52 8571.56,-1138.46 8581.97,-1140.44 8580.92,-1133.52"/>
+<path fill="none" stroke="#63b8ff" d="M2004.3,-1142.88C2072.52,-1137.47 2174.2,-1125.1 2258.5,-1097 2434.69,-1038.26 2474.47,-1005.68 2626.5,-899 2648.59,-883.5 2783.45,-749.25 2807.5,-737 2875.15,-702.53 2926.8,-760.08 2974.5,-701 2982.88,-690.63 2979.9,-683.19 2974.5,-671 2929.54,-569.44 2834.46,-604.56 2789.5,-503 2784.1,-490.81 2784.05,-485.17 2789.5,-473 2828.45,-385.94 2863.23,-370.67 2949.5,-330 2992.23,-309.86 3115.06,-294.96 3197.41,-286.88"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2003.77,-1139.41 1994.06,-1143.66 2004.3,-1146.39 2003.77,-1139.41"/>
</a>
</g>
</g>
@@ -1314,8 +1333,8 @@
<g id="Node000029" class="node">
<title>Node29</title>
<g id="a_Node000029"><a xlink:href="ir_2transform_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="9453,-761.5 9309,-761.5 9309,-742.5 9453,-742.5 9453,-761.5"/>
-<text text-anchor="middle" x="9381" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/transform.h</text>
+<polygon fill="white" stroke="#666666" points="1113.5,-761.5 969.5,-761.5 969.5,-742.5 1113.5,-742.5 1113.5,-761.5"/>
+<text text-anchor="middle" x="1041.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/ir/transform.h</text>
</a>
</g>
</g>
@@ -1323,8 +1342,8 @@
<g id="edge41_Node000028_Node000029" class="edge">
<title>Node28->Node29</title>
<g id="a_edge41_Node000028_Node000029"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8556.38,-1136.11C8592.22,-1127.46 8641.49,-1114 8683,-1097 8821.78,-1040.15 8843.36,-998.96 8979,-935 9089.4,-882.94 9123.53,-884.93 9234,-833 9283.96,-809.51 9340.73,-776.82 9366.69,-761.53"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8555.57,-1132.71 8546.65,-1138.43 8557.18,-1139.52 8555.57,-1132.71"/>
+<path fill="none" stroke="#63b8ff" d="M1850.51,-1144.31C1546.68,-1133.21 447.5,-1088.13 447.5,-1017 447.5,-1017 447.5,-1017 447.5,-949 447.5,-840.27 810.96,-781.71 969.26,-761.37"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.43,-1147.81 1860.55,-1144.68 1850.68,-1140.82 1850.43,-1147.81"/>
</a>
</g>
</g>
@@ -1332,8 +1351,8 @@
<g id="Node000034" class="node">
<title>Node34</title>
<g id="a_Node000034"><a xlink:href="s__tir_2analysis_8h.html" target="_top" xlink:title="Analysis utilities for Schedulable TensorIR (S-TIR).">
-<polygon fill="white" stroke="#666666" points="8582.5,-629.5 8431.5,-629.5 8431.5,-610.5 8582.5,-610.5 8582.5,-629.5"/>
-<text text-anchor="middle" x="8507" y="-617.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/analysis.h</text>
+<polygon fill="white" stroke="#666666" points="1271,-629.5 1120,-629.5 1120,-610.5 1271,-610.5 1271,-629.5"/>
+<text text-anchor="middle" x="1195.5" y="-617.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/analysis.h</text>
</a>
</g>
</g>
@@ -1341,8 +1360,8 @@
<g id="edge70_Node000028_Node000034" class="edge">
<title>Node28->Node34</title>
<g id="a_edge70_Node000028_Node000034"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8434.01,-1136.44C8367.31,-1122.18 8279,-1089.6 8279,-1017 8279,-1017 8279,-1017 8279,-949 8279,-870.35 8314.83,-848.48 8379,-803 8521.32,-702.13 8651.89,-839.45 8758,-701 8766.11,-690.42 8766.46,-681.31 8758,-671 8736.09,-644.29 8648.19,-631.58 8582.55,-625.72"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8433.6,-1139.93 8444.09,-1138.5 8434.99,-1133.07 8433.6,-1139.93"/>
+<path fill="none" stroke="#63b8ff" d="M1850.9,-1141.96C1733.25,-1133.75 1513.68,-1116.44 1437.5,-1097 1144.13,-1022.15 977.05,-1085.19 809.5,-833 802.12,-821.89 800.59,-812.92 809.5,-803 859.22,-747.61 1084.33,-813.44 1142.5,-767 1177.76,-738.85 1159.78,-713.29 1175.5,-671 1180.91,-656.45 1187.71,-639.75 1191.83,-629.8"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.71,-1145.45 1860.92,-1142.65 1851.19,-1138.47 1850.71,-1145.45"/>
</a>
</g>
</g>
@@ -1350,17 +1369,17 @@
<g id="Node000037" class="node">
<title>Node37</title>
<g id="a_Node000037"><a xlink:href="tirx_2analysis_8h.html" target="_top" xlink:title="Analysis utilities and passes for TIR.">
-<polygon fill="white" stroke="#666666" points="8493,-695.5 8347,-695.5 8347,-676.5 8493,-676.5 8493,-695.5"/>
-<text text-anchor="middle" x="8420" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/analysis.h</text>
+<polygon fill="white" stroke="#666666" points="2777.5,-695.5 2631.5,-695.5 2631.5,-676.5 2777.5,-676.5 2777.5,-695.5"/>
+<text text-anchor="middle" x="2704.5" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/analysis.h</text>
</a>
</g>
</g>
<!-- Node28->Node37 -->
-<g id="edge104_Node000028_Node000037" class="edge">
+<g id="edge103_Node000028_Node000037" class="edge">
<title>Node28->Node37</title>
-<g id="a_edge104_Node000028_Node000037"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8430.43,-1142.31C8358.05,-1136.33 8256.29,-1123.41 8227,-1097 8136.31,-1015.25 8168.06,-953.9 8151,-833 8145.04,-790.75 8123.73,-769.81 8151,-737 8154.5,-732.79 8292.68,-708.68 8369.59,-695.54"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8430.19,-1145.8 8440.44,-1143.11 8430.75,-1138.82 8430.19,-1145.8"/>
+<g id="a_edge103_Node000028_Node000037"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2004.33,-1140.83C2142.47,-1125.1 2418.5,-1070.46 2418.5,-885 2418.5,-885 2418.5,-885 2418.5,-817 2418.5,-762.87 2590.45,-714.52 2667.7,-695.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2003.79,-1137.37 1994.23,-1141.94 2004.55,-1144.33 2003.79,-1137.37"/>
</a>
</g>
</g>
@@ -1368,8 +1387,8 @@
<g id="Node000039" class="node">
<title>Node39</title>
<g id="a_Node000039"><a xlink:href="relax_2analysis_8h.html" target="_top" xlink:title="The set of Relax specific analysis on IR.">
-<polygon fill="white" stroke="#666666" points="6722.5,-431.5 6567.5,-431.5 6567.5,-412.5 6722.5,-412.5 6722.5,-431.5"/>
-<text text-anchor="middle" x="6645" y="-419.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/analysis.h</text>
+<polygon fill="white" stroke="#666666" points="6801,-431.5 6646,-431.5 6646,-412.5 6801,-412.5 6801,-431.5"/>
+<text text-anchor="middle" x="6723.5" y="-419.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/analysis.h</text>
</a>
</g>
</g>
@@ -1377,8 +1396,8 @@
<g id="edge54_Node000028_Node000039" class="edge">
<title>Node28->Node39</title>
<g id="a_edge54_Node000028_Node000039"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8515.67,-1129.29C8526.89,-1104.7 8545,-1058.56 8545,-1017 8545,-1017 8545,-1017 8545,-883 8545,-846.35 8536.57,-826.13 8565,-803 8642.37,-740.05 9392.9,-838.93 9462,-767 9496.12,-731.49 9495.13,-737.64 9409,-605 9386.75,-570.73 9382.06,-556.2 9345,-539 9247.52,-493.76 8487.36,-477.93 8380,-473 7700.97,-441.8 7530.03,-468.05 6851,-437 6808.57,-435.06 6761.28,-431.92 6722.72,-429.1"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8512.46,-1127.89 8511.36,-1138.43 8518.79,-1130.88 8512.46,-1127.89"/>
+<path fill="none" stroke="#63b8ff" d="M2004.55,-1145.15C2240.06,-1139.29 2948.21,-1120.18 3177.5,-1097 3624.59,-1051.8 3892.95,-1199.12 4153.5,-833 4212.64,-749.9 4101.44,-703.61 4127.5,-605 4144.74,-539.76 4144.52,-507.52 4202.5,-473 4256.28,-440.99 6226.82,-426.26 6645.72,-423.49"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2004.28,-1141.65 1994.37,-1145.4 2004.45,-1148.65 2004.28,-1141.65"/>
</a>
</g>
</g>
@@ -1386,8 +1405,8 @@
<g id="edge56_Node000028_Node000041" class="edge">
<title>Node28->Node41</title>
<g id="a_edge56_Node000028_Node000041"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8430.13,-1141.29C8340.78,-1133.78 8199.39,-1118.9 8151,-1097 8116.85,-1081.55 8085.7,-1049.53 8069.57,-1031.03"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8429.96,-1144.79 8440.22,-1142.13 8430.54,-1137.82 8429.96,-1144.79"/>
+<path fill="none" stroke="#63b8ff" d="M2004.19,-1144.98C2154.85,-1140.48 2499.93,-1127.51 2788.5,-1097 2875.7,-1087.78 2896.52,-1078.14 2983.5,-1067 3127.32,-1048.58 3295.68,-1032.55 3392.33,-1023.87"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2004,-1141.49 1994.11,-1145.28 2004.21,-1148.48 2004,-1141.49"/>
</a>
</g>
</g>
@@ -1395,8 +1414,8 @@
<g id="Node000046" class="node">
<title>Node46</title>
<g id="a_Node000046"><a xlink:href="relax_2utils_8h.html" target="_top" xlink:title="Utility classes and functions for working with the Relax IR.">
-<polygon fill="white" stroke="#666666" points="6192.5,-629.5 6057.5,-629.5 6057.5,-610.5 6192.5,-610.5 6192.5,-629.5"/>
-<text text-anchor="middle" x="6125" y="-617.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/utils.h</text>
+<polygon fill="white" stroke="#666666" points="7189,-629.5 7054,-629.5 7054,-610.5 7189,-610.5 7189,-629.5"/>
+<text text-anchor="middle" x="7121.5" y="-617.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/utils.h</text>
</a>
</g>
</g>
@@ -1404,8 +1423,8 @@
<g id="edge63_Node000028_Node000046" class="edge">
<title>Node28->Node46</title>
<g id="a_edge63_Node000028_Node000046"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8429.85,-1141.52C8351.3,-1131.25 8241,-1101.73 8241,-1017 8241,-1017 8241,-1017 8241,-949 8241,-872.06 8274.75,-852.07 8334,-803 8382.08,-763.18 8402.86,-766.27 8458,-737 8488.2,-720.97 8508.36,-730.3 8526,-701 8532.88,-689.58 8535.35,-680.51 8526,-671 8484.43,-628.73 6451.25,-637.05 6392,-635 6324.15,-632.65 6246.69,-628.42 6192.73,-625.22"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8429.87,-1145.05 8440.22,-1142.79 8430.72,-1138.1 8429.87,-1145.05"/>
+<path fill="none" stroke="#63b8ff" d="M2004.16,-1144.63C2108.35,-1141.5 2300.49,-1136.01 2464.5,-1133 2558.02,-1131.28 5743.31,-1128.15 5831.5,-1097 5851.79,-1089.83 5852.57,-1080.28 5869.5,-1067 6019.78,-949.17 6036.92,-886.83 6208.5,-803 6316.2,-750.38 6613.73,-693.33 6731.5,-671 6791.69,-659.59 6959.22,-639.6 7053.96,-628.67"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2003.94,-1141.14 1994.05,-1144.94 2004.15,-1148.13 2003.94,-1141.14"/>
</a>
</g>
</g>
@@ -1413,9 +1432,9 @@
<g id="Node000051" class="node">
<title>Node51</title>
<g id="a_Node000051"><a xlink:href="arg__info_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7058.5,-437 6931.5,-437 6931.5,-407 7058.5,-407 7058.5,-437"/>
-<text text-anchor="start" x="6939.5" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="6995" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/arg_info.h</text>
+<polygon fill="white" stroke="#666666" points="723,-437 596,-437 596,-407 723,-407 723,-437"/>
+<text text-anchor="start" x="604" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="659.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/arg_info.h</text>
</a>
</g>
</g>
@@ -1423,8 +1442,8 @@
<g id="edge71_Node000028_Node000051" class="edge">
<title>Node28->Node51</title>
<g id="a_edge71_Node000028_Node000051"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8507,-1128.16C8507,-1102.87 8507,-1056.55 8507,-1017 8507,-1017 8507,-1017 8507,-883 8507,-845.88 8501.94,-826.1 8531,-803 8629.32,-724.86 8996.68,-845.14 9095,-767 9124.06,-743.9 9119,-724.12 9119,-687 9119,-687 9119,-687 9119,-553 9119,-531.66 9214.94,-521.57 8712,-473 7984.54,-402.75 7794.76,-514.1 7068,-437 7064.92,-436.67 7061.78,-436.28 7058.61,-435.85"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8503.5,-1128.48 8507,-1138.48 8510.5,-1128.48 8503.5,-1128.48"/>
+<path fill="none" stroke="#63b8ff" d="M1850.34,-1147.03C1550.43,-1146.82 476.04,-1142.87 420.5,-1097 395.14,-1076.06 371.5,-1014.56 371.5,-819 371.5,-819 371.5,-819 371.5,-751 371.5,-593.95 560.26,-476.21 632.15,-437.07"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.68,-1150.53 1860.68,-1147.04 1850.68,-1143.53 1850.68,-1150.53"/>
</a>
</g>
</g>
@@ -1432,9 +1451,9 @@
<g id="Node000053" class="node">
<title>Node53</title>
<g id="a_Node000053"><a xlink:href="builder_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="10048.5,-437 9921.5,-437 9921.5,-407 10048.5,-407 10048.5,-437"/>
-<text text-anchor="start" x="9929.5" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="9985" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/builder.h</text>
+<polygon fill="white" stroke="#666666" points="127,-437 0,-437 0,-407 127,-407 127,-437"/>
+<text text-anchor="start" x="8" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="63.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/builder.h</text>
</a>
</g>
</g>
@@ -1442,8 +1461,8 @@
<g id="edge82_Node000028_Node000053" class="edge">
<title>Node28->Node53</title>
<g id="a_edge82_Node000028_Node000053"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8583.7,-1147.64C8729.66,-1147.68 9057.02,-1142.16 9328,-1097 9436.7,-1078.89 9467.47,-1078.3 9567,-1031 9805.36,-917.72 10051,-950.91 10051,-687 10051,-687 10051,-687 10051,-553 10051,-506.43 10016.9,-459.64 9997.73,-437.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8583.51,-1144.14 8573.51,-1147.63 8583.5,-1151.14 8583.51,-1144.14"/>
+<path fill="none" stroke="#63b8ff" d="M1850.87,-1146.29C1531.35,-1143.12 318.14,-1129.02 243.5,-1097 120.46,-1044.22 29.5,-1018.88 29.5,-885 29.5,-885 29.5,-885 29.5,-553 29.5,-509.61 47.45,-460.64 57.26,-437.11"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.93,-1149.79 1860.96,-1146.39 1851,-1142.79 1850.93,-1149.79"/>
</a>
</g>
</g>
@@ -1451,9 +1470,9 @@
<g id="Node000054" class="node">
<title>Node54</title>
<g id="a_Node000054"><a xlink:href="extracted__task_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8849,-833 8699,-833 8699,-803 8849,-803 8849,-833"/>
-<text text-anchor="start" x="8707" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="8774" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/extracted_task.h</text>
+<polygon fill="white" stroke="#666666" points="1093.5,-833 943.5,-833 943.5,-803 1093.5,-803 1093.5,-833"/>
+<text text-anchor="start" x="951.5" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="1018.5" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/extracted_task.h</text>
</a>
</g>
</g>
@@ -1461,8 +1480,8 @@
<g id="edge87_Node000028_Node000054" class="edge">
<title>Node28->Node54</title>
<g id="a_edge87_Node000028_Node000054"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8541.96,-1134.71C8586.56,-1116.53 8658,-1077.91 8658,-1017 8658,-1017 8658,-1017 8658,-949 8658,-910.71 8665.12,-898.11 8690,-869 8703.34,-853.39 8722.84,-841.37 8739.69,-833.03"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8540.64,-1131.47 8532.62,-1138.38 8543.2,-1137.98 8540.64,-1131.47"/>
+<path fill="none" stroke="#63b8ff" d="M1850.68,-1142.94C1757.27,-1136.92 1605.97,-1123.39 1556.5,-1097 1506.22,-1070.18 1518.08,-1033.84 1471.5,-1001 1401.36,-951.55 1158.74,-866.45 1060.39,-833.05"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.73,-1146.45 1860.93,-1143.58 1851.17,-1139.46 1850.73,-1146.45"/>
</a>
</g>
</g>
@@ -1470,9 +1489,9 @@
<g id="Node000055" class="node">
<title>Node55</title>
<g id="a_Node000055"><a xlink:href="profiler_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8994.5,-833 8867.5,-833 8867.5,-803 8994.5,-803 8994.5,-833"/>
-<text text-anchor="start" x="8875.5" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
-<text text-anchor="middle" x="8931" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/profiler.h</text>
+<polygon fill="white" stroke="#666666" points="1239,-833 1112,-833 1112,-803 1239,-803 1239,-833"/>
+<text text-anchor="start" x="1120" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/meta</text>
+<text text-anchor="middle" x="1175.5" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">_schedule/profiler.h</text>
</a>
</g>
</g>
@@ -1480,8 +1499,8 @@
<g id="edge88_Node000028_Node000055" class="edge">
<title>Node28->Node55</title>
<g id="a_edge88_Node000028_Node000055"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8560.55,-1135.95C8618.89,-1120.42 8704,-1085.95 8704,-1017 8704,-1017 8704,-1017 8704,-949 8704,-906.59 8824.8,-856.88 8890.15,-833.08"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8559.55,-1132.6 8550.72,-1138.46 8561.28,-1139.38 8559.55,-1132.6"/>
+<path fill="none" stroke="#63b8ff" d="M1850.86,-1141.48C1766.88,-1134.38 1638.38,-1120.14 1595.5,-1097 1545.09,-1069.79 1554.41,-1036.55 1509.5,-1001 1410.61,-922.71 1273.36,-859.93 1210.04,-833.1"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.61,-1144.97 1860.87,-1142.31 1851.19,-1138 1850.61,-1144.97"/>
</a>
</g>
</g>
@@ -1489,18 +1508,18 @@
<g id="edge93_Node000028_Node000056" class="edge">
<title>Node28->Node56</title>
<g id="a_edge93_Node000028_Node000056"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8583.78,-1142.99C8744.39,-1134.58 9127.56,-1114.46 9449,-1097 9517.47,-1093.28 9596.41,-1088.88 9647.42,-1086.02"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8583.33,-1139.51 8573.53,-1143.53 8583.7,-1146.5 8583.33,-1139.51"/>
+<path fill="none" stroke="#63b8ff" d="M2004.46,-1140.83C2165.35,-1127.92 2533.8,-1098.37 2671.91,-1087.3"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2003.85,-1137.37 1994.16,-1141.65 2004.41,-1144.34 2003.85,-1137.37"/>
</a>
</g>
</g>
<!-- Node62 -->
<g id="Node000062" class="node">
<title>Node62</title>
-<g id="a_Node000062"><a xlink:href="ir__docsifier_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8054,-1097 7938,-1097 7938,-1067 8054,-1067 8054,-1097"/>
-<text text-anchor="start" x="7946" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/script</text>
-<text text-anchor="middle" x="7996" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">/printer/ir_docsifier.h</text>
+<g id="a_Node000062"><a xlink:href="codegen_8h.html" target="_top" xlink:title="Translates IRModule to runtime::Module.">
+<polygon fill="white" stroke="#666666" points="925,-833 818,-833 818,-803 925,-803 925,-833"/>
+<text text-anchor="start" x="826" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/target</text>
+<text text-anchor="middle" x="871.5" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">/codegen.h</text>
</a>
</g>
</g>
@@ -1508,64 +1527,45 @@
<g id="edge102_Node000028_Node000062" class="edge">
<title>Node28->Node62</title>
<g id="a_edge102_Node000028_Node000062"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8430.06,-1139.91C8342.6,-1131.46 8195.64,-1116.05 8070,-1097 8064.83,-1096.22 8059.47,-1095.34 8054.1,-1094.41"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8429.88,-1143.41 8440.17,-1140.88 8430.55,-1136.44 8429.88,-1143.41"/>
+<path fill="none" stroke="#63b8ff" d="M1850.65,-1145.15C1767.1,-1141.42 1630.42,-1130.25 1517.5,-1097 1423.69,-1069.37 1408.85,-1040.76 1319.5,-1001 1168.78,-933.94 985.49,-862.6 908.43,-833.06"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1850.68,-1148.66 1860.82,-1145.58 1850.97,-1141.66 1850.68,-1148.66"/>
</a>
</g>
</g>
<!-- Node63 -->
<g id="Node000063" class="node">
<title>Node63</title>
-<g id="a_Node000063"><a xlink:href="codegen_8h.html" target="_top" xlink:title="Translates IRModule to runtime::Module.">
-<polygon fill="white" stroke="#666666" points="8680.5,-833 8573.5,-833 8573.5,-803 8680.5,-803 8680.5,-833"/>
-<text text-anchor="start" x="8581.5" y="-821" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/target</text>
-<text text-anchor="middle" x="8627" y="-810" font-family="Helvetica,sans-Serif" font-size="10.00">/codegen.h</text>
+<g id="a_Node000063"><a xlink:href="exec__scope_8h.html" target="_top" xlink:title=" ">
+<polygon fill="white" stroke="#666666" points="2072,-1097 1953,-1097 1953,-1067 2072,-1067 2072,-1097"/>
+<text text-anchor="start" x="1961" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/exec</text>
+<text text-anchor="middle" x="2012.5" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">_scope.h</text>
</a>
</g>
</g>
<!-- Node28->Node63 -->
-<g id="edge103_Node000028_Node000063" class="edge">
+<g id="edge104_Node000028_Node000063" class="edge">
<title>Node28->Node63</title>
-<g id="a_edge103_Node000028_Node000063"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8528.49,-1132.35C8557.34,-1110.77 8605,-1067.46 8605,-1017 8605,-1017 8605,-1017 8605,-949 8605,-906.42 8616.61,-857.09 8622.96,-833.29"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8526.27,-1129.64 8520.22,-1138.34 8530.37,-1135.31 8526.27,-1129.64"/>
-</a>
-</g>
-</g>
-<!-- Node64 -->
-<g id="Node000064" class="node">
-<title>Node64</title>
-<g id="a_Node000064"><a xlink:href="exec__scope_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7748.5,-1097 7629.5,-1097 7629.5,-1067 7748.5,-1067 7748.5,-1097"/>
-<text text-anchor="start" x="7637.5" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/exec</text>
-<text text-anchor="middle" x="7689" y="-1074" font-family="Helvetica,sans-Serif" font-size="10.00">_scope.h</text>
-</a>
-</g>
-</g>
-<!-- Node28->Node64 -->
-<g id="edge105_Node000028_Node000064" class="edge">
-<title>Node28->Node64</title>
-<g id="a_edge105_Node000028_Node000064"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8430.04,-1140.98C8267.88,-1128.29 7894.08,-1099.05 7748.53,-1087.66"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8430.16,-1144.5 8440.41,-1141.79 8430.71,-1137.52 8430.16,-1144.5"/>
+<g id="a_edge104_Node000028_Node000063"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1947,-1132.32C1961.05,-1121.74 1979.88,-1107.56 1993.75,-1097.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1944.85,-1129.56 1938.96,-1138.37 1949.06,-1135.15 1944.85,-1129.56"/>
</a>
</g>
</g>
-<!-- Node66 -->
-<g id="Node000066" class="node">
-<title>Node66</title>
-<g id="a_Node000066"><a xlink:href="layout_8h.html" target="_top" xlink:title="Definition of layout.">
-<polygon fill="white" stroke="#666666" points="7922.5,-1025.5 7785.5,-1025.5 7785.5,-1006.5 7922.5,-1006.5 7922.5,-1025.5"/>
-<text text-anchor="middle" x="7854" y="-1013.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/layout.h</text>
+<!-- Node65 -->
+<g id="Node000065" class="node">
+<title>Node65</title>
+<g id="a_Node000065"><a xlink:href="layout_8h.html" target="_top" xlink:title="Definition of layout.">
+<polygon fill="white" stroke="#666666" points="1909,-1025.5 1772,-1025.5 1772,-1006.5 1909,-1006.5 1909,-1025.5"/>
+<text text-anchor="middle" x="1840.5" y="-1013.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/layout.h</text>
</a>
</g>
</g>
-<!-- Node28->Node66 -->
-<g id="edge267_Node000028_Node000066" class="edge">
-<title>Node28->Node66</title>
-<g id="a_edge267_Node000028_Node000066"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8430.31,-1142.36C8329.86,-1135.45 8159.75,-1120.69 8102,-1097 8081.77,-1088.7 8082.74,-1076.42 8063,-1067 8017.88,-1045.47 7962.73,-1032.78 7920.42,-1025.57"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8430.19,-1145.86 8440.4,-1143.04 8430.66,-1138.87 8430.19,-1145.86"/>
+<!-- Node28->Node65 -->
+<g id="edge266_Node000028_Node000065" class="edge">
+<title>Node28->Node65</title>
+<g id="a_edge266_Node000028_Node000065"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1916.19,-1130.1C1897.45,-1102.1 1860.62,-1047.06 1846.34,-1025.73"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1913.32,-1132.11 1921.79,-1138.47 1919.14,-1128.21 1913.32,-1132.11"/>
</a>
</g>
</g>
@@ -1573,9 +1573,9 @@
<g id="Node000030" class="node">
<title>Node30</title>
<g id="a_Node000030"><a xlink:href="relax_2distributed_2transform_8h.html" target="_top" xlink:title="Relax distributed specific transformation passes.">
-<polygon fill="white" stroke="#666666" points="4687,-503 4529,-503 4529,-473 4687,-473 4687,-503"/>
-<text text-anchor="start" x="4537" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
-<text text-anchor="middle" x="4608" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/transform.h</text>
+<polygon fill="white" stroke="#666666" points="4369.5,-503 4211.5,-503 4211.5,-473 4369.5,-473 4369.5,-503"/>
+<text text-anchor="start" x="4219.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
+<text text-anchor="middle" x="4290.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/transform.h</text>
</a>
</g>
</g>
@@ -1583,8 +1583,8 @@
<g id="edge42_Node000029_Node000030" class="edge">
<title>Node29->Node30</title>
<g id="a_edge42_Node000029_Node000030"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9395.96,-734.48C9403.23,-725.32 9411.21,-713.32 9415,-701 9418.92,-688.26 9419,-683.72 9415,-671 9392.2,-598.41 9375.83,-569.2 9306,-539 9188.46,-488.16 4823.62,-513.59 4696,-503 4693.07,-502.76 4690.09,-502.47 4687.09,-502.16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9393.13,-732.4 9389.36,-742.3 9398.49,-736.91 9393.13,-732.4"/>
+<path fill="none" stroke="#63b8ff" d="M1124.14,-749.32C1398.24,-743.54 2263.26,-723.61 2318.5,-701 2336.84,-693.49 2334.09,-680.47 2351.5,-671 2452.46,-616.11 2488.54,-626.13 2601.5,-605 2859.99,-556.64 2927.28,-558.97 3189.5,-539 3586.01,-508.8 3686.42,-524.42 4083.5,-503 4125.76,-500.72 4172.84,-497.58 4211.4,-494.86"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1123.78,-745.83 1113.86,-749.54 1123.93,-752.83 1123.78,-745.83"/>
</a>
</g>
</g>
@@ -1592,8 +1592,8 @@
<g id="Node000031" class="node">
<title>Node31</title>
<g id="a_Node000031"><a xlink:href="relax_2transform_8h.html" target="_top" xlink:title="Relax specific transformation passes.">
-<polygon fill="white" stroke="#666666" points="4985,-563.5 4823,-563.5 4823,-544.5 4985,-544.5 4985,-563.5"/>
-<text text-anchor="middle" x="4904" y="-551.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/transform.h</text>
+<polygon fill="white" stroke="#666666" points="4453.5,-563.5 4291.5,-563.5 4291.5,-544.5 4453.5,-544.5 4453.5,-563.5"/>
+<text text-anchor="middle" x="4372.5" y="-551.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/transform.h</text>
</a>
</g>
</g>
@@ -1601,8 +1601,8 @@
<g id="edge43_Node000029_Node000031" class="edge">
<title>Node29->Node31</title>
<g id="a_edge43_Node000029_Node000031"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9377.56,-732.59C9372.97,-713.69 9362.86,-685.12 9342,-671 9250.84,-609.31 8950.6,-674.86 8848,-635 8827.94,-627.21 8830.28,-612.19 8810,-605 8804.16,-602.93 5543.75,-562.85 4985,-555.99"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9374.15,-733.37 9379.66,-742.41 9380.99,-731.9 9374.15,-733.37"/>
+<path fill="none" stroke="#63b8ff" d="M1123.79,-750.18C1372.37,-747.34 2113.02,-736.07 2351.5,-701 2354.13,-700.61 2718.87,-605.38 2721.5,-605 2799.81,-593.8 3970.04,-564.75 4291.39,-556.95"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1123.7,-746.68 1113.74,-750.29 1123.78,-753.68 1123.7,-746.68"/>
</a>
</g>
</g>
@@ -1610,8 +1610,8 @@
<g id="edge47_Node000029_Node000034" class="edge">
<title>Node29->Node34</title>
<g id="a_edge47_Node000029_Node000034"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9371.49,-733.84C9359.8,-714.67 9338.03,-684.56 9310,-671 9245.68,-639.89 8739.26,-640.1 8668,-635 8640.15,-633.01 8609.63,-630.45 8582.72,-628.07"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9368.47,-735.61 9376.53,-742.49 9374.51,-732.09 9368.47,-735.61"/>
+<path fill="none" stroke="#63b8ff" d="M1051.15,-733.14C1061.33,-715.58 1078.76,-688.89 1099.5,-671 1121.27,-652.22 1151.31,-638.03 1171.96,-629.65"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1047.86,-731.85 1046.02,-742.29 1053.96,-735.28 1047.86,-731.85"/>
</a>
</g>
</g>
@@ -1619,9 +1619,9 @@
<g id="Node000035" class="node">
<title>Node35</title>
<g id="a_Node000035"><a xlink:href="s__tir_2backend_2adreno_2transform_8h.html" target="_top" xlink:title="S-TIR specific Adreno GPU transformation passes.">
-<polygon fill="white" stroke="#666666" points="9297,-569 9155,-569 9155,-539 9297,-539 9297,-569"/>
-<text text-anchor="start" x="9163" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/backend</text>
-<text text-anchor="middle" x="9226" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">/adreno/transform.h</text>
+<polygon fill="white" stroke="#666666" points="1070.5,-569 928.5,-569 928.5,-539 1070.5,-539 1070.5,-569"/>
+<text text-anchor="start" x="936.5" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/backend</text>
+<text text-anchor="middle" x="999.5" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">/adreno/transform.h</text>
</a>
</g>
</g>
@@ -1629,8 +1629,8 @@
<g id="edge48_Node000029_Node000035" class="edge">
<title>Node29->Node35</title>
<g id="a_edge48_Node000029_Node000035"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9391.61,-732.95C9399.98,-716.19 9408.75,-690.91 9399,-671 9373.24,-618.39 9310.8,-585.91 9268.43,-569.15"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9388.31,-731.69 9386.63,-742.15 9394.47,-735.03 9388.31,-731.69"/>
+<path fill="none" stroke="#63b8ff" d="M1038.46,-732.48C1033.78,-704.66 1024.21,-650.48 1013.5,-605 1010.65,-592.89 1006.8,-579.31 1003.86,-569.36"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1035.01,-733.1 1040.11,-742.39 1041.92,-731.95 1035.01,-733.1"/>
</a>
</g>
</g>
@@ -1638,8 +1638,8 @@
<g id="Node000036" class="node">
<title>Node36</title>
<g id="a_Node000036"><a xlink:href="s__tir_2transform_8h.html" target="_top" xlink:title="S-TIR specific transformation passes.">
-<polygon fill="white" stroke="#666666" points="9305,-629.5 9147,-629.5 9147,-610.5 9305,-610.5 9305,-629.5"/>
-<text text-anchor="middle" x="9226" y="-617.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/transform.h</text>
+<polygon fill="white" stroke="#666666" points="953.5,-629.5 795.5,-629.5 795.5,-610.5 953.5,-610.5 953.5,-629.5"/>
+<text text-anchor="middle" x="874.5" y="-617.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/transform.h</text>
</a>
</g>
</g>
@@ -1647,8 +1647,8 @@
<g id="edge49_Node000029_Node000036" class="edge">
<title>Node29->Node36</title>
<g id="a_edge49_Node000029_Node000036"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9386.78,-732.16C9390.94,-714.62 9393.81,-688.59 9381,-671 9363.36,-646.77 9333.75,-634.03 9305.11,-627.43"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9383.28,-731.73 9384.02,-742.29 9390.03,-733.57 9383.28,-731.73"/>
+<path fill="none" stroke="#63b8ff" d="M1023.37,-735.93C1003.66,-719.66 971.16,-693.1 942.5,-671 923.24,-656.15 900.36,-639.53 886.66,-629.69"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1021.28,-738.75 1031.22,-742.43 1025.75,-733.36 1021.28,-738.75"/>
</a>
</g>
</g>
@@ -1656,8 +1656,8 @@
<g id="edge51_Node000029_Node000037" class="edge">
<title>Node29->Node37</title>
<g id="a_edge51_Node000029_Node000037"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9298.5,-745.77C9158.26,-736.85 8864.4,-717.99 8616,-701 8575.33,-698.22 8529.92,-694.98 8493.06,-692.32"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9298.54,-749.28 9308.74,-746.42 9298.98,-742.3 9298.54,-749.28"/>
+<path fill="none" stroke="#63b8ff" d="M1123.88,-748.78C1342.51,-742.75 1955.6,-724.88 2465.5,-701 2521.14,-698.39 2584.01,-694.68 2631.3,-691.73"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1123.66,-745.29 1113.76,-749.06 1123.86,-752.28 1123.66,-745.29"/>
</a>
</g>
</g>
@@ -1665,8 +1665,8 @@
<g id="Node000038" class="node">
<title>Node38</title>
<g id="a_Node000038"><a xlink:href="tirx_2transform_8h.html" target="_top" xlink:title="TIR specific transformation passes.">
-<polygon fill="white" stroke="#666666" points="9301,-695.5 9147,-695.5 9147,-676.5 9301,-676.5 9301,-695.5"/>
-<text text-anchor="middle" x="9224" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/transform.h</text>
+<polygon fill="white" stroke="#666666" points="933.5,-695.5 779.5,-695.5 779.5,-676.5 933.5,-676.5 933.5,-695.5"/>
+<text text-anchor="middle" x="856.5" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/transform.h</text>
</a>
</g>
</g>
@@ -1674,8 +1674,8 @@
<g id="edge52_Node000029_Node000038" class="edge">
<title>Node29->Node38</title>
<g id="a_edge52_Node000029_Node000038"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9350.36,-738.51C9319.33,-725.86 9272.16,-706.63 9245.09,-695.6"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9349.24,-741.83 9359.83,-742.37 9351.89,-735.35 9349.24,-741.83"/>
+<path fill="none" stroke="#63b8ff" d="M1006.82,-739C970.28,-726.36 913.66,-706.78 881.35,-695.6"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1005.96,-742.41 1016.55,-742.37 1008.24,-735.79 1005.96,-742.41"/>
</a>
</g>
</g>
@@ -1683,8 +1683,8 @@
<g id="edge46_Node000031_Node000030" class="edge">
<title>Node31->Node30</title>
<g id="a_edge46_Node000031_Node000030"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M4854.49,-542.3C4804.66,-531.52 4727.56,-514.85 4672.86,-503.02"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="4853.87,-545.74 4864.39,-544.44 4855.35,-538.9 4853.87,-545.74"/>
+<path fill="none" stroke="#63b8ff" d="M4353.3,-538.02C4339.8,-527.48 4321.84,-513.46 4308.59,-503.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="4351.4,-540.98 4361.44,-544.37 4355.71,-535.46 4351.4,-540.98"/>
</a>
</g>
</g>
@@ -1692,8 +1692,8 @@
<g id="Node000032" class="node">
<title>Node32</title>
<g id="a_Node000032"><a xlink:href="backend_8h.html" target="_top" xlink:title="Relax backend specific transformation passes.">
-<polygon fill="white" stroke="#666666" points="4860.5,-497.5 4705.5,-497.5 4705.5,-478.5 4860.5,-478.5 4860.5,-497.5"/>
-<text text-anchor="middle" x="4783" y="-485.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/backend.h</text>
+<polygon fill="white" stroke="#666666" points="4543,-497.5 4388,-497.5 4388,-478.5 4543,-478.5 4543,-497.5"/>
+<text text-anchor="middle" x="4465.5" y="-485.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/backend.h</text>
</a>
</g>
</g>
@@ -1701,8 +1701,8 @@
<g id="edge44_Node000031_Node000032" class="edge">
<title>Node31->Node32</title>
<g id="a_edge44_Node000031_Node000032"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M4878.53,-539.53C4854.7,-526.92 4819.8,-508.47 4799.45,-497.7"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="4877.21,-542.79 4887.68,-544.37 4880.48,-536.6 4877.21,-542.79"/>
+<path fill="none" stroke="#63b8ff" d="M4393.31,-538.68C4411.58,-526.11 4437.56,-508.23 4452.86,-497.7"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="4391.3,-535.82 4385.04,-544.37 4395.26,-541.58 4391.3,-535.82"/>
</a>
</g>
</g>
@@ -1710,9 +1710,9 @@
<g id="Node000033" class="node">
<title>Node33</title>
<g id="a_Node000033"><a xlink:href="relax_2backend_2adreno_2transform_8h.html" target="_top" xlink:title="Adreno GPU specific transformation passes.">
-<polygon fill="white" stroke="#666666" points="5025,-503 4879,-503 4879,-473 5025,-473 5025,-503"/>
-<text text-anchor="start" x="4887" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/backend</text>
-<text text-anchor="middle" x="4952" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/adreno/transform.h</text>
+<polygon fill="white" stroke="#666666" points="4707.5,-503 4561.5,-503 4561.5,-473 4707.5,-473 4707.5,-503"/>
+<text text-anchor="start" x="4569.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/backend</text>
+<text text-anchor="middle" x="4634.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/adreno/transform.h</text>
</a>
</g>
</g>
@@ -1720,8 +1720,8 @@
<g id="edge45_Node000031_Node000033" class="edge">
<title>Node31->Node33</title>
<g id="a_edge45_Node000031_Node000033"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M4916.57,-536.24C4924.23,-526.02 4933.92,-513.1 4941.23,-503.36"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="4913.67,-534.27 4910.47,-544.37 4919.27,-538.47 4913.67,-534.27"/>
+<path fill="none" stroke="#63b8ff" d="M4417.43,-542.02C4461.56,-531.24 4529.08,-514.75 4577.09,-503.02"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="4416.45,-538.66 4407.56,-544.44 4418.11,-545.46 4416.45,-538.66"/>
</a>
</g>
</g>
@@ -1729,8 +1729,8 @@
<g id="edge50_Node000036_Node000035" class="edge">
<title>Node36->Node35</title>
<g id="a_edge50_Node000036_Node000035"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9226,-600.35C9226,-590.47 9226,-578.51 9226,-569.36"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9222.5,-600.37 9226,-610.37 9229.5,-600.37 9222.5,-600.37"/>
+<path fill="none" stroke="#63b8ff" d="M900.3,-605.79C921.2,-595.09 950.57,-580.05 971.93,-569.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="898.66,-602.7 891.36,-610.37 901.85,-608.93 898.66,-602.7"/>
</a>
</g>
</g>
@@ -1738,8 +1738,8 @@
<g id="edge53_Node000038_Node000036" class="edge">
<title>Node38->Node36</title>
<g id="a_edge53_Node000038_Node000036"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9224.59,-666.08C9224.96,-654.13 9225.43,-639.22 9225.72,-629.91"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9221.08,-666.26 9224.27,-676.37 9228.08,-666.48 9221.08,-666.26"/>
+<path fill="none" stroke="#63b8ff" d="M861.72,-666.45C865.1,-654.43 869.35,-639.32 872,-629.91"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="858.27,-665.79 858.93,-676.37 865,-667.69 858.27,-665.79"/>
</a>
</g>
</g>
@@ -1747,9 +1747,9 @@
<g id="Node000040" class="node">
<title>Node40</title>
<g id="a_Node000040"><a xlink:href="binding__rewrite_8h.html" target="_top" xlink:title="An IR rewriter to easily add/remove/replace bindings (statements).">
-<polygon fill="white" stroke="#666666" points="6764.5,-365.5 6623.5,-365.5 6623.5,-335.5 6764.5,-335.5 6764.5,-365.5"/>
-<text text-anchor="start" x="6631.5" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/binding</text>
-<text text-anchor="middle" x="6694" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_rewrite.h</text>
+<polygon fill="white" stroke="#666666" points="7120,-365.5 6979,-365.5 6979,-335.5 7120,-335.5 7120,-365.5"/>
+<text text-anchor="start" x="6987" y="-353.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/binding</text>
+<text text-anchor="middle" x="7049.5" y="-342.5" font-family="Helvetica,sans-Serif" font-size="10.00">_rewrite.h</text>
</a>
</g>
</g>
@@ -1757,8 +1757,8 @@
<g id="edge55_Node000039_Node000040" class="edge">
<title>Node39->Node40</title>
<g id="a_edge55_Node000039_Node000040"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6656.99,-403.99C6665.29,-392.21 6676.21,-376.73 6684.03,-365.64"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6653.91,-402.29 6651.01,-412.48 6659.63,-406.32 6653.91,-402.29"/>
+<path fill="none" stroke="#63b8ff" d="M6773.57,-410.33C6829.93,-398.31 6921.72,-378.74 6983.8,-365.51"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6772.52,-406.97 6763.47,-412.48 6773.98,-413.82 6772.52,-406.97"/>
</a>
</g>
</g>
@@ -1766,9 +1766,9 @@
<g id="Node000042" class="node">
<title>Node42</title>
<g id="a_Node000042"><a xlink:href="distributed_8h.html" target="_top" xlink:title="Attributes for redistribute and annotate_sharding operators.">
-<polygon fill="white" stroke="#666666" points="7347,-635 7219,-635 7219,-605 7347,-605 7347,-635"/>
-<text text-anchor="start" x="7227" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/attrs</text>
-<text text-anchor="middle" x="7283" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">/distributed.h</text>
+<polygon fill="white" stroke="#666666" points="3585.5,-635 3457.5,-635 3457.5,-605 3585.5,-605 3585.5,-635"/>
+<text text-anchor="start" x="3465.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/attrs</text>
+<text text-anchor="middle" x="3521.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">/distributed.h</text>
</a>
</g>
</g>
@@ -1776,8 +1776,8 @@
<g id="edge57_Node000041_Node000042" class="edge">
<title>Node41->Node42</title>
<g id="a_edge57_Node000041_Node000042"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8102.65,-996.18C8117.77,-988.21 8133.88,-977.78 8146,-965 8201.39,-906.59 8165.27,-854.67 8227,-803 8353.21,-697.36 8687.16,-789.56 8573,-671 8536.33,-632.91 7674.83,-637.09 7622,-635 7526.21,-631.21 7415.2,-626.58 7347.04,-623.71"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8100.77,-993.21 8093.4,-1000.82 8103.91,-999.46 8100.77,-993.21"/>
+<path fill="none" stroke="#63b8ff" d="M3475.78,-990.79C3482.1,-951.31 3492.3,-870.66 3483.5,-803 3475.77,-743.62 3430.05,-724.72 3456.5,-671 3464.11,-655.55 3479.05,-643.53 3492.69,-635.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3472.3,-990.35 3474.12,-1000.79 3479.21,-991.5 3472.3,-990.35"/>
</a>
</g>
</g>
@@ -1785,9 +1785,9 @@
<g id="Node000043" class="node">
<title>Node43</title>
<g id="a_Node000043"><a xlink:href="relax_2distributed_2type_8h.html" target="_top" xlink:title="Type definitions for DTensor (Distributed Tensor)">
-<polygon fill="white" stroke="#666666" points="7109,-701 6951,-701 6951,-671 7109,-671 7109,-701"/>
-<text text-anchor="start" x="6959" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
-<text text-anchor="middle" x="7030" y="-678" font-family="Helvetica,sans-Serif" font-size="10.00">/type.h</text>
+<polygon fill="white" stroke="#666666" points="3623.5,-701 3465.5,-701 3465.5,-671 3623.5,-671 3623.5,-701"/>
+<text text-anchor="start" x="3473.5" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/distributed</text>
+<text text-anchor="middle" x="3544.5" y="-678" font-family="Helvetica,sans-Serif" font-size="10.00">/type.h</text>
</a>
</g>
</g>
@@ -1795,8 +1795,8 @@
<g id="edge58_Node000041_Node000043" class="edge">
<title>Node41->Node43</title>
<g id="a_edge58_Node000041_Node000043"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8016.97,-996.8C7905.4,-947.97 7586.27,-812.65 7309,-737 7242.54,-718.87 7165.33,-705.61 7109,-697.32"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8015.62,-1000.03 8026.19,-1000.85 8018.44,-993.62 8015.62,-1000.03"/>
+<path fill="none" stroke="#63b8ff" d="M3496.59,-993.21C3504.27,-985.15 3511.89,-975.41 3516.5,-965 3537.8,-916.87 3543.11,-750.59 3544.23,-701.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3493.68,-991.17 3489.01,-1000.68 3498.59,-996.15 3493.68,-991.17"/>
</a>
</g>
</g>
@@ -1804,8 +1804,8 @@
<g id="edge60_Node000043_Node000007" class="edge">
<title>Node43->Node7</title>
<g id="a_edge60_Node000043_Node000007"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7119.33,-671.45C7215.38,-656.85 7354.63,-635.62 7356,-635 7390.36,-619.41 7422.14,-587.75 7438.81,-569.28"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7118.67,-668.01 7109.31,-672.97 7119.72,-674.93 7118.67,-668.01"/>
+<path fill="none" stroke="#63b8ff" d="M3455.35,-682.17C3345.28,-677.48 3152.73,-665.38 2990.5,-635 2904.11,-618.82 2805.92,-587.38 2752.44,-569.1"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3455.28,-685.67 3465.41,-682.59 3455.57,-678.67 3455.28,-685.67"/>
</a>
</g>
</g>
@@ -1813,8 +1813,8 @@
<g id="edge59_Node000043_Node000042" class="edge">
<title>Node43->Node42</title>
<g id="a_edge59_Node000043_Node000042"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7095.42,-668.45C7136.41,-658.08 7188.67,-644.86 7227.61,-635.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7094.36,-665.11 7085.52,-670.95 7096.07,-671.9 7094.36,-665.11"/>
+<path fill="none" stroke="#63b8ff" d="M3535.91,-661.11C3532.78,-652.38 3529.33,-642.78 3526.59,-635.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3532.72,-662.57 3539.4,-670.8 3539.31,-660.2 3532.72,-662.57"/>
</a>
</g>
</g>
@@ -1822,9 +1822,9 @@
<g id="Node000044" class="node">
<title>Node44</title>
<g id="a_Node000044"><a xlink:href="type__functor_8h.html" target="_top" xlink:title="Functors and visitors for Relax type nodes.">
-<polygon fill="white" stroke="#666666" points="6836.5,-635 6709.5,-635 6709.5,-605 6836.5,-605 6836.5,-635"/>
-<text text-anchor="start" x="6717.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/type</text>
-<text text-anchor="middle" x="6773" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
+<polygon fill="white" stroke="#666666" points="4263,-635 4136,-635 4136,-605 4263,-605 4263,-635"/>
+<text text-anchor="start" x="4144" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/type</text>
+<text text-anchor="middle" x="4199.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
</a>
</g>
</g>
@@ -1832,8 +1832,8 @@
<g id="edge61_Node000043_Node000044" class="edge">
<title>Node43->Node44</title>
<g id="a_edge61_Node000043_Node000044"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6963.81,-668.52C6922.13,-658.14 6868.91,-644.88 6829.27,-635.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6963.05,-671.93 6973.6,-670.95 6964.74,-665.14 6963.05,-671.93"/>
+<path fill="none" stroke="#63b8ff" d="M3633.76,-676.28C3767.99,-663.16 4018.59,-638.68 4135.88,-627.22"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3633.12,-672.82 3623.51,-677.28 3633.8,-679.79 3633.12,-672.82"/>
</a>
</g>
</g>
@@ -1841,9 +1841,9 @@
<g id="Node000045" class="node">
<title>Node45</title>
<g id="a_Node000045"><a xlink:href="relax_2expr__functor_8h.html" target="_top" xlink:title="A more powerful visitor which enables defining arbitrary function signatures with type based dispatch...">
-<polygon fill="white" stroke="#666666" points="6652.5,-503 6525.5,-503 6525.5,-473 6652.5,-473 6652.5,-503"/>
-<text text-anchor="start" x="6533.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/expr</text>
-<text text-anchor="middle" x="6589" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
+<polygon fill="white" stroke="#666666" points="4853,-503 4726,-503 4726,-473 4853,-473 4853,-503"/>
+<text text-anchor="start" x="4734" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/expr</text>
+<text text-anchor="middle" x="4789.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">_functor.h</text>
</a>
</g>
</g>
@@ -1851,8 +1851,8 @@
<g id="edge62_Node000044_Node000045" class="edge">
<title>Node44->Node45</title>
<g id="a_edge62_Node000044_Node000045"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6744.48,-598.85C6706.91,-572.31 6641.77,-526.28 6609.02,-503.14"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6742.77,-601.93 6752.96,-604.84 6746.81,-596.21 6742.77,-601.93"/>
+<path fill="none" stroke="#63b8ff" d="M4273.5,-611.94C4341.7,-604.49 4445.38,-590.76 4533.5,-569 4572.8,-559.29 4580.96,-551.38 4619.5,-539 4659.63,-526.11 4705.49,-512.7 4739.46,-503.01"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="4272.86,-608.49 4263.29,-613.04 4273.61,-615.45 4272.86,-608.49"/>
</a>
</g>
</g>
@@ -1860,9 +1860,9 @@
<g id="Node000047" class="node">
<title>Node47</title>
<g id="a_Node000047"><a xlink:href="block__builder_8h.html" target="_top" xlink:title="The utility for constructing Relax binding blocks.">
-<polygon fill="white" stroke="#666666" points="6191.5,-569 6060.5,-569 6060.5,-539 6191.5,-539 6191.5,-569"/>
-<text text-anchor="start" x="6068.5" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/block</text>
-<text text-anchor="middle" x="6126" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">_builder.h</text>
+<polygon fill="white" stroke="#666666" points="6921,-569 6790,-569 6790,-539 6921,-539 6921,-569"/>
+<text text-anchor="start" x="6798" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/block</text>
+<text text-anchor="middle" x="6855.5" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">_builder.h</text>
</a>
</g>
</g>
@@ -1870,8 +1870,8 @@
<g id="edge64_Node000046_Node000047" class="edge">
<title>Node46->Node47</title>
<g id="a_edge64_Node000046_Node000047"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6125.29,-600.35C6125.45,-590.47 6125.63,-578.51 6125.78,-569.36"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6121.79,-600.32 6125.13,-610.37 6128.79,-600.42 6121.79,-600.32"/>
+<path fill="none" stroke="#63b8ff" d="M7076.17,-608.09C7031.36,-597.31 6962.63,-580.78 6913.79,-569.02"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="7075.36,-611.5 7085.9,-610.44 7077,-604.69 7075.36,-611.5"/>
</a>
</g>
</g>
@@ -1879,8 +1879,8 @@
<g id="edge65_Node000047_Node000045" class="edge">
<title>Node47->Node45</title>
<g id="a_edge65_Node000047_Node000045"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6202,-542.49C6292.15,-530.03 6440.83,-509.48 6525.24,-497.81"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6201.27,-539.06 6191.84,-543.9 6202.23,-546 6201.27,-539.06"/>
+<path fill="none" stroke="#63b8ff" d="M6779.44,-539.42C6778.12,-539.27 6776.8,-539.13 6775.5,-539 6389.61,-500.59 5149.23,-491.08 4853.32,-489.33"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6779.33,-542.93 6789.69,-540.69 6780.19,-535.98 6779.33,-542.93"/>
</a>
</g>
</g>
@@ -1888,9 +1888,9 @@
<g id="Node000048" class="node">
<title>Node48</title>
<g id="a_Node000048"><a xlink:href="relax_2op__attr__types_8h.html" target="_top" xlink:title="Data structures that can appear in operator attributes.">
-<polygon fill="white" stroke="#666666" points="6184.5,-503 6067.5,-503 6067.5,-473 6184.5,-473 6184.5,-503"/>
-<text text-anchor="start" x="6075.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/op</text>
-<text text-anchor="middle" x="6126" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">_attr_types.h</text>
+<polygon fill="white" stroke="#666666" points="6983,-503 6866,-503 6866,-473 6983,-473 6983,-503"/>
+<text text-anchor="start" x="6874" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/op</text>
+<text text-anchor="middle" x="6924.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">_attr_types.h</text>
</a>
</g>
</g>
@@ -1898,8 +1898,8 @@
<g id="edge66_Node000047_Node000048" class="edge">
<title>Node47->Node48</title>
<g id="a_edge66_Node000047_Node000048"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6126,-528.54C6126,-519.96 6126,-510.61 6126,-503.16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6122.5,-528.8 6126,-538.8 6129.5,-528.8 6122.5,-528.8"/>
+<path fill="none" stroke="#63b8ff" d="M6878.22,-531.92C6888.4,-522.49 6900.13,-511.61 6909.23,-503.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6875.76,-529.43 6870.81,-538.8 6880.53,-534.56 6875.76,-529.43"/>
</a>
</g>
</g>
@@ -1907,9 +1907,9 @@
<g id="Node000049" class="node">
<title>Node49</title>
<g id="a_Node000049"><a xlink:href="relax_2script_2ir__builder_2frame_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="9317,-503 9185,-503 9185,-473 9317,-473 9317,-503"/>
-<text text-anchor="start" x="9193" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/script</text>
-<text text-anchor="middle" x="9251" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
+<polygon fill="white" stroke="#666666" points="3243.5,-503 3111.5,-503 3111.5,-473 3243.5,-473 3243.5,-503"/>
+<text text-anchor="start" x="3119.5" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/script</text>
+<text text-anchor="middle" x="3177.5" y="-480" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
</a>
</g>
</g>
@@ -1917,8 +1917,8 @@
<g id="edge68_Node000047_Node000049" class="edge">
<title>Node47->Node49</title>
<g id="a_edge68_Node000047_Node000049"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6201.81,-551.45C6633.78,-542.6 8779.28,-498.66 9184.81,-490.36"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6201.56,-547.95 6191.63,-551.66 6201.7,-554.95 6201.56,-547.95"/>
+<path fill="none" stroke="#63b8ff" d="M6779.91,-547.39C6735.78,-544.35 6679.02,-540.85 6628.5,-539 5239.56,-488.21 4890.85,-541 3501.5,-503 3412.15,-500.56 3309.02,-495.76 3243.56,-492.47"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6779.76,-550.89 6789.98,-548.09 6780.25,-543.9 6779.76,-550.89"/>
</a>
</g>
</g>
@@ -1926,8 +1926,8 @@
<g id="edge67_Node000048_Node000039" class="edge">
<title>Node48->Node39</title>
<g id="a_edge67_Node000048_Node000039"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6194.94,-474.81C6199.02,-474.17 6203.06,-473.56 6207,-473 6332.76,-454.97 6479.59,-439.3 6567.29,-430.51"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6194.1,-471.4 6184.78,-476.43 6195.2,-478.31 6194.1,-471.4"/>
+<path fill="none" stroke="#63b8ff" d="M6870.77,-469.89C6831.85,-457.5 6780.88,-441.27 6750.25,-431.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="6869.8,-473.26 6880.39,-472.95 6871.92,-466.59 6869.8,-473.26"/>
</a>
</g>
</g>
@@ -1935,9 +1935,9 @@
<g id="Node000050" class="node">
<title>Node50</title>
<g id="a_Node000050"><a xlink:href="relax_2script_2ir__builder_2ir_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="7209,-437 7077,-437 7077,-407 7209,-407 7209,-437"/>
-<text text-anchor="start" x="7085" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/script</text>
-<text text-anchor="middle" x="7143" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
+<polygon fill="white" stroke="#666666" points="3265.5,-437 3133.5,-437 3133.5,-407 3265.5,-407 3265.5,-437"/>
+<text text-anchor="start" x="3141.5" y="-425" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/relax/script</text>
+<text text-anchor="middle" x="3199.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
</a>
</g>
</g>
@@ -1945,8 +1945,8 @@
<g id="edge69_Node000049_Node000050" class="edge">
<title>Node49->Node50</title>
<g id="a_edge69_Node000049_Node000050"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9174.82,-473.39C9173.54,-473.25 9172.26,-473.12 9171,-473 8309.05,-390.12 8084.95,-519.88 7223,-437 7218.51,-436.57 7213.89,-436.03 7209.25,-435.41"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9174.41,-476.87 9184.75,-474.59 9175.25,-469.92 9174.41,-476.87"/>
+<path fill="none" stroke="#63b8ff" d="M3185.71,-463.11C3188.71,-454.38 3192.01,-444.78 3194.63,-437.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="3182.32,-462.2 3182.38,-472.8 3188.94,-464.48 3182.32,-462.2"/>
</a>
</g>
</g>
@@ -1954,8 +1954,8 @@
<g id="edge72_Node000051_Node000012" class="edge">
<title>Node51->Node12</title>
<g id="a_edge72_Node000051_Node000012"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6960.77,-402.17C6918.39,-380 6843.31,-344.37 6774,-330 6505.13,-274.26 4494.26,-278.38 4099.24,-279.73"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6959.33,-405.37 6969.8,-406.96 6962.6,-399.18 6959.33,-405.37"/>
+<path fill="none" stroke="#63b8ff" d="M733.16,-416.42C818.07,-410.05 951.45,-396.32 994.5,-371 1025.6,-352.71 1047.71,-314.79 1058,-294.15"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="732.77,-412.94 723.06,-417.17 733.29,-419.92 732.77,-412.94"/>
</a>
</g>
</g>
@@ -1963,8 +1963,8 @@
<g id="edge81_Node000051_Node000013" class="edge">
<title>Node51->Node13</title>
<g id="a_edge81_Node000051_Node000013"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6967.93,-400.94C6939.07,-380.43 6891.37,-348.96 6846,-330 6784.73,-304.4 6763.05,-317.63 6701,-294 6674.25,-283.81 6671.73,-271.12 6644,-264 6508.92,-229.34 4362.79,-216.61 3926.16,-214.37"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6966.09,-403.94 6976.26,-406.93 6970.18,-398.25 6966.09,-403.94"/>
+<path fill="none" stroke="#63b8ff" d="M659.85,-396.76C660.48,-353.15 661.79,-262.81 662.3,-228.05"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="656.35,-396.72 659.71,-406.77 663.35,-396.82 656.35,-396.72"/>
</a>
</g>
</g>
@@ -1972,8 +1972,8 @@
<g id="edge73_Node000051_Node000017" class="edge">
<title>Node51->Node17</title>
<g id="a_edge73_Node000051_Node000017"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6921.22,-410.87C6907.23,-409.3 6892.68,-407.9 6879,-407 6166.72,-360.17 4377.77,-436.97 3667,-371 3651.61,-369.57 3635.15,-367.17 3619.74,-364.53"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6920.96,-414.37 6931.3,-412.05 6921.77,-407.41 6920.96,-414.37"/>
+<path fill="none" stroke="#63b8ff" d="M633.41,-400.63C618.97,-389.35 601.39,-375.62 588.48,-365.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="631.45,-403.54 641.49,-406.94 635.76,-398.02 631.45,-403.54"/>
</a>
</g>
</g>
@@ -1981,8 +1981,8 @@
<g id="edge74_Node000051_Node000018" class="edge">
<title>Node51->Node18</title>
<g id="a_edge74_Node000051_Node000018"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M6921.22,-410.89C6907.22,-409.31 6892.68,-407.91 6879,-407 5590.18,-321.49 5262.88,-438.77 3973,-371 3932.41,-368.87 3887.54,-364.92 3849.73,-361.13"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="6920.96,-414.38 6931.3,-412.06 6921.77,-407.43 6920.96,-414.38"/>
+<path fill="none" stroke="#63b8ff" d="M717.64,-404.09C758.28,-392.28 811.92,-376.68 850.21,-365.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="716.49,-400.78 707.87,-406.94 718.44,-407.5 716.49,-400.78"/>
</a>
</g>
</g>
@@ -1990,8 +1990,8 @@
<g id="edge75_Node000051_Node000052" class="edge">
<title>Node51->Node52</title>
<g id="a_edge75_Node000051_Node000052"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7021.97,-400.63C7036.9,-389.35 7055.07,-375.62 7068.41,-365.54"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7019.49,-398.12 7013.62,-406.94 7023.71,-403.7 7019.49,-398.12"/>
+<path fill="none" stroke="#63b8ff" d="M602.33,-404.02C562.56,-392.21 510.19,-376.65 472.78,-365.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="601.56,-407.44 612.15,-406.94 603.56,-400.73 601.56,-407.44"/>
</a>
</g>
</g>
@@ -1999,8 +1999,8 @@
<g id="edge76_Node000052_Node000012" class="edge">
<title>Node52->Node12</title>
<g id="a_edge76_Node000052_Node000012"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7012.81,-340.5C6977.23,-336.56 6933.96,-332.31 6895,-330 6325.4,-296.16 4475.15,-282.8 4099.07,-280.41"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7012.78,-344.02 7023.11,-341.66 7013.56,-337.06 7012.78,-344.02"/>
+<path fill="none" stroke="#63b8ff" d="M482.02,-333.1C487.23,-331.92 492.44,-330.86 497.5,-330 713.2,-293.23 771.47,-321.86 988.5,-294 991.43,-293.62 994.41,-293.21 997.43,-292.77"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="480.98,-329.75 472.07,-335.5 482.62,-336.56 480.98,-329.75"/>
</a>
</g>
</g>
@@ -2008,8 +2008,8 @@
<g id="edge78_Node000052_Node000013" class="edge">
<title>Node52->Node13</title>
<g id="a_edge78_Node000052_Node000013"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7024.1,-333.16C7019.01,-332.02 7013.93,-330.95 7009,-330 6894.47,-307.82 6858.66,-333.79 6749,-294 6725.35,-285.42 6725.12,-271.15 6701,-264 6564.42,-223.53 4368.78,-215.42 3926.33,-214.19"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7023.35,-336.58 7033.88,-335.41 7024.92,-329.76 7023.35,-336.58"/>
+<path fill="none" stroke="#63b8ff" d="M459.24,-330.21C507.55,-302.59 595.28,-252.43 637.92,-228.05"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="457.36,-327.25 450.42,-335.26 460.83,-333.33 457.36,-327.25"/>
</a>
</g>
</g>
@@ -2017,8 +2017,8 @@
<g id="edge77_Node000052_Node000014" class="edge">
<title>Node52->Node14</title>
<g id="a_edge77_Node000052_Node000014"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7013.51,-335.34C6962.55,-325.06 6893.29,-310.17 6833,-294 6790.64,-282.64 6781.71,-273.93 6739,-264 6316.8,-165.83 5799.61,-109.18 5601.04,-89.72"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7012.96,-338.8 7023.45,-337.34 7014.33,-331.94 7012.96,-338.8"/>
+<path fill="none" stroke="#63b8ff" d="M426.75,-325.31C428.98,-285.08 434.18,-201.96 442.5,-132 443.93,-119.95 446.14,-106.37 447.88,-96.4"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="423.25,-325.29 426.2,-335.47 430.24,-325.67 423.25,-325.29"/>
</a>
</g>
</g>
@@ -2026,8 +2026,8 @@
<g id="edge79_Node000052_Node000015" class="edge">
<title>Node52->Node15</title>
<g id="a_edge79_Node000052_Node000015"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7013.11,-339.34C6942.58,-325 6847,-291.3 6847,-214 6847,-214 6847,-214 6847,-146 6847,-30.5 5969.82,-17.41 5704.27,-16.09"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7012.83,-342.86 7023.31,-341.32 7014.16,-335.98 7012.83,-342.86"/>
+<path fill="none" stroke="#63b8ff" d="M408.83,-326.9C372.81,-275.07 295.82,-145.99 358.5,-66 374.42,-45.68 435.33,-32.5 486.31,-24.81"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="406.2,-329.23 414.84,-335.37 411.91,-325.19 406.2,-329.23"/>
</a>
</g>
</g>
@@ -2035,8 +2035,8 @@
<g id="edge80_Node000052_Node000016" class="edge">
<title>Node52->Node16</title>
<g id="a_edge80_Node000052_Node000016"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7087,-325.31C7087,-282.85 7087,-196.17 7087,-162.15"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7083.5,-325.33 7087,-335.33 7090.5,-325.33 7083.5,-325.33"/>
+<path fill="none" stroke="#63b8ff" d="M440.07,-326.91C467.07,-285.06 524.14,-196.61 546.37,-162.15"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="437.12,-325.03 434.64,-335.33 443,-328.83 437.12,-325.03"/>
</a>
</g>
</g>
@@ -2044,8 +2044,8 @@
<g id="edge83_Node000053_Node000014" class="edge">
<title>Node53->Node14</title>
<g id="a_edge83_Node000053_Node000014"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9978.3,-396.69C9971.2,-368.75 9961,-321.43 9961,-280 9961,-280 9961,-280 9961,-212 9961,-98.57 6211.06,-83.83 5601.32,-82.19"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9975.01,-397.94 9980.93,-406.73 9981.78,-396.16 9975.01,-397.94"/>
+<path fill="none" stroke="#63b8ff" d="M70.27,-397.05C89.16,-331 142.39,-149.97 163.5,-132 167.45,-128.64 284.12,-109.07 367.47,-95.43"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="66.82,-396.39 67.45,-406.96 73.55,-398.3 66.82,-396.39"/>
</a>
</g>
</g>
@@ -2053,8 +2053,8 @@
<g id="edge84_Node000053_Node000015" class="edge">
<title>Node53->Node15</title>
<g id="a_edge84_Node000053_Node000015"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9992.79,-397.05C10005.91,-351.58 10026.27,-252.48 9975,-198 9797.81,-9.71 9654.88,-150.66 9397,-132 7912.76,-24.6 6092.61,-16.47 5704.13,-16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9989.36,-396.31 9989.81,-406.89 9996.06,-398.33 9989.36,-396.31"/>
+<path fill="none" stroke="#63b8ff" d="M63.5,-396.92C63.5,-368.85 63.5,-321.06 63.5,-280 63.5,-280 63.5,-280 63.5,-146 63.5,-59.66 347.28,-29.59 486.41,-20.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="60,-396.99 63.5,-406.99 67,-396.99 60,-396.99"/>
</a>
</g>
</g>
@@ -2062,8 +2062,8 @@
<g id="edge85_Node000053_Node000016" class="edge">
<title>Node53->Node16</title>
<g id="a_edge85_Node000053_Node000016"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9967.48,-398.77C9960.89,-390.21 9953.45,-380.26 9947,-371 9894.94,-296.22 9916.46,-242.58 9837,-198 9776.83,-164.24 7582.58,-150.68 7157.8,-148.37"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9964.81,-401.04 9973.7,-406.79 9970.34,-396.75 9964.81,-401.04"/>
+<path fill="none" stroke="#63b8ff" d="M87.66,-400.27C97.7,-391.44 109.35,-380.92 119.5,-371 194.86,-297.4 189.03,-248.44 281.5,-198 344.64,-163.56 426.92,-152.26 484.77,-148.84"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="85.26,-397.72 80.02,-406.93 89.86,-403 85.26,-397.72"/>
</a>
</g>
</g>
@@ -2071,8 +2071,8 @@
<g id="edge94_Node000056_Node000049" class="edge">
<title>Node56->Node49</title>
<g id="a_edge94_Node000056_Node000049"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9751.66,-1062.36C9766.3,-1054.71 9781.01,-1044.42 9791,-1031 9830.66,-977.71 9823,-951.43 9823,-885 9823,-885 9823,-885 9823,-751 9823,-672.35 9775.34,-663.71 9723,-605 9715.56,-596.65 9657.24,-543.5 9647,-539 9517.6,-482.1 9470.9,-523.19 9331,-503 9326.53,-502.36 9321.94,-501.65 9317.31,-500.92"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9750.04,-1059.26 9742.59,-1066.79 9753.11,-1065.55 9750.04,-1059.26"/>
+<path fill="none" stroke="#63b8ff" d="M2726.45,-1056.64C2729.68,-1004.6 2743.78,-880.95 2805.5,-803 2823.79,-779.9 2893.11,-747.86 2920.5,-737 2984.63,-711.57 3028.74,-755.15 3071.5,-701 3079.76,-690.54 3079,-682.03 3071.5,-671 3047.05,-635.03 3004.95,-670.97 2980.5,-635 2973,-623.97 2977.36,-617.96 2980.5,-605 2988.27,-572.93 2989.19,-560.17 3014.5,-539 3041.75,-516.22 3079.27,-503.81 3111.44,-497.05"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2722.95,-1056.72 2725.91,-1066.9 2729.94,-1057.1 2722.95,-1056.72"/>
</a>
</g>
</g>
@@ -2080,8 +2080,8 @@
<g id="edge95_Node000056_Node000057" class="edge">
<title>Node56->Node57</title>
<g id="a_edge95_Node000056_Node000057"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9753.37,-1063.72C9784.46,-1053.47 9823.36,-1040.63 9852.53,-1031.01"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9751.97,-1060.5 9743.57,-1066.95 9754.17,-1067.15 9751.97,-1060.5"/>
+<path fill="none" stroke="#63b8ff" d="M2751.79,-1060.48C2764.05,-1050.91 2778.32,-1039.77 2789.35,-1031.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2749.43,-1057.88 2743.7,-1066.8 2753.74,-1063.4 2749.43,-1057.88"/>
</a>
</g>
</g>
@@ -2089,9 +2089,9 @@
<g id="Node000058" class="node">
<title>Node58</title>
<g id="a_Node000058"><a xlink:href="tirx_2script_2ir__builder_2frame_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8749,-701 8625,-701 8625,-671 8749,-671 8749,-701"/>
-<text text-anchor="start" x="8633" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/script</text>
-<text text-anchor="middle" x="8687" y="-678" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
+<polygon fill="white" stroke="#666666" points="1531.5,-701 1407.5,-701 1407.5,-671 1531.5,-671 1531.5,-701"/>
+<text text-anchor="start" x="1415.5" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/script</text>
+<text text-anchor="middle" x="1469.5" y="-678" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
</a>
</g>
</g>
@@ -2099,8 +2099,8 @@
<g id="edge97_Node000056_Node000058" class="edge">
<title>Node56->Node58</title>
<g id="a_edge97_Node000056_Node000058"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9685.67,-1058.28C9673.88,-1041.57 9656.66,-1018.78 9639,-1001 9605.54,-967.32 9594.82,-960.86 9555,-935 9449.62,-866.58 9424.74,-841.06 9305,-803 9187.11,-765.53 9150.71,-789.12 9029,-767 8925.66,-748.22 8806.55,-718.5 8739.68,-701.05"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9683.06,-1060.64 9691.64,-1066.86 9688.81,-1056.65 9683.06,-1060.64"/>
+<path fill="none" stroke="#63b8ff" d="M2662.43,-1064.25C2548.4,-1033.64 2300.63,-965.67 2094.5,-899 2043.84,-882.61 1694.17,-753.36 1643.5,-737 1602.82,-723.87 1556.26,-710.57 1521.54,-701"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2661.82,-1067.71 2672.38,-1066.92 2663.63,-1060.95 2661.82,-1067.71"/>
</a>
</g>
</g>
@@ -2108,8 +2108,8 @@
<g id="edge96_Node000057_Node000049" class="edge">
<title>Node57->Node49</title>
<g id="a_edge96_Node000057_Node000049"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M9896.19,-990.87C9897.37,-964.77 9899,-921.95 9899,-885 9899,-885 9899,-885 9899,-751 9899,-684.93 9721.81,-554.92 9685,-539 9539.85,-476.22 9487.66,-524.64 9331,-503 9326.53,-502.38 9321.93,-501.7 9317.3,-500.98"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="9892.69,-990.81 9895.72,-1000.96 9899.68,-991.14 9892.69,-990.81"/>
+<path fill="none" stroke="#63b8ff" d="M2802.13,-990.83C2794.15,-948.19 2784.28,-858.87 2826.5,-803 2853.47,-767.31 2880.86,-787.74 2920.5,-767 2941.47,-756.03 2942.9,-746.67 2964.5,-737 3025.11,-709.87 3068.59,-753.3 3109.5,-701 3117.71,-690.5 3117.45,-681.71 3109.5,-671 3076.57,-626.63 3023.43,-679.37 2990.5,-635 2982.55,-624.29 2984.02,-616.65 2990.5,-605 3020.32,-551.42 3086.25,-519.43 3131.29,-503.02"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2798.74,-991.73 2804.14,-1000.85 2805.61,-990.35 2798.74,-991.73"/>
</a>
</g>
</g>
@@ -2117,9 +2117,9 @@
<g id="Node000059" class="node">
<title>Node59</title>
<g id="a_Node000059"><a xlink:href="s__tir_2script_2ir__builder_2frame_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8413,-635 8285,-635 8285,-605 8413,-605 8413,-635"/>
-<text text-anchor="start" x="8293" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/script</text>
-<text text-anchor="middle" x="8349" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
+<polygon fill="white" stroke="#666666" points="1597.5,-635 1469.5,-635 1469.5,-605 1597.5,-605 1597.5,-635"/>
+<text text-anchor="start" x="1477.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/script</text>
+<text text-anchor="middle" x="1533.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/frame.h</text>
</a>
</g>
</g>
@@ -2127,8 +2127,8 @@
<g id="edge98_Node000058_Node000059" class="edge">
<title>Node58->Node59</title>
<g id="a_edge98_Node000058_Node000059"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8614.47,-671.27C8554.6,-659.93 8470.44,-644 8413.03,-633.12"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8614.14,-674.77 8624.61,-673.19 8615.44,-667.89 8614.14,-674.77"/>
+<path fill="none" stroke="#63b8ff" d="M1490.85,-663.65C1500.23,-654.27 1510.97,-643.53 1519.34,-635.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1488.3,-661.25 1483.7,-670.8 1493.25,-666.2 1488.3,-661.25"/>
</a>
</g>
</g>
@@ -2136,9 +2136,9 @@
<g id="Node000061" class="node">
<title>Node61</title>
<g id="a_Node000061"><a xlink:href="tirx_2script_2ir__builder_2ir_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8801,-635 8677,-635 8677,-605 8801,-605 8801,-635"/>
-<text text-anchor="start" x="8685" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/script</text>
-<text text-anchor="middle" x="8739" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
+<polygon fill="white" stroke="#666666" points="1413.5,-635 1289.5,-635 1289.5,-605 1413.5,-605 1413.5,-635"/>
+<text text-anchor="start" x="1297.5" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/script</text>
+<text text-anchor="middle" x="1351.5" y="-612" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
</a>
</g>
</g>
@@ -2146,8 +2146,8 @@
<g id="edge100_Node000058_Node000061" class="edge">
<title>Node58->Node61</title>
<g id="a_edge100_Node000058_Node000061"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8705.03,-662.81C8712.48,-653.64 8720.9,-643.28 8727.49,-635.16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8702.13,-660.83 8698.54,-670.8 8707.56,-665.24 8702.13,-660.83"/>
+<path fill="none" stroke="#63b8ff" d="M1434.66,-666.11C1416.3,-656.14 1394.15,-644.13 1377.34,-635.01"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1433.15,-669.26 1443.6,-670.95 1436.48,-663.11 1433.15,-669.26"/>
</a>
</g>
</g>
@@ -2155,9 +2155,9 @@
<g id="Node000060" class="node">
<title>Node60</title>
<g id="a_Node000060"><a xlink:href="s__tir_2script_2ir__builder_2ir_8h.html" target="_top" xlink:title=" ">
-<polygon fill="white" stroke="#666666" points="8730,-569 8602,-569 8602,-539 8730,-539 8730,-569"/>
-<text text-anchor="start" x="8610" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/script</text>
-<text text-anchor="middle" x="8666" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
+<polygon fill="white" stroke="#666666" points="1506.5,-569 1378.5,-569 1378.5,-539 1506.5,-539 1506.5,-569"/>
+<text text-anchor="start" x="1386.5" y="-557" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/script</text>
+<text text-anchor="middle" x="1442.5" y="-546" font-family="Helvetica,sans-Serif" font-size="10.00">/ir_builder/ir.h</text>
</a>
</g>
</g>
@@ -2165,8 +2165,8 @@
<g id="edge99_Node000059_Node000060" class="edge">
<title>Node59->Node60</title>
<g id="a_edge99_Node000059_Node000060"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8423.05,-604.05C8477.3,-593.1 8550.2,-578.38 8601.95,-567.93"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8422.26,-600.64 8413.15,-606.05 8423.64,-607.5 8422.26,-600.64"/>
+<path fill="none" stroke="#63b8ff" d="M1505.1,-599.03C1491.33,-589.34 1475.12,-577.94 1462.64,-569.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1503.11,-601.91 1513.3,-604.8 1507.14,-596.18 1503.11,-601.91"/>
</a>
</g>
</g>
@@ -2174,1101 +2174,1110 @@
<g id="edge101_Node000061_Node000060" class="edge">
<title>Node61->Node60</title>
<g id="a_edge101_Node000061_Node000060"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M8715.28,-598.2C8704.44,-588.7 8691.88,-577.69 8682.16,-569.16"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="8712.97,-600.84 8722.8,-604.8 8717.59,-595.57 8712.97,-600.84"/>
+<path fill="none" stroke="#63b8ff" d="M1379.9,-599.03C1393.67,-589.34 1409.88,-577.94 1422.36,-569.16"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1377.86,-596.18 1371.7,-604.8 1381.89,-601.91 1377.86,-596.18"/>
</a>
</g>
</g>
-<!-- Node64->Node58 -->
-<g id="edge263_Node000064_Node000058" class="edge">
-<title>Node64->Node58</title>
-<g id="a_edge263_Node000064_Node000058"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7697.03,-1057.38C7710.82,-1017.09 7738.02,-939.02 7743,-935 7830.67,-864.18 7889.17,-940.36 7994,-899 8015.68,-890.45 8016.24,-879.59 8037,-869 8238.47,-766.22 8505.6,-714.97 8624.88,-695.97"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7693.67,-1056.37 7693.76,-1066.97 7700.3,-1058.64 7693.67,-1056.37"/>
+<!-- Node63->Node58 -->
+<g id="edge262_Node000063_Node000058" class="edge">
+<title>Node63->Node58</title>
+<g id="a_edge262_Node000063_Node000058"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2003.62,-1057.22C1991.52,-1026.81 1967.73,-973.47 1936.5,-935 1878.17,-863.17 1856.51,-847.71 1775.5,-803 1731.2,-778.55 1714.98,-784.49 1667.5,-767 1608.88,-745.41 1541.65,-717.58 1502.54,-701.08"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2000.39,-1058.55 2007.27,-1066.6 2006.91,-1056.02 2000.39,-1058.55"/>
</a>
</g>
</g>
-<!-- Node64->Node61 -->
-<g id="edge264_Node000064_Node000061" class="edge">
-<title>Node64->Node61</title>
-<g id="a_edge264_Node000064_Node000061"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7708.6,-1059.45C7725.42,-1041.94 7751,-1017.51 7777,-1001 7879.01,-936.24 7917,-944.33 8029,-899 8060.75,-886.15 8068,-881.22 8100,-869 8184.69,-836.67 8205.36,-826.2 8293,-803 8351.61,-787.49 8790.35,-747.7 8829,-701 8850.53,-674.99 8809.07,-649.96 8775.54,-635.02"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7705.84,-1057.28 7701.52,-1066.96 7710.93,-1062.09 7705.84,-1057.28"/>
+<!-- Node63->Node61 -->
+<g id="edge263_Node000063_Node000061" class="edge">
+<title>Node63->Node61</title>
+<g id="a_edge263_Node000063_Node000061"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1991.31,-1059.21C1961.51,-1029.21 1904.77,-974.42 1850.5,-935 1755.45,-865.96 1725.92,-856.82 1621.5,-803 1524.63,-753.06 1479.4,-774.03 1398.5,-701 1377.93,-682.43 1363.79,-652.7 1356.72,-635.19"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1989.12,-1061.97 1998.64,-1066.63 1994.1,-1057.05 1989.12,-1061.97"/>
</a>
</g>
</g>
-<!-- Node65 -->
-<g id="Node000065" class="node">
-<title>Node65</title>
-<g id="a_Node000065"><a xlink:href="exec__context_8h.html" target="_top" xlink:title="Compile-time ExecContext state: the active thread set A as a TileLayout and the (inter,...">
-<polygon fill="white" stroke="#666666" points="7576.5,-965 7457.5,-965 7457.5,-935 7576.5,-935 7576.5,-965"/>
-<text text-anchor="start" x="7465.5" y="-953" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/exec</text>
-<text text-anchor="middle" x="7517" y="-942" font-family="Helvetica,sans-Serif" font-size="10.00">_context.h</text>
+<!-- Node64 -->
+<g id="Node000064" class="node">
+<title>Node64</title>
+<g id="a_Node000064"><a xlink:href="exec__context_8h.html" target="_top" xlink:title="Compile-time ExecContext state: the active thread set A as a TileLayout and the (inter,...">
+<polygon fill="white" stroke="#666666" points="2199,-965 2080,-965 2080,-935 2199,-935 2199,-965"/>
+<text text-anchor="start" x="2088" y="-953" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/exec</text>
+<text text-anchor="middle" x="2139.5" y="-942" font-family="Helvetica,sans-Serif" font-size="10.00">_context.h</text>
</a>
</g>
</g>
-<!-- Node64->Node65 -->
-<g id="edge106_Node000064_Node000065" class="edge">
-<title>Node64->Node65</title>
-<g id="a_edge106_Node000064_Node000065"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7661.9,-1060.52C7626.71,-1033.92 7566.2,-988.18 7535.71,-965.14"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7660.18,-1063.6 7670.27,-1066.84 7664.4,-1058.02 7660.18,-1063.6"/>
+<!-- Node63->Node64 -->
+<g id="edge105_Node000063_Node000064" class="edge">
+<title>Node63->Node64</title>
+<g id="a_edge105_Node000063_Node000064"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2035.57,-1059.88C2044.99,-1051.09 2055.9,-1040.69 2065.5,-1031 2087.73,-1008.55 2112.45,-981.35 2126.95,-965.14"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2033.02,-1057.46 2028.07,-1066.83 2037.78,-1062.6 2033.02,-1057.46"/>
</a>
</g>
</g>
-<!-- Node64->Node66 -->
-<g id="edge107_Node000064_Node000066" class="edge">
-<title>Node64->Node66</title>
-<g id="a_edge107_Node000064_Node000066"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7734.74,-1063.26C7766.47,-1050.95 7807.32,-1035.11 7832.04,-1025.52"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7733.27,-1060.08 7725.21,-1066.95 7735.8,-1066.6 7733.27,-1060.08"/>
+<!-- Node63->Node65 -->
+<g id="edge106_Node000063_Node000065" class="edge">
+<title>Node63->Node65</title>
+<g id="a_edge106_Node000063_Node000065"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1965.25,-1063.42C1932.11,-1051.09 1889.27,-1035.15 1863.39,-1025.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1964.16,-1066.75 1974.75,-1066.95 1966.6,-1060.19 1964.16,-1066.75"/>
</a>
</g>
</g>
-<!-- Node67 -->
-<g id="Node000067" class="node">
-<title>Node67</title>
-<g id="a_Node000067"><a xlink:href="tirx_2stmt_8h.html" target="_top" xlink:title="TIR statements.">
-<polygon fill="white" stroke="#666666" points="7778,-827.5 7650,-827.5 7650,-808.5 7778,-808.5 7778,-827.5"/>
-<text text-anchor="middle" x="7714" y="-815.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/stmt.h</text>
+<!-- Node66 -->
+<g id="Node000066" class="node">
+<title>Node66</title>
+<g id="a_Node000066"><a xlink:href="tirx_2stmt_8h.html" target="_top" xlink:title="TIR statements.">
+<polygon fill="white" stroke="#666666" points="2069.5,-827.5 1941.5,-827.5 1941.5,-808.5 2069.5,-808.5 2069.5,-827.5"/>
+<text text-anchor="middle" x="2005.5" y="-815.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/stmt.h</text>
</a>
</g>
</g>
-<!-- Node64->Node67 -->
-<g id="edge265_Node000064_Node000067" class="edge">
-<title>Node64->Node67</title>
-<g id="a_edge265_Node000064_Node000067"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7691.31,-1056.82C7696.67,-1000.66 7709.75,-863.5 7713.17,-827.68"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7687.81,-1056.63 7690.34,-1066.91 7694.78,-1057.29 7687.81,-1056.63"/>
+<!-- Node63->Node66 -->
+<g id="edge264_Node000063_Node000066" class="edge">
+<title>Node63->Node66</title>
+<g id="a_edge264_Node000063_Node000066"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2011.85,-1056.82C2010.35,-1000.66 2006.69,-863.5 2005.73,-827.68"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2008.36,-1057.01 2012.12,-1066.91 2015.36,-1056.82 2008.36,-1057.01"/>
</a>
</g>
</g>
-<!-- Node126 -->
-<g id="Node000126" class="node">
-<title>Node126</title>
-<g id="a_Node000126"><a xlink:href="tile__primitive_8h.html" target="_top" xlink:title="TIRX tile primitive statements, operators, and reified lambda expressions.">
-<polygon fill="white" stroke="#666666" points="7550.5,-767 7437.5,-767 7437.5,-737 7550.5,-737 7550.5,-767"/>
-<text text-anchor="start" x="7445.5" y="-755" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/tile</text>
-<text text-anchor="middle" x="7494" y="-744" font-family="Helvetica,sans-Serif" font-size="10.00">_primitive.h</text>
+<!-- Node125 -->
+<g id="Node000125" class="node">
+<title>Node125</title>
+<g id="a_Node000125"><a xlink:href="tile__primitive_8h.html" target="_top" xlink:title="TIRX tile primitive statements, operators, and reified lambda expressions.">
+<polygon fill="white" stroke="#666666" points="2338,-767 2225,-767 2225,-737 2338,-737 2338,-767"/>
+<text text-anchor="start" x="2233" y="-755" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/tirx/tile</text>
+<text text-anchor="middle" x="2281.5" y="-744" font-family="Helvetica,sans-Serif" font-size="10.00">_primitive.h</text>
</a>
</g>
</g>
-<!-- Node64->Node126 -->
-<g id="edge266_Node000064_Node000126" class="edge">
-<title>Node64->Node126</title>
-<g id="a_edge266_Node000064_Node000126"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7675.36,-1058.06C7637.65,-994.63 7532.74,-818.16 7502.35,-767.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7672.5,-1060.1 7680.62,-1066.91 7678.52,-1056.52 7672.5,-1060.1"/>
+<!-- Node63->Node125 -->
+<g id="edge265_Node000063_Node000125" class="edge">
+<title>Node63->Node125</title>
+<g id="a_edge265_Node000063_Node000125"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2019.33,-1056.6C2030.23,-1019.42 2052.26,-951.17 2071.5,-935 2129.96,-885.87 2183.67,-951.1 2239.5,-899 2277.49,-863.55 2281.88,-796.2 2281.89,-767.04"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2015.85,-1056.05 2016.45,-1066.62 2022.58,-1057.98 2015.85,-1056.05"/>
</a>
</g>
</g>
-<!-- Node66->Node61 -->
-<g id="edge109_Node000066_Node000061" class="edge">
-<title>Node66->Node61</title>
-<g id="a_edge109_Node000066_Node000061"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7876.36,-1001.21C7904.51,-984.23 7954.67,-955.14 8000,-935 8007.88,-931.5 8285.44,-837.14 8293,-833 8311.87,-822.65 8310.99,-810.91 8331,-803 8506.88,-733.47 8574.81,-824.44 8755,-767 8810.05,-749.45 8838.33,-751.17 8867,-701 8873.62,-689.42 8874.52,-682.01 8867,-671 8857.92,-657.7 8822.82,-644.52 8791.67,-635.04"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7874.43,-998.3 7867.7,-1006.48 7878.06,-1004.28 7874.43,-998.3"/>
+<!-- Node65->Node61 -->
+<g id="edge108_Node000065_Node000061" class="edge">
+<title>Node65->Node61</title>
+<g id="a_edge108_Node000065_Node000061"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1802.77,-1003.35C1775.01,-994.25 1736.67,-980.56 1704.5,-965 1630.87,-929.38 1618.49,-909.61 1547.5,-869 1463.97,-821.21 1426,-833.56 1356.5,-767 1323.24,-735.15 1303.95,-715.02 1317.5,-671 1321.64,-657.56 1330.76,-644.49 1338.51,-635.08"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1801.9,-1006.75 1812.49,-1006.49 1804.05,-1000.08 1801.9,-1006.75"/>
</a>
</g>
</g>
-<!-- Node66->Node65 -->
-<g id="edge108_Node000066_Node000065" class="edge">
-<title>Node66->Node65</title>
-<g id="a_edge108_Node000066_Node000065"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7799.05,-1004.56C7737.93,-992.96 7639.53,-974.27 7576.59,-962.32"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7798.42,-1008.01 7808.9,-1006.44 7799.73,-1001.13 7798.42,-1008.01"/>
+<!-- Node65->Node64 -->
+<g id="edge107_Node000065_Node000064" class="edge">
+<title>Node65->Node64</title>
+<g id="a_edge107_Node000065_Node000064"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1890.53,-1004.29C1942.69,-993.13 2024.4,-975.64 2079.87,-963.76"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1889.56,-1000.92 1880.51,-1006.44 1891.03,-1007.76 1889.56,-1000.92"/>
</a>
</g>
</g>
-<!-- Node66->Node67 -->
-<g id="edge110_Node000066_Node000067" class="edge">
-<title>Node66->Node67</title>
-<g id="a_edge110_Node000066_Node000067"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7841.91,-998.07C7813.16,-957.82 7741.52,-857.52 7720.12,-827.57"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7839.14,-1000.22 7847.8,-1006.33 7844.84,-996.15 7839.14,-1000.22"/>
+<!-- Node65->Node66 -->
+<g id="edge109_Node000065_Node000066" class="edge">
+<title>Node65->Node66</title>
+<g id="a_edge109_Node000065_Node000066"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1854.32,-998.58C1887.92,-958.67 1972.96,-857.65 1998.28,-827.57"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1851.57,-996.42 1847.8,-1006.33 1856.92,-1000.93 1851.57,-996.42"/>
</a>
</g>
</g>
-<!-- Node66->Node127 -->
-<g id="edge257_Node000066_Node000127" class="edge">
-<title>Node66->Node127</title>
-<g id="a_edge257_Node000066_Node000127"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7893.13,-1003.56C7936.3,-990.95 8004.76,-970.94 8043.58,-959.6"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7892.15,-1000.2 7883.54,-1006.37 7894.12,-1006.92 7892.15,-1000.2"/>
+<!-- Node65->Node126 -->
+<g id="edge256_Node000065_Node000126" class="edge">
+<title>Node65->Node126</title>
+<g id="a_edge256_Node000065_Node000126"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1824.73,-998.98C1812.56,-986.62 1796.19,-969.99 1786.27,-959.91"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1822.49,-1001.7 1832,-1006.37 1827.48,-996.79 1822.49,-1001.7"/>
</a>
</g>
</g>
-<!-- Node67->Node5 -->
-<g id="edge253_Node000067_Node000005" class="edge">
-<title>Node67->Node5</title>
-<g id="a_edge253_Node000067_Node000005"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7692.04,-802.98C7662.96,-785.05 7609.55,-754.25 7560,-737 7555.26,-735.35 7435.63,-712.53 7360.64,-698.29"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7690.25,-806 7700.59,-808.32 7693.96,-800.06 7690.25,-806"/>
+<!-- Node66->Node5 -->
+<g id="edge252_Node000066_Node000005" class="edge">
+<title>Node66->Node5</title>
+<g id="a_edge252_Node000066_Node000005"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2056.74,-806C2090.57,-797.7 2135.36,-784.7 2172.5,-767 2193.87,-756.82 2194.11,-744.69 2216.5,-737 2336.54,-695.78 2660.68,-717.66 2786.5,-701 2789.53,-700.6 2792.63,-700.14 2795.75,-699.65"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2055.52,-802.69 2046.61,-808.43 2057.15,-809.5 2055.52,-802.69"/>
</a>
</g>
</g>
-<!-- Node67->Node8 -->
-<g id="edge112_Node000067_Node000008" class="edge">
-<title>Node67->Node8</title>
-<g id="a_edge112_Node000067_Node000008"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7716.64,-797.97C7722.19,-765.85 7738.32,-701.41 7781,-671 7914.84,-575.64 8017.57,-733.65 8149,-635 8169.94,-619.28 8177.2,-587.67 8179.7,-569.24"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7713.12,-797.8 7715.04,-808.22 7720.04,-798.88 7713.12,-797.8"/>
+<!-- Node66->Node8 -->
+<g id="edge111_Node000066_Node000008" class="edge">
+<title>Node66->Node8</title>
+<g id="a_edge111_Node000066_Node000008"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1973.67,-804.7C1908.4,-779.17 1764.43,-721.12 1751.5,-701 1744.48,-690.07 1743.64,-632.37 1754.5,-605 1759.99,-591.17 1770.99,-578.49 1780.49,-569.36"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1972.48,-807.99 1983.07,-808.37 1975.02,-801.47 1972.48,-807.99"/>
</a>
</g>
</g>
-<!-- Node67->Node26 -->
-<g id="edge124_Node000067_Node000026" class="edge">
-<title>Node67->Node26</title>
-<g id="a_edge124_Node000067_Node000026"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7711.76,-798.12C7709.12,-765.68 7709.29,-700.07 7749,-671 7803,-631.46 8003.6,-685.07 8048,-635 8101.34,-574.85 7960.17,-518.51 7898.84,-497.58"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7708.32,-798.84 7712.8,-808.44 7715.28,-798.14 7708.32,-798.84"/>
+<!-- Node66->Node26 -->
+<g id="edge123_Node000066_Node000026" class="edge">
+<title>Node66->Node26</title>
+<g id="a_edge123_Node000066_Node000026"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1951.19,-806.42C1901.97,-796.25 1833.58,-780.48 1809.5,-767 1791.12,-756.72 1753.41,-718.37 1741.5,-701 1692.67,-629.76 1662.17,-527.81 1653.83,-497.69"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1950.57,-809.87 1961.07,-808.44 1951.97,-803.01 1950.57,-809.87"/>
</a>
</g>
</g>
-<!-- Node67->Node34 -->
-<g id="edge111_Node000067_Node000034" class="edge">
-<title>Node67->Node34</title>
-<g id="a_edge111_Node000067_Node000034"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7729.53,-800.8C7761.02,-769.16 7836.14,-699.75 7915,-671 8021.12,-632.32 8309.82,-648.19 8422,-635 8434.33,-633.55 8447.6,-631.57 8459.9,-629.55"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7726.66,-798.73 7722.16,-808.32 7731.66,-803.63 7726.66,-798.73"/>
+<!-- Node66->Node34 -->
+<g id="edge110_Node000066_Node000034" class="edge">
+<title>Node66->Node34</title>
+<g id="a_edge110_Node000066_Node000034"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1942.61,-806.83C1887.3,-797.55 1804.75,-782.9 1733.5,-767 1682.37,-755.59 1670.75,-747.89 1619.5,-737 1522.16,-716.31 1494.45,-727.39 1398.5,-701 1327.83,-681.56 1248.01,-645.8 1213.25,-629.5"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1942.17,-810.3 1952.61,-808.49 1943.32,-803.4 1942.17,-810.3"/>
</a>
</g>
</g>
-<!-- Node67->Node37 -->
-<g id="edge125_Node000067_Node000037" class="edge">
-<title>Node67->Node37</title>
-<g id="a_edge125_Node000067_Node000037"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7788.35,-812.47C7846.24,-806.9 7927.62,-794.51 7994,-767 8015.53,-758.08 8015.23,-745.32 8037,-737 8160.79,-689.68 8201.78,-719.53 8333,-701 8344.66,-699.35 8357.18,-697.43 8368.99,-695.55"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7787.83,-809.01 7778.19,-813.4 7788.47,-815.98 7787.83,-809.01"/>
+<!-- Node66->Node37 -->
+<g id="edge124_Node000066_Node000037" class="edge">
+<title>Node66->Node37</title>
+<g id="a_edge124_Node000066_Node000037"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2041.39,-805.14C2067.71,-795.96 2104.03,-782.26 2134.5,-767 2157,-755.74 2158.62,-744.93 2182.5,-737 2366.61,-675.87 2424.93,-724.43 2617.5,-701 2629.95,-699.49 2643.35,-697.5 2655.82,-695.51"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2040.14,-801.87 2031.82,-808.44 2042.41,-808.49 2040.14,-801.87"/>
</a>
</g>
</g>
-<!-- Node67->Node58 -->
-<g id="edge252_Node000067_Node000058" class="edge">
-<title>Node67->Node58</title>
-<g id="a_edge252_Node000067_Node000058"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7780.63,-806.98C7844.45,-797.24 7943.42,-781.81 8029,-767 8100.29,-754.66 8117.39,-747.29 8189,-737 8345.11,-714.57 8530.18,-698.81 8624.68,-691.54"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7780.06,-803.52 7770.7,-808.49 7781.11,-810.44 7780.06,-803.52"/>
+<!-- Node66->Node58 -->
+<g id="edge251_Node000066_Node000058" class="edge">
+<title>Node66->Node58</title>
+<g id="a_edge251_Node000066_Node000058"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1948.58,-806.57C1892.58,-795.9 1811.26,-779.2 1781.5,-767 1758.22,-757.46 1756.93,-746.16 1733.5,-737 1728.77,-735.15 1608.17,-712.65 1531.62,-698.47"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1948.25,-810.07 1958.73,-808.49 1949.55,-803.19 1948.25,-810.07"/>
</a>
</g>
</g>
-<!-- Node68 -->
-<g id="Node000068" class="node">
-<title>Node68</title>
-<g id="a_Node000068"><a xlink:href="s__tir_2stmt_8h.html" target="_top" xlink:title="S-TIR (Schedulable TIR) statements and attributes.">
-<polygon fill="white" stroke="#666666" points="7664.5,-695.5 7531.5,-695.5 7531.5,-676.5 7664.5,-676.5 7664.5,-695.5"/>
-<text text-anchor="middle" x="7598" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/stmt.h</text>
+<!-- Node67 -->
+<g id="Node000067" class="node">
+<title>Node67</title>
+<g id="a_Node000067"><a xlink:href="s__tir_2stmt_8h.html" target="_top" xlink:title="S-TIR (Schedulable TIR) statements and attributes.">
+<polygon fill="white" stroke="#666666" points="2309,-695.5 2176,-695.5 2176,-676.5 2309,-676.5 2309,-695.5"/>
+<text text-anchor="middle" x="2242.5" y="-683.5" font-family="Helvetica,sans-Serif" font-size="10.00">include/tvm/s_tir/stmt.h</text>
</a>
</g>
</g>
-<!-- Node67->Node68 -->
-<g id="edge113_Node000067_Node000068" class="edge">
-<title>Node67->Node68</title>
-<g id="a_edge113_Node000067_Node000068"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7699.56,-800.82C7674.79,-773.06 7624.99,-717.24 7605.79,-695.73"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7697.12,-803.34 7706.39,-808.47 7702.34,-798.68 7697.12,-803.34"/>
+<!-- Node66->Node67 -->
+<g id="edge112_Node000066_Node000067" class="edge">
+<title>Node66->Node67</title>
+<g id="a_edge112_Node000066_Node000067"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1979.55,-803.21C1952.85,-787.27 1917.76,-760.24 1937.5,-737 1952.76,-719.03 2090.82,-702.17 2175.88,-693.36"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1978.12,-806.42 1988.53,-808.36 1981.6,-800.35 1978.12,-806.42"/>
</a>
</g>
</g>
-<!-- Node67->Node69 -->
-<g id="edge126_Node000067_Node000069" class="edge">
-<title>Node67->Node69</title>
-<g id="a_edge126_Node000067_Node000069"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7750.37,-805.24C7789.44,-792.61 7850.6,-772.85 7885.4,-761.6"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7749.14,-801.96 7740.7,-808.37 7751.29,-808.62 7749.14,-801.96"/>
+<!-- Node66->Node68 -->
+<g id="edge125_Node000066_Node000068" class="edge">
+<title>Node66->Node68</title>
+<g id="a_edge125_Node000066_Node000068"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2009.56,-798.45C2012.19,-786.43 2015.49,-771.32 2017.55,-761.91"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2006.11,-797.85 2007.39,-808.37 2012.94,-799.35 2006.11,-797.85"/>
</a>
</g>
</g>
-<!-- Node67->Node72 -->
-<g id="edge143_Node000067_Node000072" class="edge">
-<title>Node67->Node72</title>
-<g id="a_edge143_Node000067_Node000072"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7639.78,-813.62C7563.2,-810.28 7440.27,-805.35 7334,-803 5158.47,-754.94 4613.75,-803.62 2438,-767 2266.17,-764.11 2063.19,-758.03 1965.04,-754.92"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7639.66,-817.12 7649.81,-814.06 7639.97,-810.12 7639.66,-817.12"/>
+<!-- Node66->Node71 -->
+<g id="edge142_Node000066_Node000071" class="edge">
+<title>Node66->Node71</title>
+<g id="a_edge142_Node000066_Node000071"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2079.88,-815.66C2233.06,-812.94 2594.81,-806.71 2898.5,-803 4724.66,-780.69 5181.58,-803.85 7007.5,-767 7145.02,-764.23 7306.47,-758.5 7391.4,-755.3"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2079.6,-812.16 2069.66,-815.84 2079.72,-819.16 2079.6,-812.16"/>
</a>
</g>
</g>
-<!-- Node67->Node126 -->
-<g id="edge254_Node000067_Node000126" class="edge">
-<title>Node67->Node126</title>
-<g id="a_edge254_Node000067_Node000126"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7674.41,-805.48C7637.44,-794.73 7582.14,-778.64 7542.52,-767.12"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7673.75,-808.94 7684.33,-808.37 7675.71,-802.21 7673.75,-808.94"/>
+<!-- Node66->Node125 -->
+<g id="edge253_Node000066_Node000125" class="edge">
+<title>Node66->Node125</title>
+<g id="a_edge253_Node000066_Node000125"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2052.19,-806.17C2099.87,-795.12 2173.94,-777.94 2224.92,-766.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2051.39,-802.77 2042.44,-808.44 2052.97,-809.59 2051.39,-802.77"/>
</a>
</g>
</g>
-<!-- Node68->Node6 -->
-<g id="edge121_Node000068_Node000006" class="edge">
-<title>Node68->Node6</title>
-<g id="a_edge121_Node000068_Node000006"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7619.35,-670.62C7635.09,-660.01 7656.4,-645.66 7672.05,-635.12"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7617.15,-667.88 7610.81,-676.37 7621.06,-673.68 7617.15,-667.88"/>
+<!-- Node67->Node6 -->
+<g id="edge120_Node000067_Node000006" class="edge">
+<title>Node67->Node6</title>
+<g id="a_edge120_Node000067_Node000006"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2265.56,-671.21C2283.38,-660.55 2307.95,-645.85 2325.9,-635.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2263.72,-668.23 2256.93,-676.37 2267.31,-674.24 2263.72,-668.23"/>
</a>
</g>
</g>
-<!-- Node68->Node7 -->
-<g id="edge115_Node000068_Node000007" class="edge">
-<title>Node68->Node7</title>
-<g id="a_edge115_Node000068_Node000007"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7580.73,-669.73C7551.98,-644.3 7494.72,-593.67 7466.91,-569.07"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7578.55,-672.47 7588.35,-676.47 7583.18,-667.22 7578.55,-672.47"/>
+<!-- Node67->Node7 -->
+<g id="edge114_Node000067_Node000007" class="edge">
+<title>Node67->Node7</title>
+<g id="a_edge114_Node000067_Node000007"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2245.48,-666.25C2249.52,-647.53 2258.65,-619.51 2278.5,-605 2306.47,-584.55 2515.68,-567.82 2633.11,-559.91"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2242.01,-665.79 2243.61,-676.26 2248.89,-667.08 2242.01,-665.79"/>
</a>
</g>
</g>
-<!-- Node68->Node8 -->
-<g id="edge117_Node000068_Node000008" class="edge">
-<title>Node68->Node8</title>
-<g id="a_edge117_Node000068_Node000008"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7674.79,-675.65C7688.83,-674.03 7703.35,-672.41 7717,-671 7806.21,-661.76 8040.31,-678.03 8119,-635 8146.13,-620.16 8165.26,-587.91 8174.57,-569.21"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7674.21,-672.19 7664.68,-676.82 7675.02,-679.15 7674.21,-672.19"/>
+<!-- Node67->Node8 -->
+<g id="edge116_Node000067_Node000008" class="edge">
+<title>Node67->Node8</title>
+<g id="a_edge116_Node000067_Node000008"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2199.23,-673.95C2161.24,-664.12 2104.55,-649.16 2055.5,-635 1979.8,-613.15 1892.35,-585.53 1841.17,-569.12"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2198.39,-677.34 2208.95,-676.45 2200.14,-670.57 2198.39,-677.34"/>
</a>
</g>
</g>
-<!-- Node68->Node10 -->
-<g id="edge119_Node000068_Node000010" class="edge">
-<title>Node68->Node10</title>
-<g id="a_edge119_Node000068_Node000010"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7674.82,-675.86C7688.85,-674.22 7703.36,-672.54 7717,-671 7790.52,-662.68 7985.62,-674.79 8048,-635 8090.03,-608.19 8071.77,-575.24 8106,-539 8119.61,-524.59 8138.04,-512.01 8152.97,-503.07"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7674.23,-672.41 7664.7,-677.05 7675.04,-679.36 7674.23,-672.41"/>
+<!-- Node67->Node10 -->
+<g id="edge118_Node000067_Node000010" class="edge">
+<title>Node67->Node10</title>
+<g id="a_edge118_Node000067_Node000010"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2238.93,-666.3C2236.65,-648.28 2236.49,-621.39 2251.5,-605 2306.02,-545.49 2351.66,-590.34 2429.5,-569 2468.54,-558.3 2476.13,-548.41 2515.5,-539 2632.39,-511.07 2664.61,-520.55 2783.5,-503 2788.19,-502.31 2793.02,-501.58 2797.89,-500.83"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2235.48,-666.88 2240.51,-676.21 2242.39,-665.78 2235.48,-666.88"/>
</a>
</g>
</g>
-<!-- Node68->Node11 -->
-<g id="edge118_Node000068_Node000011" class="edge">
-<title>Node68->Node11</title>
-<g id="a_edge118_Node000068_Node000011"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7658.94,-674.48C7700.85,-665.86 7751.16,-652.28 7764,-635 7771.95,-624.3 7771.85,-615.78 7764,-605 7749.91,-585.66 7582.49,-543.58 7559,-539 7534.48,-534.22 6686.96,-474.13 6662,-473 5498.62,-420.52 4078.38,-421.62 3744.62,-422.7"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7658.17,-671.06 7649.05,-676.45 7659.54,-677.93 7658.17,-671.06"/>
+<!-- Node67->Node11 -->
+<g id="edge117_Node000067_Node000011" class="edge">
+<title>Node67->Node11</title>
+<g id="a_edge117_Node000067_Node000011"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2234.25,-666.74C2227.72,-649.25 2221.63,-622.94 2234.5,-605 2287.83,-530.65 2340.94,-561.98 2429.5,-539 2795.66,-444.01 2897.33,-466 3274.5,-437 3308.42,-434.39 3346.02,-431.41 3377.72,-428.88"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2231.16,-668.43 2238.21,-676.34 2237.63,-665.76 2231.16,-668.43"/>
</a>
</g>
</g>
-<!-- Node68->Node26 -->
-<g id="edge123_Node000068_Node000026" class="edge">
-<title>Node68->Node26</title>
-<g id="a_edge123_Node000068_Node000026"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7654.66,-674.6C7722.67,-661.89 7828.45,-641.29 7835,-635 7874.6,-596.96 7874.13,-523.08 7872.68,-497.76"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7653.7,-671.22 7644.51,-676.49 7654.98,-678.1 7653.7,-671.22"/>
+<!-- Node67->Node26 -->
+<g id="edge122_Node000067_Node000026" class="edge">
+<title>Node67->Node26</title>
+<g id="a_edge122_Node000067_Node000026"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2205.04,-673.43C2174.71,-663.83 2131.02,-649.45 2093.5,-635 1993.95,-596.66 1974.88,-572.2 1873.5,-539 1840.55,-528.21 1748.45,-508.72 1693.78,-497.52"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2204.19,-676.84 2214.78,-676.5 2206.29,-670.16 2204.19,-676.84"/>
</a>
</g>
</g>
-<!-- Node68->Node34 -->
-<g id="edge116_Node000068_Node000034" class="edge">
-<title>Node68->Node34</title>
-<g id="a_edge116_Node000068_Node000034"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7674.67,-680.37C7878.27,-668.08 8417.38,-635.52 8422,-635 8434.48,-633.6 8447.93,-631.61 8460.36,-629.57"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7674.42,-676.88 7664.65,-680.98 7674.84,-683.87 7674.42,-676.88"/>
+<!-- Node67->Node34 -->
+<g id="edge115_Node000067_Node000034" class="edge">
+<title>Node67->Node34</title>
+<g id="a_edge115_Node000067_Node000034"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2165.67,-678.87C2131.1,-676.23 2089.76,-673.24 2052.5,-671 1709.64,-650.38 1622.1,-670.97 1280.5,-635 1267.71,-633.65 1253.92,-631.63 1241.25,-629.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2165.46,-682.36 2175.7,-679.64 2166,-675.38 2165.46,-682.36"/>
</a>
</g>
</g>
-<!-- Node68->Node36 -->
-<g id="edge122_Node000068_Node000036" class="edge">
-<title>Node68->Node36</title>
-<g id="a_edge122_Node000068_Node000036"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7674.91,-681.71C7744.22,-678.78 7848.92,-674.43 7940,-671 8404.83,-653.49 8521.34,-656.55 8986,-635 9039.68,-632.51 9100.07,-628.98 9146.84,-626.09"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7674.36,-678.23 7664.52,-682.15 7674.66,-685.22 7674.36,-678.23"/>
+<!-- Node67->Node36 -->
+<g id="edge121_Node000067_Node000036" class="edge">
+<title>Node67->Node36</title>
+<g id="a_edge121_Node000067_Node000036"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2165.68,-678.72C2131.11,-676.05 2089.77,-673.09 2052.5,-671 1634.63,-647.62 1529.53,-655.34 1111.5,-635 1058.91,-632.44 999.79,-628.95 953.75,-626.09"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2165.47,-682.21 2175.71,-679.5 2166.01,-675.23 2165.47,-682.21"/>
</a>
</g>
</g>
-<!-- Node68->Node39 -->
-<g id="edge114_Node000068_Node000039" class="edge">
-<title>Node68->Node39</title>
-<g id="a_edge114_Node000068_Node000039"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7654.31,-674.5C7709.97,-663.56 7788.08,-646.44 7797,-635 7805.2,-624.49 7803.47,-616.66 7797,-605 7770.06,-556.48 7743.44,-557.18 7691,-539 7679.51,-535.02 6963.02,-457.36 6722.65,-431.38"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7653.35,-671.12 7644.2,-676.47 7654.69,-678 7653.35,-671.12"/>
+<!-- Node67->Node39 -->
+<g id="edge113_Node000067_Node000039" class="edge">
+<title>Node67->Node39</title>
+<g id="a_edge113_Node000067_Node000039"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2283.51,-673.88C2350.38,-656.21 2487.33,-622 2605.5,-605 3257.24,-511.22 3438.47,-635.28 4083.5,-503 4123.16,-494.87 4129.66,-480.15 4169.5,-473 4417.97,-428.4 6244.78,-423.58 6645.81,-423.06"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2282.54,-670.51 2273.77,-676.46 2284.34,-677.28 2282.54,-670.51"/>
</a>
</g>
</g>
-<!-- Node68->Node59 -->
-<g id="edge120_Node000068_Node000059" class="edge">
-<title>Node68->Node59</title>
-<g id="a_edge120_Node000068_Node000059"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7675.04,-678.44C7823.61,-665.77 8147.21,-638.2 8284.91,-626.46"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7674.31,-674.98 7664.65,-679.32 7674.91,-681.96 7674.31,-674.98"/>
+<!-- Node67->Node59 -->
+<g id="edge119_Node000067_Node000059" class="edge">
+<title>Node67->Node59</title>
+<g id="a_edge119_Node000067_Node000059"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2187.55,-674.8C2178.86,-673.39 2169.95,-672.06 2161.5,-671 1956.41,-645.17 1711.85,-630.22 1597.89,-624.17"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2187.18,-678.29 2197.62,-676.49 2188.34,-671.39 2187.18,-678.29"/>
</a>
</g>
</g>
-<!-- Node69->Node5 -->
-<g id="edge141_Node000069_Node000005" class="edge">
-<title>Node69->Node5</title>
-<g id="a_edge141_Node000069_Node000005"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7828.81,-745.69C7723.02,-738.38 7534.88,-723.52 7375,-701 7370.34,-700.34 7365.53,-699.59 7360.69,-698.79"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7828.57,-749.18 7838.79,-746.38 7829.05,-742.2 7828.57,-749.18"/>
+<!-- Node68->Node5 -->
+<g id="edge140_Node000068_Node000005" class="edge">
+<title>Node68->Node5</title>
+<g id="a_edge140_Node000068_Node000005"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2102.92,-743.41C2128.44,-741.2 2156.62,-738.88 2182.5,-737 2450.71,-717.49 2519.84,-735.82 2786.5,-701 2789.53,-700.6 2792.63,-700.15 2795.75,-699.66"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2102.56,-739.93 2092.9,-744.29 2103.17,-746.9 2102.56,-739.93"/>
</a>
</g>
</g>
-<!-- Node69->Node7 -->
-<g id="edge128_Node000069_Node000007" class="edge">
-<title>Node69->Node7</title>
-<g id="a_edge128_Node000069_Node000007"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7828.55,-746.19C7712.56,-738.74 7513.96,-722.96 7489,-701 7455.99,-671.94 7476.26,-647.51 7465,-605 7461.81,-592.98 7457.99,-579.39 7455.15,-569.41"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7828.62,-749.7 7838.82,-746.84 7829.07,-742.71 7828.62,-749.7"/>
+<!-- Node68->Node7 -->
+<g id="edge127_Node000068_Node000007" class="edge">
+<title>Node68->Node7</title>
+<g id="a_edge127_Node000068_Node000007"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2079.97,-740.89C2088.86,-739.51 2097.91,-738.17 2106.5,-737 2248.74,-717.59 2290.04,-742.4 2427.5,-701 2532.9,-669.25 2645.75,-599.28 2691.47,-569.2"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2079.38,-737.44 2070.04,-742.45 2080.47,-744.35 2079.38,-737.44"/>
+</a>
+</g>
+</g>
+<!-- Node68->Node8 -->
+<g id="edge135_Node000068_Node000008" class="edge">
+<title>Node68->Node8</title>
+<g id="a_edge135_Node000068_Node000008"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1936.26,-745.57C1871.63,-739.42 1789.57,-726.68 1768.5,-701 1736.54,-662.04 1770.09,-597.72 1787.9,-569.28"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1936.2,-749.08 1946.47,-746.5 1936.83,-742.11 1936.2,-749.08"/>
+</a>
+</g>
+</g>
+<!-- Node68->Node10 -->
+<g id="edge136_Node000068_Node000010" class="edge">
+<title>Node68->Node10</title>
+<g id="a_edge136_Node000068_Node000010"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2081.79,-740.84C2169.13,-726.55 2317.54,-702.13 2318.5,-701 2361.91,-649.72 2253.99,-648.66 2245.5,-635 2238.46,-623.68 2236.8,-615.1 2245.5,-605 2280.85,-563.98 2434.53,-584.21 2486.5,-569 2517.81,-559.84 2522.22,-548.27 2553.5,-539 2652.7,-509.6 2681.31,-519.22 2783.5,-503 2788.18,-502.26 2793.01,-501.49 2797.87,-500.71"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2081.02,-737.42 2071.71,-742.48 2082.14,-744.33 2081.02,-737.42"/>
</a>
</g>
</g>
-<!-- Node69->Node8 -->
-<g id="edge136_Node000069_Node000008" class="edge">
-<title>Node69->Node8</title>
-<g id="a_edge136_Node000069_Node000008"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7968.89,-740.62C7975.99,-739.37 7983.16,-738.14 7990,-737 8093.79,-719.7 8126.32,-740.12 8224,-701 8245.63,-692.34 8245.19,-679.2 8267,-671 8335.01,-645.42 8543.53,-689.14 8592,-635 8600.89,-625.07 8600.84,-614.98 8592,-605 8569.6,-579.71 8358.45,-564.6 8247.85,-558.36"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7967.81,-737.26 7958.57,-742.44 7969.03,-744.15 7967.81,-737.26"/>
+<!-- Node68->Node30 -->
+<g id="edge128_Node000068_Node000030" class="edge">
+<title>Node68->Node30</title>
+<g id="a_edge128_Node000068_Node000030"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2079.27,-740.87C2088.38,-739.47 2097.68,-738.13 2106.5,-737 2271.69,-715.76 2319.14,-745.98 2479.5,-701 2508.97,-692.73 2513.32,-682.95 2541.5,-671 2619.95,-637.74 2638.21,-622.98 2721.5,-605 2758.33,-597.05 3897.66,-516.6 4211.28,-494.56"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2078.45,-737.46 2069.11,-742.46 2079.53,-744.37 2078.45,-737.46"/>
</a>
</g>
</g>
-<!-- Node69->Node10 -->
-<g id="edge137_Node000069_Node000010" class="edge">
-<title>Node69->Node10</title>
-<g id="a_edge137_Node000069_Node000010"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7867.84,-739.58C7823.39,-726.07 7765.12,-701.49 7793,-671 7853.53,-604.81 8114.35,-674.25 8195,-635 8240.67,-612.77 8281.37,-583.56 8257,-539 8248.13,-522.77 8231.48,-511.03 8215.84,-503.02"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7867.06,-743 7877.64,-742.46 7869.03,-736.29 7867.06,-743"/>
+<!-- Node68->Node31 -->
+<g id="edge131_Node000068_Node000031" class="edge">
+<title>Node68->Node31</title>
+<g id="a_edge131_Node000068_Node000031"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2078.28,-740.91C2087.7,-739.48 2097.35,-738.11 2106.5,-737 2299.07,-713.57 2357.39,-762.13 2541.5,-701 2565.38,-693.07 2566.39,-680.95 2589.5,-671 2602.89,-665.24 2829.07,-607.08 2843.5,-605 2986.84,-584.29 3995.95,-562.57 4291.41,-556.6"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2077.52,-737.49 2068.18,-742.49 2078.6,-744.4 2077.52,-737.49"/>
</a>
</g>
</g>
-<!-- Node69->Node30 -->
-<g id="edge129_Node000069_Node000030" class="edge">
-<title>Node69->Node30</title>
-<g id="a_edge129_Node000069_Node000030"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7828.55,-744.92C7708.33,-735.66 7497.32,-717.38 7466,-701 7415.76,-674.73 7432.95,-629.86 7382,-605 7244.17,-537.76 4842.7,-516.36 4696,-503 4693.07,-502.73 4690.1,-502.43 4687.09,-502.09"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7828.59,-748.43 7838.83,-745.7 7829.12,-741.45 7828.59,-748.43"/>
+<!-- Node68->Node34 -->
+<g id="edge132_Node000068_Node000034" class="edge">
+<title>Node68->Node34</title>
+<g id="a_edge132_Node000068_Node000034"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1936.16,-746.12C1854.93,-740.06 1728.38,-727.14 1621.5,-701 1584.21,-691.88 1577.73,-680.35 1540.5,-671 1427.36,-642.57 1395.84,-652.48 1280.5,-635 1269.26,-633.3 1257.21,-631.37 1245.81,-629.5"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1936.1,-749.62 1946.33,-746.86 1936.61,-742.64 1936.1,-749.62"/>
</a>
</g>
</g>
-<!-- Node69->Node31 -->
-<g id="edge132_Node000069_Node000031" class="edge">
-<title>Node69->Node31</title>
-<g id="a_edge132_Node000069_Node000031"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7828.72,-746.74C7695.82,-739.34 7447.19,-722.79 7413,-701 7371.16,-674.33 7398.87,-629.99 7356,-605 7329.8,-589.73 5407.42,-562.03 4985.34,-556.13"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7828.69,-750.25 7838.86,-747.3 7829.07,-743.26 7828.69,-750.25"/>
+<!-- Node68->Node35 -->
+<g id="edge133_Node000068_Node000035" class="edge">
+<title>Node68->Node35</title>
+<g id="a_edge133_Node000068_Node000035"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1936.82,-741.16C1871.45,-732.65 1778.1,-718.92 1697.5,-701 1650.96,-690.65 1640.42,-683.85 1594.5,-671 1535.12,-654.38 1515.61,-662.67 1460.5,-635 1441.27,-625.34 1442.38,-613.24 1422.5,-605 1360.59,-579.34 1174.31,-564.95 1070.8,-558.74"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1936.7,-744.67 1947.06,-742.48 1937.59,-737.73 1936.7,-744.67"/>
</a>
</g>
</g>
-<!-- Node69->Node34 -->
-<g id="edge133_Node000069_Node000034" class="edge">
-<title>Node69->Node34</title>
-<g id="a_edge133_Node000069_Node000034"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7912.92,-732.23C7914.94,-713.49 7921.15,-685.46 7940,-671 7982.61,-638.31 8368.67,-641.37 8422,-635 8434.33,-633.53 8447.59,-631.54 8459.9,-629.52"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7909.43,-732.01 7912.15,-742.25 7916.41,-732.55 7909.43,-732.01"/>
+<!-- Node68->Node37 -->
+<g id="edge138_Node000068_Node000037" class="edge">
+<title>Node68->Node37</title>
+<g id="a_edge138_Node000068_Node000037"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2077.62,-740.91C2087.24,-739.45 2097.14,-738.08 2106.5,-737 2332.67,-710.89 2391.33,-727.11 2617.5,-701 2630.11,-699.54 2643.69,-697.56 2656.29,-695.54"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2077.05,-737.46 2067.71,-742.46 2078.13,-744.37 2077.05,-737.46"/>
</a>
</g>
</g>
-<!-- Node69->Node35 -->
-<g id="edge134_Node000069_Node000035" class="edge">
-<title>Node69->Node35</title>
-<g id="a_edge134_Node000069_Node000035"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7966.93,-740.71C7974.67,-739.39 7982.52,-738.11 7990,-737 8125.01,-716.93 8167.41,-749.51 8295,-701 8316.78,-692.72 8315.97,-678.6 8338,-671 8474.33,-623.95 8844.34,-662.04 8986,-635 9062.14,-620.46 9147.38,-587.94 9192.97,-569.15"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7966.13,-737.3 7956.88,-742.47 7967.34,-744.2 7966.13,-737.3"/>
+<!-- Node68->Node38 -->
+<g id="edge141_Node000068_Node000038" class="edge">
+<title>Node68->Node38</title>
+<g id="a_edge141_Node000068_Node000038"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M1936.29,-746.42C1720.1,-734.52 1142.97,-702.76 933.67,-691.25"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="1936.13,-749.92 1946.31,-746.97 1936.52,-742.93 1936.13,-749.92"/>
</a>
</g>
</g>
-<!-- Node69->Node37 -->
-<g id="edge139_Node000069_Node000037" class="edge">
-<title>Node69->Node37</title>
-<g id="a_edge139_Node000069_Node000037"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7972.13,-740.91C7981.12,-739.52 7990.3,-738.17 7999,-737 8146.98,-717.13 8185.02,-720.87 8333,-701 8344.98,-699.39 8357.85,-697.44 8369.92,-695.52"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7971.42,-737.47 7962.08,-742.48 7972.5,-744.39 7971.42,-737.47"/>
+<!-- Node68->Node39 -->
+<g id="edge126_Node000068_Node000039" class="edge">
+<title>Node68->Node39</title>
+<g id="a_edge126_Node000068_Node000039"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2082.54,-740.82C2090.6,-739.53 2098.74,-738.23 2106.5,-737 2157.81,-728.87 2303.71,-740.46 2337.5,-701 2377,-654.87 2279.45,-636.7 2278.5,-635 2271.97,-623.37 2269.76,-615.07 2278.5,-605 2316.03,-561.8 2477.77,-582.01 2533.5,-569 2574.97,-559.32 2582.54,-546.3 2624.5,-539 2928.49,-486.13 3710.92,-568.18 4012.5,-503 4045.98,-495.76 4049.99,-480.12 4083.5,-473 4339.3,-418.65 6236.61,-421.46 6645.85,-422.72"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2081.72,-737.4 2072.4,-742.44 2082.83,-744.32 2081.72,-737.4"/>
</a>
</g>
</g>
-<!-- Node69->Node38 -->
-<g id="edge142_Node000069_Node000038" class="edge">
-<title>Node69->Node38</title>
-<g id="a_edge142_Node000069_Node000038"><a xlink:title=" ">
-<path fill="none" stroke="#63b8ff" d="M7995.34,-746.93C8233.72,-735.31 8915.95,-702.03 9146.67,-690.77"/>
-<polygon fill="#63b8ff" stroke="#63b8ff" points="7995.17,-743.44 7985.35,-747.42 7995.51,-750.43 7995.17,-743.44"/>
+<!-- Node68->Node45 -->
+<g id="edge129_Node000068_Node000045" class="edge">
+<title>Node68->Node45</title>
+<g id="a_edge129_Node000068_Node000045"><a xlink:title=" ">
+<path fill="none" stroke="#63b8ff" d="M2078.27,-740.86C2087.69,-739.43 2097.35,-738.08 2106.5,-737 2211.19,-724.62 2480.21,-736.41 2579.5,-701 2601.45,-693.17 2600.98,-679.93 2622.5,-671 2641.68,-663.04 2969.84,-607.09 2990.5,-605 3316.04,-572.02 4142.62,-637.89 4462.5,-569 4495.99,-561.79 4500.74,-549 4533.5,-539 4538.14,-537.58 4651.46,-515.62 4725.76,-501.28"/>
+<polygon fill="#63b8ff" stroke="#63b8ff" points="2077.52,-737.43 2068.17,-742.43 2078.59,-744.35 2077.52,-737.43"/>
</a>
</g>
</g>
-<!-- Node69->Node39 -->
-<g id="edge127_Node000069_Node000039" class="edge">
-<title>Node69->Node39</title>
-<g id="a_edge127_Node000069_Node000039"><a xlink:title=" ">
... 130191 lines suppressed ...