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 2020/05/23 15:55:23 UTC

[incubator-tvm-site] branch asf-site updated (71a3f12 -> e039225)

This is an automated email from the ASF dual-hosted git repository.

tqchen pushed a change to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-tvm-site.git.


 discard 71a3f12  Docs build at Sat May 23 08:42:38 PDT 2020
 discard 27bbdbb  Build at Wed May 20 17:08:55 PDT 2020
 discard 7fdf1c1  Docs build at Tue May 19 10:23:27 PDT 2020
 discard a8e1e78  Build at Thu May 14 10:59:43 PDT 2020
 discard 8501961  Build at Mon May  4 07:34:27 PDT 2020
 discard a66bb73  Docs build at Thu Apr 30 22:24:56 PDT 2020
 discard 4123191  Docs build at Mon Apr 20 12:15:54 PDT 2020
 discard 076a8f9  Docs build at Wed Apr 15 18:12:07 PDT 2020
 discard 7631a36  Docs build at Tue Apr 14 19:10:06 PDT 2020
 discard 65be118  Docs build at Sun Apr 12 17:56:50 PDT 2020
 discard c96f37d  Docs build at Wed Apr  1 13:45:20 PDT 2020
 discard c506653  Build at Mon Mar 30 15:47:27 PDT 2020
 discard 6695369  Docs build at Mon Mar 30 11:38:43 PDT 2020
 discard 49ae3d9  Docs build at Mon Mar 30 11:36:58 PDT 2020
 discard 575ea41  Build at Mon Mar 30 11:16:13 PDT 2020
 discard ffb1114  Build at Mon Mar 30 10:20:32 PDT 2020
 discard d949886  Docs build at Mon Mar 30 10:10:38 PDT 2020
 discard 9816514  Build at Sun Mar 29 11:22:56 PDT 2020
 discard 6f2222a  Build at Sun Mar 29 11:17:22 PDT 2020
 discard 082608c  Build at Sun Mar 22 15:42:25 PDT 2020
 discard 9462fe4  Build at Sat Mar 21 17:22:31 PDT 2020
 discard 5bbc7a7  Build at Sat Mar 21 15:40:25 PDT 2020
 discard 9ba9ddb  Build at Sat Mar 21 15:39:54 PDT 2020
 discard c5a3548  Build at Sat Mar 21 14:22:22 PDT 2020
 discard 8dc48c6  Build at Thu Mar 19 20:36:18 PDT 2020
 discard 89e5aa6  Build at Wed Mar  4 10:58:39 CST 2020
 discard 1fd0fdf  Build at Wed Feb 26 20:06:52 PST 2020
 discard 2fa181b  Build at Mon Dec 16 20:11:37 PST 2019
 discard c0d62dd  Build at Mon Dec  9 16:21:47 PST 2019
 discard 11a58f4  Build at Mon Dec  9 08:30:42 PST 2019
 discard 5d9b345  Build at Fri Dec  6 17:22:03 PST 2019
 discard 8553a78  Build at Tue Nov 26 12:17:12 PST 2019
 discard d236e1f  Build at Tue Nov 26 09:53:21 PST 2019
 discard f1b3a8a  Build at Mon Nov 25 21:40:49 PST 2019
 discard 2480acc  Build at Mon Nov 25 21:33:33 PST 2019
 discard a98e52d  Build at Mon Nov 25 21:30:46 PST 2019
     new e039225  Docs build at Sat May 23 08:42:38 PDT 2020

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (71a3f12)
            \
             N -- N -- N   refs/heads/asf-site (e039225)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:


[incubator-tvm-site] 01/01: Docs build at Sat May 23 08:42:38 PDT 2020

Posted by tq...@apache.org.
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/incubator-tvm-site.git

commit e039225f725cd5e0d71fe10151486a360793e3dc
Author: tqchen <tq...@gmail.com>
AuthorDate: Mon Nov 25 21:30:46 2019 -0800

    Docs build at Sat May 23 08:42:38 PDT 2020
---
 .gitignore                                         |     6 +
 2017/08/17/tvm-release-announcement.html           |   320 +
 ...s-with-TVM-A-Depthwise-Convolution-Example.html |   775 ++
 2017/10/06/nnvm-compiler-announcement.html         |   275 +
 ...s-to-TVM-Stack-and-NNVM-Compiler-with-ROCm.html |   418 +
 2017/11/08/android-rpc-introduction.html           |   424 +
 2018/01/16/opt-mali-gpu.html                       |   770 ++
 2018/03/12/webgl.html                              |   312 +
 2018/03/23/nmt-transformer-optimize.html           |   458 +
 2018/07/12/vta-release-announcement.html           |   334 +
 2018/08/10/DLPack-Bridge.html                      |   335 +
 2018/10/03/auto-opt-all.html                       |   590 +
 2018/10/09/ml-in-tees.html                         |   312 +
 2018/12/18/lowprecision-conv.html                  |   357 +
 2019/01/19/Golang.html                             |   366 +
 2019/03/18/tvm-apache-announcement.html            |   219 +
 2019/04/29/opt-cuda-quantized.html                 |   340 +
 2019/05/30/pytorch-frontend.html                   |   298 +
 ...machine-learning-to-webassembly-and-webgpu.html |   283 +
 2020/05/20/bring-your-own-datatypes.html           |   482 +
 README.md                                          |     1 -
 Rakefile                                           |   306 -
 _config.yml                                        |   138 -
 _includes/JB/analytics                             |    20 -
 _includes/JB/analytics-providers/gauges            |    13 -
 _includes/JB/analytics-providers/getclicky         |    12 -
 _includes/JB/analytics-providers/google            |    13 -
 _includes/JB/analytics-providers/google-universal  |     9 -
 _includes/JB/analytics-providers/mixpanel          |    11 -
 _includes/JB/analytics-providers/piwik             |    10 -
 _includes/JB/categories_list                       |    37 -
 _includes/JB/comments                              |    18 -
 _includes/JB/comments-providers/disqus             |    15 -
 _includes/JB/comments-providers/duoshuo            |    14 -
 _includes/JB/comments-providers/facebook           |     9 -
 _includes/JB/comments-providers/intensedebate      |     6 -
 _includes/JB/comments-providers/livefyre           |     6 -
 _includes/JB/feedburner                            |     3 -
 _includes/JB/file_exists                           |    26 -
 _includes/JB/gist                                  |    19 -
 _includes/JB/is_production                         |    43 -
 _includes/JB/liquid_raw                            |    32 -
 _includes/JB/pages_list                            |    47 -
 _includes/JB/posts_collate                         |    55 -
 _includes/JB/setup                                 |    31 -
 _includes/JB/sharing                               |     9 -
 _includes/JB/sort_collection                       |    81 -
 _includes/JB/tags_list                             |    33 -
 _includes/custom/page_list                         |     4 -
 _includes/themes/custom-twitter/default.html       |    64 -
 _includes/themes/custom-twitter/index.html         |     6 -
 _includes/themes/custom-twitter/page.html          |     9 -
 _includes/themes/custom-twitter/post.html          |    40 -
 _includes/themes/custom-twitter/settings.yml       |     2 -
 _layouts/default.html                              |     6 -
 _layouts/index.html                                |     7 -
 _layouts/page.html                                 |     7 -
 _layouts/post.html                                 |     7 -
 _plugins/debug.rb                                  |    38 -
 _site/404.html                                     |     1 -
 _site/archive.html                                 |   149 -
 .../bootstrap/css/bootstrap.2.2.2.min.css          |   782 --
 .../bootstrap/img/glyphicons-halflings-white.png   |   Bin 8777 -> 0 bytes
 .../bootstrap/img/glyphicons-halflings.png         |   Bin 12799 -> 0 bytes
 .../themes/custom-twitter/css/1.4.0/bootstrap.css  |   356 -
 _site/assets/themes/custom-twitter/css/style.css   |    69 -
 _site/assignments.html                             |   142 -
 _site/atom.xml                                     |    16 -
 _site/categories.html                              |   157 -
 _site/index.html                                   |   178 -
 _site/rss.xml                                      |    15 -
 _site/schedule.html                                |   235 -
 _site/serve_local.sh                               |     3 -
 _site/sitemap.txt                                  |    10 -
 _site/tags.html                                    |   158 -
 about.html                                         |   213 +
 archive.html                                       |    10 -
 asf.html                                           |   204 +
 .../themes/custom-twitter/css/1.4.0/bootstrap.css  |     4 +-
 assets/themes/custom-twitter/css/style.css         |   371 +-
 assignments.md                                     |    11 -
 atom.xml                                           |  3988 ++++++-
 blog.html                                          |   387 +
 categories.html                                    |   216 +-
 community.html                                     |   278 +
 .../tuple_inputs.ipynb                             |   122 +
 .../from_tflite.py                                 |   186 +
 .../tune_simple_template.py                        |   327 +
 .../from_tflite.ipynb                              |   151 +
 .../tune_simple_template.ipynb                     |   190 +
 .../opt_matmul_auto_tensorcore.py                  |   531 +
 .../matrix_multiply.py                             |   482 +
 .../143c743c62f58570eabd77fd3395ca8c/scan.py       |   153 +
 .../tensor_expr_get_started.ipynb                  |   287 +
 .../deploy_prequantized_tflite.ipynb               |   319 +
 .../tune_conv2d_cuda.ipynb                         |   115 +
 .../tune_relay_cuda.py                             |   378 +
 .../relay_pass_infra.ipynb                         |   252 +
 .../tune_relay_mobile_gpu.ipynb                    |   168 +
 .../tune_conv2d_cuda.py                            |   237 +
 .../matrix_multiply_opt.ipynb                      |   176 +
 .../from_keras.ipynb                               |   144 +
 .../from_coreml.ipynb                              |   144 +
 .../from_caffe2.ipynb                              |   133 +
 .../deploy_model_on_android.ipynb                  |   190 +
 .../deploy_model_on_android.py                     |   360 +
 .../relay_quick_start.py                           |   160 +
 .../opt_gemm.ipynb                                 |   309 +
 .../using_external_lib.py                          |   561 +
 .../tune_relay_vta.ipynb                           |   186 +
 .../cross_compilation_and_rpc.py                   |   263 +
 .../4e9540fc014621d8d3bd14869c1ab227/scan.ipynb    |   169 +
 .../deploy_quantized.ipynb                         |   144 +
 .../from_tensorflow.py                             |   240 +
 .../relay_pass_infra.py                            |   248 +
 .../intro_topi.ipynb                               |   230 +
 .../deploy_quantized.py                            |   159 +
 .../5bd1bb9c6505ea40407fa19f01579414/reduction.py  |   196 +
 .../deploy_prequantized_tflite.py                  |   256 +
 .../intrin_math.ipynb                              |   169 +
 .../tune_relay_vta.py                              |   494 +
 .../schedule_primitives.ipynb                      |   284 +
 .../tensorize.ipynb                                |   241 +
 .../deploy_detection.ipynb                         |   169 +
 .../opt_conv_cuda.ipynb                            |   151 +
 .../matrix_multiply_opt.py                         |   391 +
 .../tuple_inputs.py                                |   120 +
 .../696dd37904ef92773435ca321ff41bfb/from_onnx.py  |    99 +
 .../using_external_lib.ipynb                       |   147 +
 .../from_pytorch.ipynb                             |   162 +
 .../70d345c5409f99cb5de9dc44f147ff6f/build_gcn.py  |   361 +
 .../from_caffe2.py                                 |   133 +
 .../tune_relay_cuda.ipynb                          |   172 +
 .../cross_compilation_and_rpc.ipynb                |   179 +
 .../deploy_prequantized.ipynb                      |   287 +
 .../7ece74acc230c7d55086182cc8884b09/extern_op.py  |   126 +
 .../deploy_ssd_gluoncv.ipynb                       |   144 +
 .../from_darknet.ipynb                             |   144 +
 .../836dc3852acf09662e9eb37c4c5e1e1b/opt_gemm.py   |   380 +
 .../deploy_model_on_rasp.py                        |   226 +
 .../tune_relay_x86.py                              |   240 +
 .../extern_op.ipynb                                |   133 +
 .../opt_matmul_auto_tensorcore.ipynb               |   111 +
 .../deploy_prequantized.py                         |   237 +
 .../schedule_primitives.py                         |   208 +
 .../opt_conv_tensorcore.ipynb                      |   165 +
 .../9a950897eeef498440fbe2f0afe2601f/tedd.py       |   160 +
 .../9b0365fd5723f7c4d4e996637ab9a487/intro_topi.py |   148 +
 .../low_level_custom_pass.py                       |   168 +
 .../relay_quick_start.ipynb                        |   144 +
 .../a2f661bf234a167b5458fa28d8fafedc/tedd.ipynb    |   165 +
 .../from_darknet.py                                |   206 +
 .../opt_conv_cuda.py                               |   246 +
 .../tune_relay_x86.ipynb                           |   115 +
 .../baa4de13ce6d932de43e0eb5c4cb8f16/tensorize.py  |   310 +
 .../tune_relay_arm.py                              |   400 +
 .../vta_get_started.py                             |   404 +
 .../deploy_model_on_rasp.ipynb                     |   201 +
 .../build_gcn.ipynb                                |   223 +
 .../deploy_classification.ipynb                    |   133 +
 .../convolution_opt.ipynb                          |   194 +
 .../deploy_ssd_gluoncv.py                          |   118 +
 .../convolution_opt.py                             |   455 +
 .../matrix_multiply.ipynb                          |   311 +
 .../tensor_expr_get_started.py                     |   318 +
 .../from_tensorflow.ipynb                          |   216 +
 .../opt_conv_tensorcore.py                         |   348 +
 .../tune_relay_mobile_gpu.py                       |   401 +
 .../from_coreml.py                                 |   112 +
 .../low_level_custom_pass.ipynb                    |   140 +
 .../from_onnx.ipynb                                |   144 +
 .../ea0c81cab71096d16b825a33fd276c58/from_mxnet.py |   138 +
 .../reduction.ipynb                                |   248 +
 .../deploy_detection.py                            |   330 +
 .../deploy_classification.py                       |   290 +
 .../from_mxnet.ipynb                               |   162 +
 .../f59fd8b968f7dcde34ed872c8527c192/from_keras.py |   108 +
 .../vta_get_started.ipynb                          |   373 +
 .../from_pytorch.py                                |   165 +
 .../tune_relay_arm.ipynb                           |   168 +
 .../intrin_math.py                                 |   168 +
 docs/_images/sphx_glr_build_gcn_thumb.png          |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_convolution_opt_thumb.png    |   Bin 0 -> 26786 bytes
 .../sphx_glr_cross_compilation_and_rpc_thumb.png   |   Bin 0 -> 26786 bytes
 .../_images/sphx_glr_deploy_classification_001.png |   Bin 0 -> 245321 bytes
 .../sphx_glr_deploy_classification_thumb.png       |   Bin 0 -> 104786 bytes
 docs/_images/sphx_glr_deploy_detection_001.png     |   Bin 0 -> 319717 bytes
 docs/_images/sphx_glr_deploy_detection_thumb.png   |   Bin 0 -> 121398 bytes
 .../sphx_glr_deploy_model_on_android_thumb.png     |   Bin 0 -> 26786 bytes
 .../sphx_glr_deploy_model_on_rasp_thumb.png        |   Bin 0 -> 26786 bytes
 .../sphx_glr_deploy_prequantized_tflite_thumb.png  |   Bin 0 -> 26786 bytes
 .../_images/sphx_glr_deploy_prequantized_thumb.png |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_deploy_quantized_thumb.png   |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_deploy_ssd_gluoncv_001.png   |   Bin 0 -> 262413 bytes
 docs/_images/sphx_glr_deploy_ssd_gluoncv_thumb.png |   Bin 0 -> 104403 bytes
 docs/_images/sphx_glr_extern_op_thumb.png          |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_from_caffe2_001.png          |   Bin 0 -> 245321 bytes
 docs/_images/sphx_glr_from_caffe2_thumb.png        |   Bin 0 -> 104786 bytes
 docs/_images/sphx_glr_from_coreml_thumb.png        |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_from_darknet_001.png         |   Bin 0 -> 340868 bytes
 docs/_images/sphx_glr_from_darknet_thumb.png       |   Bin 0 -> 132048 bytes
 docs/_images/sphx_glr_from_keras_001.png           |   Bin 0 -> 245321 bytes
 docs/_images/sphx_glr_from_keras_thumb.png         |   Bin 0 -> 104786 bytes
 docs/_images/sphx_glr_from_mxnet_001.png           |   Bin 0 -> 245321 bytes
 docs/_images/sphx_glr_from_mxnet_thumb.png         |   Bin 0 -> 104786 bytes
 docs/_images/sphx_glr_from_onnx_001.png            |   Bin 0 -> 164194 bytes
 docs/_images/sphx_glr_from_onnx_thumb.png          |   Bin 0 -> 65645 bytes
 docs/_images/sphx_glr_from_pytorch_thumb.png       |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_from_tensorflow_thumb.png    |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_from_tflite_001.png          |   Bin 0 -> 245321 bytes
 docs/_images/sphx_glr_from_tflite_thumb.png        |   Bin 0 -> 104786 bytes
 docs/_images/sphx_glr_intrin_math_thumb.png        |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_intro_topi_thumb.png         |   Bin 0 -> 26786 bytes
 .../sphx_glr_low_level_custom_pass_thumb.png       |   Bin 0 -> 26786 bytes
 .../_images/sphx_glr_matrix_multiply_opt_thumb.png |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_matrix_multiply_thumb.png    |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_opt_conv_cuda_thumb.png      |   Bin 0 -> 26786 bytes
 .../_images/sphx_glr_opt_conv_tensorcore_thumb.png |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_opt_gemm_thumb.png           |   Bin 0 -> 26786 bytes
 .../sphx_glr_opt_matmul_auto_tensorcore_thumb.png  |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_reduction_thumb.png          |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_relay_pass_infra_thumb.png   |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_relay_quick_start_thumb.png  |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_scan_thumb.png               |   Bin 0 -> 26786 bytes
 .../_images/sphx_glr_schedule_primitives_thumb.png |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tedd_thumb.png               |   Bin 0 -> 26786 bytes
 .../sphx_glr_tensor_expr_get_started_thumb.png     |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tensorize_thumb.png          |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tune_conv2d_cuda_thumb.png   |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tune_relay_arm_thumb.png     |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tune_relay_cuda_thumb.png    |   Bin 0 -> 26786 bytes
 .../sphx_glr_tune_relay_mobile_gpu_thumb.png       |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tune_relay_vta_thumb.png     |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tune_relay_x86_thumb.png     |   Bin 0 -> 26786 bytes
 .../sphx_glr_tune_simple_template_thumb.png        |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_tuple_inputs_thumb.png       |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_using_external_lib_thumb.png |   Bin 0 -> 26786 bytes
 docs/_images/sphx_glr_vta_get_started_thumb.png    |   Bin 0 -> 26786 bytes
 docs/_sources/api/links.rst.txt                    |    25 +
 docs/_sources/api/python/autotvm.rst.txt           |    90 +
 docs/_sources/api/python/contrib.rst.txt           |   134 +
 docs/_sources/api/python/driver.rst.txt            |    24 +
 docs/_sources/api/python/error.rst.txt             |    23 +
 docs/_sources/api/python/graph_runtime.rst.txt     |    21 +
 docs/_sources/api/python/index.rst.txt             |    46 +
 docs/_sources/api/python/ir.rst.txt                |    31 +
 docs/_sources/api/python/ndarray.rst.txt           |    27 +
 docs/_sources/api/python/relay/analysis.rst.txt    |    25 +
 docs/_sources/api/python/relay/backend.rst.txt     |    33 +
 docs/_sources/api/python/relay/frontend.rst.txt    |    25 +
 docs/_sources/api/python/relay/image.rst.txt       |    25 +
 docs/_sources/api/python/relay/index.rst.txt       |    29 +
 docs/_sources/api/python/relay/nn.rst.txt          |    23 +
 docs/_sources/api/python/relay/testing.rst.txt     |    51 +
 docs/_sources/api/python/relay/transform.rst.txt   |    24 +
 docs/_sources/api/python/relay/vision.rst.txt      |    25 +
 docs/_sources/api/python/rpc.rst.txt               |    23 +
 docs/_sources/api/python/runtime.rst.txt           |    25 +
 docs/_sources/api/python/target.rst.txt            |    23 +
 docs/_sources/api/python/te.rst.txt                |    33 +
 docs/_sources/api/python/tir.rst.txt               |    47 +
 docs/_sources/api/python/topi.rst.txt              |   236 +
 docs/_sources/api/python/vta/index.rst.txt         |    45 +
 docs/_sources/contribute/code_guide.rst.txt        |    99 +
 docs/_sources/contribute/code_review.rst.txt       |   105 +
 docs/_sources/contribute/committer_guide.rst.txt   |   103 +
 docs/_sources/contribute/community.rst.txt         |    50 +
 docs/_sources/contribute/document.rst.txt          |   119 +
 docs/_sources/contribute/error_handling.rst.txt    |   122 +
 docs/_sources/contribute/git_howto.rst.txt         |   137 +
 docs/_sources/contribute/index.rst.txt             |    51 +
 docs/_sources/contribute/pull_request.rst.txt      |   130 +
 docs/_sources/contribute/release_process.rst.txt   |   182 +
 docs/_sources/deploy/android.rst.txt               |    42 +
 docs/_sources/deploy/cpp_deploy.rst.txt            |    56 +
 docs/_sources/deploy/hls.rst.txt                   |   183 +
 docs/_sources/deploy/index.rst.txt                 |    70 +
 docs/_sources/deploy/integrate.rst.txt             |    69 +
 docs/_sources/dev/benchmark.rst.txt                |   137 +
 docs/_sources/dev/codebase_walkthrough.rst.txt     |   220 +
 docs/_sources/dev/convert_layout.rst.txt           |   268 +
 docs/_sources/dev/debugger.rst.txt                 |   172 +
 docs/_sources/dev/hybrid_script.rst.txt            |    93 +
 docs/_sources/dev/index.rst.txt                    |    42 +
 docs/_sources/dev/inferbound.rst.txt               |   765 ++
 .../introduction_to_module_serialization.rst.txt   |   226 +
 docs/_sources/dev/relay_add_op.rst.txt             |   268 +
 docs/_sources/dev/relay_add_pass.rst.txt           |   406 +
 .../dev/relay_bring_your_own_codegen.rst.txt       |   960 ++
 docs/_sources/dev/relay_intro.rst.txt              |   206 +
 docs/_sources/dev/relay_op_strategy.rst.txt        |   282 +
 docs/_sources/dev/relay_pass_infra.rst.txt         |   666 ++
 docs/_sources/dev/runtime.rst.txt                  |   295 +
 docs/_sources/dev/security.rst.txt                 |    43 +
 docs/_sources/dev/virtual_machine.rst.txt          |   404 +
 docs/_sources/faq.rst.txt                          |    69 +
 docs/_sources/frontend/tensorflow.rst.txt          |   250 +
 docs/_sources/genindex.rst.txt                     |    19 +
 docs/_sources/index.rst.txt                        |    61 +
 docs/_sources/install/docker.rst.txt               |    74 +
 docs/_sources/install/from_source.rst.txt          |   241 +
 docs/_sources/install/index.rst.txt                |    32 +
 docs/_sources/install/nnpack.rst.txt               |   118 +
 docs/_sources/langref/hybrid_script.rst.txt        |   234 +
 docs/_sources/langref/index.rst.txt                |    61 +
 docs/_sources/langref/relay_adt.rst.txt            |   533 +
 docs/_sources/langref/relay_expr.rst.txt           |   693 ++
 docs/_sources/langref/relay_op.rst.txt             |   227 +
 docs/_sources/langref/relay_pattern.rst.txt        |   141 +
 docs/_sources/langref/relay_type.rst.txt           |   398 +
 .../tutorials/autotvm/sg_execution_times.rst.txt   |    15 +
 .../tutorials/autotvm/tune_conv2d_cuda.rst.txt     |   340 +
 .../tutorials/autotvm/tune_relay_arm.rst.txt       |   457 +
 .../tutorials/autotvm/tune_relay_cuda.rst.txt      |   444 +
 .../autotvm/tune_relay_mobile_gpu.rst.txt          |   458 +
 .../tutorials/autotvm/tune_relay_x86.rst.txt       |   295 +
 .../tutorials/autotvm/tune_simple_template.rst.txt |   434 +
 .../tutorials/cross_compilation_and_rpc.rst.txt    |   340 +
 .../tutorials/dev/low_level_custom_pass.rst.txt    |   269 +
 .../tutorials/dev/relay_pass_infra.rst.txt         |   549 +
 .../tutorials/dev/sg_execution_times.rst.txt       |    11 +
 docs/_sources/tutorials/frontend/build_gcn.rst.txt |   516 +
 .../frontend/deploy_model_on_android.rst.txt       |   472 +
 .../frontend/deploy_model_on_rasp.rst.txt          |   337 +
 .../tutorials/frontend/deploy_prequantized.rst.txt |   417 +
 .../frontend/deploy_prequantized_tflite.rst.txt    |   424 +
 .../tutorials/frontend/deploy_quantized.rst.txt    |   249 +
 .../tutorials/frontend/deploy_ssd_gluoncv.rst.txt  |   313 +
 .../tutorials/frontend/from_caffe2.rst.txt         |   217 +
 .../tutorials/frontend/from_coreml.rst.txt         |   208 +
 .../tutorials/frontend/from_darknet.rst.txt        |   320 +
 .../_sources/tutorials/frontend/from_keras.rst.txt |   211 +
 .../_sources/tutorials/frontend/from_mxnet.rst.txt |   240 +
 docs/_sources/tutorials/frontend/from_onnx.rst.txt |   213 +
 .../tutorials/frontend/from_pytorch.rst.txt        |   275 +
 .../tutorials/frontend/from_tensorflow.rst.txt     |   399 +
 .../tutorials/frontend/from_tflite.rst.txt         |   289 +
 .../tutorials/frontend/sg_execution_times.rst.txt  |    26 +
 .../tutorials/frontend/using_external_lib.rst.txt  |   642 +
 docs/_sources/tutorials/index.rst.txt              |   919 ++
 docs/_sources/tutorials/language/extern_op.rst.txt |   198 +
 .../tutorials/language/intrin_math.rst.txt         |   340 +
 docs/_sources/tutorials/language/reduction.rst.txt |   502 +
 docs/_sources/tutorials/language/scan.rst.txt      |   327 +
 .../tutorials/language/schedule_primitives.rst.txt |   592 +
 .../tutorials/language/sg_execution_times.rst.txt  |    17 +
 docs/_sources/tutorials/language/tedd.rst.txt      |   230 +
 docs/_sources/tutorials/language/tensorize.rst.txt |   612 +
 .../tutorials/language/tuple_inputs.rst.txt        |   251 +
 .../tutorials/optimize/opt_conv_cuda.rst.txt       |   326 +
 .../tutorials/optimize/opt_conv_tensorcore.rst.txt |   599 +
 docs/_sources/tutorials/optimize/opt_gemm.rst.txt  |   824 ++
 .../optimize/opt_matmul_auto_tensorcore.rst.txt    |   572 +
 .../tutorials/optimize/sg_execution_times.rst.txt  |    13 +
 docs/_sources/tutorials/relay_quick_start.rst.txt  |   370 +
 docs/_sources/tutorials/sg_execution_times.rst.txt |    12 +
 .../tutorials/tensor_expr_get_started.rst.txt      |   476 +
 docs/_sources/tutorials/topi/intro_topi.rst.txt    |   669 ++
 .../tutorials/topi/sg_execution_times.rst.txt      |    10 +
 docs/_sources/vta/dev/config.rst.txt               |    74 +
 docs/_sources/vta/dev/hardware.rst.txt             |   300 +
 docs/_sources/vta/dev/index.rst.txt                |    31 +
 docs/_sources/vta/index.rst.txt                    |    55 +
 docs/_sources/vta/install.rst.txt                  |   488 +
 .../tutorials/autotvm/sg_execution_times.rst.txt   |    10 +
 .../vta/tutorials/autotvm/tune_relay_vta.rst.txt   |   602 +
 .../frontend/deploy_classification.rst.txt         |   390 +
 .../tutorials/frontend/deploy_detection.rst.txt    |   458 +
 .../tutorials/frontend/sg_execution_times.rst.txt  |    11 +
 docs/_sources/vta/tutorials/index.rst.txt          |   201 +
 .../_sources/vta/tutorials/matrix_multiply.rst.txt |   756 ++
 .../vta/tutorials/optimize/convolution_opt.rst.txt |   885 ++
 .../tutorials/optimize/matrix_multiply_opt.rst.txt |   709 ++
 .../tutorials/optimize/sg_execution_times.rst.txt  |    11 +
 .../vta/tutorials/sg_execution_times.rst.txt       |    11 +
 .../_sources/vta/tutorials/vta_get_started.rst.txt |   641 +
 docs/_static/basic.css                             |   768 ++
 docs/_static/broken_example.png                    |   Bin 0 -> 21404 bytes
 docs/_static/css/badge_only.css                    |     1 +
 docs/_static/css/theme.css                         |     6 +
 docs/_static/css/tvm_theme.css                     |    43 +
 docs/_static/doctools.js                           |   315 +
 docs/_static/documentation_options.js              |    12 +
 docs/_static/file.png                              |   Bin 0 -> 286 bytes
 docs/_static/fonts/Inconsolata-Bold.ttf            |   Bin 0 -> 109948 bytes
 docs/_static/fonts/Inconsolata-Regular.ttf         |   Bin 0 -> 96964 bytes
 docs/_static/fonts/Inconsolata.ttf                 |   Bin 0 -> 63184 bytes
 docs/_static/fonts/Lato-Bold.ttf                   |   Bin 0 -> 656544 bytes
 docs/_static/fonts/Lato-Regular.ttf                |   Bin 0 -> 656568 bytes
 docs/_static/fonts/Lato/lato-bold.eot              |   Bin 0 -> 256056 bytes
 docs/_static/fonts/Lato/lato-bold.ttf              |   Bin 0 -> 600856 bytes
 docs/_static/fonts/Lato/lato-bold.woff             |   Bin 0 -> 309728 bytes
 docs/_static/fonts/Lato/lato-bold.woff2            |   Bin 0 -> 184912 bytes
 docs/_static/fonts/Lato/lato-bolditalic.eot        |   Bin 0 -> 266158 bytes
 docs/_static/fonts/Lato/lato-bolditalic.ttf        |   Bin 0 -> 622572 bytes
 docs/_static/fonts/Lato/lato-bolditalic.woff       |   Bin 0 -> 323344 bytes
 docs/_static/fonts/Lato/lato-bolditalic.woff2      |   Bin 0 -> 193308 bytes
 docs/_static/fonts/Lato/lato-italic.eot            |   Bin 0 -> 268604 bytes
 docs/_static/fonts/Lato/lato-italic.ttf            |   Bin 0 -> 639388 bytes
 docs/_static/fonts/Lato/lato-italic.woff           |   Bin 0 -> 328412 bytes
 docs/_static/fonts/Lato/lato-italic.woff2          |   Bin 0 -> 195704 bytes
 docs/_static/fonts/Lato/lato-regular.eot           |   Bin 0 -> 253461 bytes
 docs/_static/fonts/Lato/lato-regular.ttf           |   Bin 0 -> 607720 bytes
 docs/_static/fonts/Lato/lato-regular.woff          |   Bin 0 -> 309192 bytes
 docs/_static/fonts/Lato/lato-regular.woff2         |   Bin 0 -> 182708 bytes
 docs/_static/fonts/RobotoSlab-Bold.ttf             |   Bin 0 -> 170616 bytes
 docs/_static/fonts/RobotoSlab-Regular.ttf          |   Bin 0 -> 169064 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-bold.eot       |   Bin 0 -> 79520 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-bold.ttf       |   Bin 0 -> 170616 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-bold.woff      |   Bin 0 -> 87624 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-bold.woff2     |   Bin 0 -> 67312 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-regular.eot    |   Bin 0 -> 78331 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-regular.ttf    |   Bin 0 -> 169064 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-regular.woff   |   Bin 0 -> 86288 bytes
 .../fonts/RobotoSlab/roboto-slab-v7-regular.woff2  |   Bin 0 -> 66444 bytes
 docs/_static/fonts/fontawesome-webfont.eot         |   Bin 0 -> 165742 bytes
 docs/_static/fonts/fontawesome-webfont.svg         |  2671 +++++
 docs/_static/fonts/fontawesome-webfont.ttf         |   Bin 0 -> 165548 bytes
 docs/_static/fonts/fontawesome-webfont.woff        |   Bin 0 -> 98024 bytes
 docs/_static/fonts/fontawesome-webfont.woff2       |   Bin 0 -> 77160 bytes
 docs/_static/gallery.css                           |   192 +
 docs/_static/img/README                            |     2 +
 docs/_static/img/tvm-logo-small.png                |   Bin 0 -> 6683 bytes
 docs/_static/img/tvm-logo-square.png               |   Bin 0 -> 3453 bytes
 docs/_static/jquery-3.4.1.js                       | 10598 +++++++++++++++++
 docs/_static/jquery.js                             |     2 +
 docs/_static/js/modernizr.min.js                   |     4 +
 docs/_static/js/theme.js                           |     3 +
 docs/_static/language_data.js                      |   297 +
 docs/_static/minus.png                             |   Bin 0 -> 90 bytes
 docs/_static/no_image.png                          |   Bin 0 -> 4315 bytes
 docs/_static/plus.png                              |   Bin 0 -> 90 bytes
 docs/_static/pygments.css                          |    65 +
 docs/_static/searchtools.js                        |   515 +
 docs/_static/tvm-logo-small.png                    |   Bin 0 -> 6683 bytes
 docs/_static/tvm-logo-square.png                   |   Bin 0 -> 3453 bytes
 docs/_static/underscore-1.3.1.js                   |   999 ++
 docs/_static/underscore.js                         |    31 +
 docs/api/doxygen/algorithm_8h.html                 |   131 +
 docs/api/doxygen/algorithm_8h__incl.svg            |  1185 ++
 docs/api/doxygen/algorithm_8h_source.html          |   119 +
 docs/api/doxygen/analyzer_8h.html                  |   174 +
 docs/api/doxygen/analyzer_8h__dep__incl.svg        |   932 ++
 docs/api/doxygen/analyzer_8h__incl.svg             |  1144 ++
 docs/api/doxygen/analyzer_8h_source.html           |   147 +
 docs/api/doxygen/annotated.html                    |   659 ++
 docs/api/doxygen/annotation_8h.html                |   139 +
 docs/api/doxygen/annotation_8h__incl.svg           |  1013 ++
 docs/api/doxygen/annotation_8h_source.html         |   114 +
 docs/api/doxygen/array__utils_8h.html              |   128 +
 docs/api/doxygen/array__utils_8h__dep__incl.svg    |    85 +
 docs/api/doxygen/array__utils_8h__incl.svg         |  1371 +++
 docs/api/doxygen/array__utils_8h_source.html       |   104 +
 docs/api/doxygen/arrowdown.png                     |   Bin 0 -> 246 bytes
 docs/api/doxygen/arrowright.png                    |   Bin 0 -> 229 bytes
 docs/api/doxygen/attr__registry__map_8h.html       |   139 +
 .../doxygen/attr__registry__map_8h__dep__incl.svg  |   365 +
 docs/api/doxygen/attr__registry__map_8h__incl.svg  |    39 +
 .../api/doxygen/attr__registry__map_8h_source.html |   112 +
 docs/api/doxygen/autodiff_8h.html                  |   143 +
 docs/api/doxygen/autodiff_8h__incl.svg             |  1263 ++
 docs/api/doxygen/autodiff_8h_source.html           |   109 +
 docs/api/doxygen/base_8h.html                      |   201 +
 docs/api/doxygen/base_8h__dep__incl.svg            |   468 +
 docs/api/doxygen/base_8h__incl.svg                 |  1093 ++
 docs/api/doxygen/base_8h_source.html               |   122 +
 docs/api/doxygen/batch__matmul_8h.html             |   133 +
 docs/api/doxygen/batch__matmul_8h__incl.svg        |  1379 +++
 docs/api/doxygen/batch__matmul_8h_source.html      |   113 +
 docs/api/doxygen/bc_s.png                          |   Bin 0 -> 676 bytes
 docs/api/doxygen/bdwn.png                          |   Bin 0 -> 147 bytes
 docs/api/doxygen/bias__add_8h.html                 |   135 +
 docs/api/doxygen/bias__add_8h__incl.svg            |  1367 +++
 docs/api/doxygen/bias__add_8h_source.html          |   110 +
 docs/api/doxygen/bitserial_8h.html                 |   139 +
 docs/api/doxygen/bitserial_8h__incl.svg            |  1185 ++
 docs/api/doxygen/bitserial_8h_source.html          |   136 +
 docs/api/doxygen/bound_8h.html                     |   152 +
 docs/api/doxygen/bound_8h__dep__incl.svg           |   956 ++
 docs/api/doxygen/bound_8h__incl.svg                |  1154 ++
 docs/api/doxygen/bound_8h_source.html              |   116 +
 docs/api/doxygen/broadcast_8h.html                 |   460 +
 docs/api/doxygen/broadcast_8h__dep__incl.svg       |   105 +
 docs/api/doxygen/broadcast_8h__incl.svg            |  1474 +++
 docs/api/doxygen/broadcast_8h_source.html          |   143 +
 docs/api/doxygen/buffer_8h.html                    |   159 +
 docs/api/doxygen/buffer_8h__dep__incl.svg          |   971 ++
 docs/api/doxygen/buffer_8h__incl.svg               |   982 ++
 docs/api/doxygen/buffer_8h_source.html             |   149 +
 docs/api/doxygen/c__backend__api_8h.html           |   518 +
 docs/api/doxygen/c__backend__api_8h__incl.svg      |    63 +
 docs/api/doxygen/c__backend__api_8h_source.html    |   115 +
 docs/api/doxygen/c__runtime__api_8h.html           |  1978 ++++
 docs/api/doxygen/c__runtime__api_8h__dep__incl.svg |  1168 ++
 docs/api/doxygen/c__runtime__api_8h__incl.svg      |    49 +
 docs/api/doxygen/c__runtime__api_8h_source.html    |   182 +
 docs/api/doxygen/classes.html                      |   241 +
 .../doxygen/classtvm_1_1AttrFieldInfo-members.html |   106 +
 docs/api/doxygen/classtvm_1_1AttrFieldInfo.html    |   166 +
 .../classtvm_1_1AttrFieldInfoNode-members.html     |   113 +
 .../api/doxygen/classtvm_1_1AttrFieldInfoNode.html |   312 +
 .../classtvm_1_1AttrFieldInfoNode__coll__graph.svg |    44 +
 ...asstvm_1_1AttrFieldInfoNode__inherit__graph.svg |    44 +
 .../classtvm_1_1AttrFieldInfo__coll__graph.svg     |    37 +
 .../classtvm_1_1AttrFieldInfo__inherit__graph.svg  |    37 +
 .../classtvm_1_1AttrRegistryMap-members.html       |   110 +
 docs/api/doxygen/classtvm_1_1AttrRegistryMap.html  |   331 +
 ...tvm_1_1AttrRegistryMapContainerMap-members.html |   110 +
 .../classtvm_1_1AttrRegistryMapContainerMap.html   |   325 +
 ...1_1AttrRegistryMapContainerMap__coll__graph.svg |    25 +
 .../classtvm_1_1AttrRegistryMap__coll__graph.svg   |    26 +
 docs/api/doxygen/classtvm_1_1AttrVisitor.html      |   119 +
 .../classtvm_1_1AttrVisitor__coll__graph.svg       |    22 +
 docs/api/doxygen/classtvm_1_1Attrs-members.html    |   106 +
 docs/api/doxygen/classtvm_1_1Attrs.html            |   167 +
 .../api/doxygen/classtvm_1_1AttrsNode-members.html |   120 +
 docs/api/doxygen/classtvm_1_1AttrsNode.html        |   389 +
 .../doxygen/classtvm_1_1AttrsNode__coll__graph.svg |    69 +
 .../classtvm_1_1AttrsNode__inherit__graph.svg      |    69 +
 .../api/doxygen/classtvm_1_1Attrs__coll__graph.svg |    37 +
 .../doxygen/classtvm_1_1Attrs__inherit__graph.svg  |    58 +
 .../doxygen/classtvm_1_1BaseAttrsNode-members.html |   118 +
 docs/api/doxygen/classtvm_1_1BaseAttrsNode.html    |   512 +
 .../classtvm_1_1BaseAttrsNode__coll__graph.svg     |    47 +
 docs/api/doxygen/classtvm_1_1BaseExpr-members.html |   106 +
 docs/api/doxygen/classtvm_1_1BaseExpr.html         |   167 +
 .../doxygen/classtvm_1_1BaseExprNode-members.html  |   110 +
 docs/api/doxygen/classtvm_1_1BaseExprNode.html     |   254 +
 .../classtvm_1_1BaseExprNode__coll__graph.svg      |    41 +
 .../classtvm_1_1BaseExprNode__inherit__graph.svg   |  1139 ++
 .../doxygen/classtvm_1_1BaseExpr__coll__graph.svg  |    37 +
 .../classtvm_1_1BaseExpr__inherit__graph.svg       |   589 +
 docs/api/doxygen/classtvm_1_1BaseFunc-members.html |   108 +
 docs/api/doxygen/classtvm_1_1BaseFunc.html         |   173 +
 .../doxygen/classtvm_1_1BaseFuncNode-members.html  |   120 +
 docs/api/doxygen/classtvm_1_1BaseFuncNode.html     |   403 +
 .../classtvm_1_1BaseFuncNode__coll__graph.svg      |   184 +
 .../classtvm_1_1BaseFuncNode__inherit__graph.svg   |   135 +
 .../doxygen/classtvm_1_1BaseFunc__coll__graph.svg  |    73 +
 .../classtvm_1_1BaseFunc__inherit__graph.svg       |   115 +
 .../classtvm_1_1BaseTensorType-members.html        |   107 +
 docs/api/doxygen/classtvm_1_1BaseTensorType.html   |   170 +
 .../classtvm_1_1BaseTensorTypeNode-members.html    |   112 +
 .../doxygen/classtvm_1_1BaseTensorTypeNode.html    |   229 +
 ...classtvm_1_1BaseTensorTypeNode__coll__graph.svg |    92 +
 ...sstvm_1_1BaseTensorTypeNode__inherit__graph.svg |    83 +
 .../classtvm_1_1BaseTensorType__coll__graph.svg    |    55 +
 .../classtvm_1_1BaseTensorType__inherit__graph.svg |    55 +
 .../classtvm_1_1BaseValueEqual-members.html        |   113 +
 docs/api/doxygen/classtvm_1_1BaseValueEqual.html   |   423 +
 .../classtvm_1_1BaseValueEqual__coll__graph.svg    |    29 +
 .../classtvm_1_1BaseValueEqual__inherit__graph.svg |    69 +
 .../doxygen/classtvm_1_1BaseValueHash-members.html |   113 +
 docs/api/doxygen/classtvm_1_1BaseValueHash.html    |   343 +
 .../classtvm_1_1BaseValueHash__coll__graph.svg     |    29 +
 .../classtvm_1_1BaseValueHash__inherit__graph.svg  |    46 +
 docs/api/doxygen/classtvm_1_1Bool-members.html     |   116 +
 docs/api/doxygen/classtvm_1_1Bool.html             |   264 +
 docs/api/doxygen/classtvm_1_1Bool__coll__graph.svg |    98 +
 .../doxygen/classtvm_1_1Bool__inherit__graph.svg   |    98 +
 .../doxygen/classtvm_1_1BuildConfig-members.html   |   113 +
 docs/api/doxygen/classtvm_1_1BuildConfig.html      |   342 +
 .../classtvm_1_1BuildConfigNode-members.html       |   124 +
 docs/api/doxygen/classtvm_1_1BuildConfigNode.html  |   489 +
 .../classtvm_1_1BuildConfigNode__coll__graph.svg   |    48 +
 ...classtvm_1_1BuildConfigNode__inherit__graph.svg |    48 +
 .../classtvm_1_1BuildConfig__coll__graph.svg       |    41 +
 .../classtvm_1_1BuildConfig__inherit__graph.svg    |    41 +
 .../doxygen/classtvm_1_1Constructor-members.html   |   109 +
 docs/api/doxygen/classtvm_1_1Constructor.html      |   219 +
 .../classtvm_1_1ConstructorNode-members.html       |   124 +
 docs/api/doxygen/classtvm_1_1ConstructorNode.html  |   415 +
 .../classtvm_1_1ConstructorNode__coll__graph.svg   |   181 +
 ...classtvm_1_1ConstructorNode__inherit__graph.svg |    88 +
 .../classtvm_1_1Constructor__coll__graph.svg       |    74 +
 .../classtvm_1_1Constructor__inherit__graph.svg    |    74 +
 .../api/doxygen/classtvm_1_1DictAttrs-members.html |   109 +
 docs/api/doxygen/classtvm_1_1DictAttrs.html        |   225 +
 .../doxygen/classtvm_1_1DictAttrsNode-members.html |   122 +
 docs/api/doxygen/classtvm_1_1DictAttrsNode.html    |   444 +
 .../classtvm_1_1DictAttrsNode__coll__graph.svg     |   100 +
 .../classtvm_1_1DictAttrsNode__inherit__graph.svg  |    71 +
 .../doxygen/classtvm_1_1DictAttrs__coll__graph.svg |    58 +
 .../classtvm_1_1DictAttrs__inherit__graph.svg      |    58 +
 docs/api/doxygen/classtvm_1_1EnvFunc-members.html  |   111 +
 docs/api/doxygen/classtvm_1_1EnvFunc.html          |   313 +
 .../doxygen/classtvm_1_1EnvFuncNode-members.html   |   115 +
 docs/api/doxygen/classtvm_1_1EnvFuncNode.html      |   387 +
 .../classtvm_1_1EnvFuncNode__coll__graph.svg       |    70 +
 .../classtvm_1_1EnvFuncNode__inherit__graph.svg    |    46 +
 .../doxygen/classtvm_1_1EnvFunc__coll__graph.svg   |    40 +
 .../classtvm_1_1EnvFunc__inherit__graph.svg        |    40 +
 docs/api/doxygen/classtvm_1_1Error-members.html    |   110 +
 docs/api/doxygen/classtvm_1_1Error.html            |   287 +
 .../doxygen/classtvm_1_1ErrorReporter-members.html |   111 +
 docs/api/doxygen/classtvm_1_1ErrorReporter.html    |   360 +
 .../classtvm_1_1ErrorReporter__coll__graph.svg     |    27 +
 .../api/doxygen/classtvm_1_1Error__coll__graph.svg |    72 +
 .../doxygen/classtvm_1_1Error__inherit__graph.svg  |    39 +
 docs/api/doxygen/classtvm_1_1FloatImm-members.html |   112 +
 docs/api/doxygen/classtvm_1_1FloatImm.html         |   220 +
 .../doxygen/classtvm_1_1FloatImmNode-members.html  |   117 +
 docs/api/doxygen/classtvm_1_1FloatImmNode.html     |   321 +
 .../classtvm_1_1FloatImmNode__coll__graph.svg      |   115 +
 .../classtvm_1_1FloatImmNode__inherit__graph.svg   |    81 +
 .../doxygen/classtvm_1_1FloatImm__coll__graph.svg  |    77 +
 .../classtvm_1_1FloatImm__inherit__graph.svg       |    77 +
 docs/api/doxygen/classtvm_1_1FuncType-members.html |   108 +
 docs/api/doxygen/classtvm_1_1FuncType.html         |   224 +
 .../doxygen/classtvm_1_1FuncTypeNode-members.html  |   119 +
 docs/api/doxygen/classtvm_1_1FuncTypeNode.html     |   366 +
 .../classtvm_1_1FuncTypeNode__coll__graph.svg      |   163 +
 .../classtvm_1_1FuncTypeNode__inherit__graph.svg   |    66 +
 .../doxygen/classtvm_1_1FuncType__coll__graph.svg  |    56 +
 .../classtvm_1_1FuncType__inherit__graph.svg       |    56 +
 .../doxygen/classtvm_1_1GenericFunc-members.html   |   116 +
 docs/api/doxygen/classtvm_1_1GenericFunc.html      |   512 +
 .../classtvm_1_1GenericFuncNode-members.html       |   111 +
 docs/api/doxygen/classtvm_1_1GenericFuncNode.html  |   262 +
 .../classtvm_1_1GenericFuncNode__coll__graph.svg   |    64 +
 ...classtvm_1_1GenericFuncNode__inherit__graph.svg |    40 +
 .../classtvm_1_1GenericFunc__coll__graph.svg       |    44 +
 .../classtvm_1_1GenericFunc__inherit__graph.svg    |    44 +
 .../doxygen/classtvm_1_1GlobalTypeVar-members.html |   108 +
 docs/api/doxygen/classtvm_1_1GlobalTypeVar.html    |   209 +
 .../classtvm_1_1GlobalTypeVarNode-members.html     |   117 +
 .../api/doxygen/classtvm_1_1GlobalTypeVarNode.html |   330 +
 .../classtvm_1_1GlobalTypeVarNode__coll__graph.svg |   110 +
 ...asstvm_1_1GlobalTypeVarNode__inherit__graph.svg |    64 +
 .../classtvm_1_1GlobalTypeVar__coll__graph.svg     |    56 +
 .../classtvm_1_1GlobalTypeVar__inherit__graph.svg  |    56 +
 .../api/doxygen/classtvm_1_1GlobalVar-members.html |   109 +
 docs/api/doxygen/classtvm_1_1GlobalVar.html        |   200 +
 .../doxygen/classtvm_1_1GlobalVarNode-members.html |   120 +
 docs/api/doxygen/classtvm_1_1GlobalVarNode.html    |   331 +
 .../classtvm_1_1GlobalVarNode__coll__graph.svg     |   153 +
 .../classtvm_1_1GlobalVarNode__inherit__graph.svg  |    84 +
 .../doxygen/classtvm_1_1GlobalVar__coll__graph.svg |    74 +
 .../classtvm_1_1GlobalVar__inherit__graph.svg      |    74 +
 docs/api/doxygen/classtvm_1_1IRModule-members.html |   114 +
 docs/api/doxygen/classtvm_1_1IRModule.html         |   452 +
 .../doxygen/classtvm_1_1IRModuleNode-members.html  |   139 +
 docs/api/doxygen/classtvm_1_1IRModuleNode.html     |  1109 ++
 .../classtvm_1_1IRModuleNode__coll__graph.svg      |   127 +
 .../classtvm_1_1IRModuleNode__inherit__graph.svg   |    52 +
 .../doxygen/classtvm_1_1IRModule__coll__graph.svg  |    43 +
 .../classtvm_1_1IRModule__inherit__graph.svg       |    43 +
 .../classtvm_1_1IncompleteType-members.html        |   108 +
 docs/api/doxygen/classtvm_1_1IncompleteType.html   |   206 +
 .../classtvm_1_1IncompleteTypeNode-members.html    |   116 +
 .../doxygen/classtvm_1_1IncompleteTypeNode.html    |   314 +
 ...classtvm_1_1IncompleteTypeNode__coll__graph.svg |    95 +
 ...sstvm_1_1IncompleteTypeNode__inherit__graph.svg |    63 +
 .../classtvm_1_1IncompleteType__coll__graph.svg    |    56 +
 .../classtvm_1_1IncompleteType__inherit__graph.svg |    56 +
 docs/api/doxygen/classtvm_1_1IntImm-members.html   |   112 +
 docs/api/doxygen/classtvm_1_1IntImm.html           |   220 +
 .../doxygen/classtvm_1_1IntImmNode-members.html    |   117 +
 docs/api/doxygen/classtvm_1_1IntImmNode.html       |   321 +
 .../classtvm_1_1IntImmNode__coll__graph.svg        |   115 +
 .../classtvm_1_1IntImmNode__inherit__graph.svg     |    81 +
 .../doxygen/classtvm_1_1IntImm__coll__graph.svg    |    77 +
 .../doxygen/classtvm_1_1IntImm__inherit__graph.svg |   125 +
 docs/api/doxygen/classtvm_1_1Integer-members.html  |   123 +
 docs/api/doxygen/classtvm_1_1Integer.html          |   490 +
 .../doxygen/classtvm_1_1Integer__coll__graph.svg   |   104 +
 .../classtvm_1_1Integer__inherit__graph.svg        |   104 +
 docs/api/doxygen/classtvm_1_1Map-members.html      |   127 +
 docs/api/doxygen/classtvm_1_1Map.html              |   922 ++
 docs/api/doxygen/classtvm_1_1MapNode-members.html  |   109 +
 docs/api/doxygen/classtvm_1_1MapNode.html          |   230 +
 .../doxygen/classtvm_1_1MapNode__coll__graph.svg   |    37 +
 .../classtvm_1_1MapNode__inherit__graph.svg        |    37 +
 docs/api/doxygen/classtvm_1_1Map__coll__graph.svg  |    47 +
 .../doxygen/classtvm_1_1Map__inherit__graph.svg    |    47 +
 .../doxygen/classtvm_1_1MemoryInfo-members.html    |   106 +
 docs/api/doxygen/classtvm_1_1MemoryInfo.html       |   166 +
 .../classtvm_1_1MemoryInfoNode-members.html        |   112 +
 docs/api/doxygen/classtvm_1_1MemoryInfoNode.html   |   285 +
 .../classtvm_1_1MemoryInfoNode__coll__graph.svg    |    94 +
 .../classtvm_1_1MemoryInfoNode__inherit__graph.svg |    41 +
 .../classtvm_1_1MemoryInfo__coll__graph.svg        |    37 +
 .../classtvm_1_1MemoryInfo__inherit__graph.svg     |    37 +
 docs/api/doxygen/classtvm_1_1NodeFunctor.html      |   128 +
 ...jectRef_01_6n_00_01Args_8_8_8_08_4-members.html |   110 +
 ...nst_01ObjectRef_01_6n_00_01Args_8_8_8_08_4.html |   319 +
 ...Ref_01_6n_00_01Args_8_8_8_08_4__coll__graph.svg |    27 +
 .../classtvm_1_1NodeFunctor__coll__graph.svg       |    22 +
 docs/api/doxygen/classtvm_1_1Op-members.html       |   114 +
 docs/api/doxygen/classtvm_1_1Op.html               |   369 +
 .../api/doxygen/classtvm_1_1OpAttrMap-members.html |   113 +
 docs/api/doxygen/classtvm_1_1OpAttrMap.html        |   260 +
 .../doxygen/classtvm_1_1OpAttrMap__coll__graph.svg |    64 +
 .../classtvm_1_1OpAttrMap__inherit__graph.svg      |    43 +
 docs/api/doxygen/classtvm_1_1OpNode-members.html   |   132 +
 docs/api/doxygen/classtvm_1_1OpNode.html           |   599 +
 .../doxygen/classtvm_1_1OpNode__coll__graph.svg    |   185 +
 .../doxygen/classtvm_1_1OpNode__inherit__graph.svg |    92 +
 .../doxygen/classtvm_1_1OpRegEntry-members.html    |   117 +
 docs/api/doxygen/classtvm_1_1OpRegEntry.html       |   593 +
 .../classtvm_1_1OpRegEntry__coll__graph.svg        |    32 +
 docs/api/doxygen/classtvm_1_1Op__coll__graph.svg   |    77 +
 .../api/doxygen/classtvm_1_1Op__inherit__graph.svg |    77 +
 .../doxygen/classtvm_1_1PointerType-members.html   |   108 +
 docs/api/doxygen/classtvm_1_1PointerType.html      |   200 +
 .../classtvm_1_1PointerTypeNode-members.html       |   116 +
 docs/api/doxygen/classtvm_1_1PointerTypeNode.html  |   315 +
 .../classtvm_1_1PointerTypeNode__coll__graph.svg   |   118 +
 ...classtvm_1_1PointerTypeNode__inherit__graph.svg |    63 +
 .../classtvm_1_1PointerType__coll__graph.svg       |    56 +
 .../classtvm_1_1PointerType__inherit__graph.svg    |    56 +
 docs/api/doxygen/classtvm_1_1PrimExpr-members.html |   111 +
 docs/api/doxygen/classtvm_1_1PrimExpr.html         |   278 +
 .../doxygen/classtvm_1_1PrimExprNode-members.html  |   112 +
 docs/api/doxygen/classtvm_1_1PrimExprNode.html     |   248 +
 .../classtvm_1_1PrimExprNode__coll__graph.svg      |    94 +
 .../classtvm_1_1PrimExprNode__inherit__graph.svg   |  1070 ++
 .../doxygen/classtvm_1_1PrimExpr__coll__graph.svg  |    58 +
 .../classtvm_1_1PrimExpr__inherit__graph.svg       |   223 +
 docs/api/doxygen/classtvm_1_1PrimType-members.html |   108 +
 docs/api/doxygen/classtvm_1_1PrimType.html         |   200 +
 .../doxygen/classtvm_1_1PrimTypeNode-members.html  |   116 +
 docs/api/doxygen/classtvm_1_1PrimTypeNode.html     |   314 +
 .../classtvm_1_1PrimTypeNode__coll__graph.svg      |   129 +
 .../classtvm_1_1PrimTypeNode__inherit__graph.svg   |    63 +
 .../doxygen/classtvm_1_1PrimType__coll__graph.svg  |    56 +
 .../classtvm_1_1PrimType__inherit__graph.svg       |    56 +
 docs/api/doxygen/classtvm_1_1Range-members.html    |   108 +
 docs/api/doxygen/classtvm_1_1Range.html            |   255 +
 .../api/doxygen/classtvm_1_1RangeNode-members.html |   116 +
 docs/api/doxygen/classtvm_1_1RangeNode.html        |   422 +
 .../doxygen/classtvm_1_1RangeNode__coll__graph.svg |   100 +
 .../classtvm_1_1RangeNode__inherit__graph.svg      |    47 +
 .../api/doxygen/classtvm_1_1Range__coll__graph.svg |    39 +
 .../doxygen/classtvm_1_1Range__inherit__graph.svg  |    39 +
 .../classtvm_1_1ReflectionVTable-members.html      |   121 +
 docs/api/doxygen/classtvm_1_1ReflectionVTable.html |   653 ++
 ...vm_1_1ReflectionVTable_1_1Registry-members.html |   108 +
 .../classtvm_1_1ReflectionVTable_1_1Registry.html  |   235 +
 ..._1ReflectionVTable_1_1Registry__coll__graph.svg |    25 +
 .../classtvm_1_1ReflectionVTable__coll__graph.svg  |    32 +
 .../api/doxygen/classtvm_1_1RelayExpr-members.html |   107 +
 docs/api/doxygen/classtvm_1_1RelayExpr.html        |   170 +
 .../doxygen/classtvm_1_1RelayExprNode-members.html |   115 +
 docs/api/doxygen/classtvm_1_1RelayExprNode.html    |   343 +
 .../classtvm_1_1RelayExprNode__coll__graph.svg     |   118 +
 .../classtvm_1_1RelayExprNode__inherit__graph.svg  |   483 +
 .../doxygen/classtvm_1_1RelayExpr__coll__graph.svg |    55 +
 .../classtvm_1_1RelayExpr__inherit__graph.svg      |   403 +
 .../doxygen/classtvm_1_1RelayRefType-members.html  |   108 +
 docs/api/doxygen/classtvm_1_1RelayRefType.html     |   197 +
 .../classtvm_1_1RelayRefTypeNode-members.html      |   117 +
 docs/api/doxygen/classtvm_1_1RelayRefTypeNode.html |   339 +
 .../classtvm_1_1RelayRefTypeNode__coll__graph.svg  |   119 +
 ...lasstvm_1_1RelayRefTypeNode__inherit__graph.svg |    64 +
 .../classtvm_1_1RelayRefType__coll__graph.svg      |    56 +
 .../classtvm_1_1RelayRefType__inherit__graph.svg   |    56 +
 .../doxygen/classtvm_1_1ReprPrinter-members.html   |   112 +
 docs/api/doxygen/classtvm_1_1ReprPrinter.html      |   281 +
 .../classtvm_1_1ReprPrinter__coll__graph.svg       |    26 +
 .../doxygen/classtvm_1_1SEqualReducer-members.html |   120 +
 docs/api/doxygen/classtvm_1_1SEqualReducer.html    |   451 +
 ...asstvm_1_1SEqualReducer_1_1Handler-members.html |   108 +
 .../classtvm_1_1SEqualReducer_1_1Handler.html      |   245 +
 ...vm_1_1SEqualReducer_1_1Handler__coll__graph.svg |    25 +
 .../classtvm_1_1SEqualReducer__coll__graph.svg     |    52 +
 .../classtvm_1_1SEqualReducer__inherit__graph.svg  |    52 +
 .../doxygen/classtvm_1_1SHashReducer-members.html  |   112 +
 docs/api/doxygen/classtvm_1_1SHashReducer.html     |   383 +
 ...lasstvm_1_1SHashReducer_1_1Handler-members.html |   110 +
 .../classtvm_1_1SHashReducer_1_1Handler.html       |   330 +
 ...tvm_1_1SHashReducer_1_1Handler__coll__graph.svg |    27 +
 .../classtvm_1_1SHashReducer__coll__graph.svg      |    28 +
 .../doxygen/classtvm_1_1SourceName-members.html    |   107 +
 docs/api/doxygen/classtvm_1_1SourceName.html       |   207 +
 .../classtvm_1_1SourceNameNode-members.html        |   110 +
 docs/api/doxygen/classtvm_1_1SourceNameNode.html   |   270 +
 .../classtvm_1_1SourceNameNode__coll__graph.svg    |    53 +
 .../classtvm_1_1SourceNameNode__inherit__graph.svg |    39 +
 .../classtvm_1_1SourceName__coll__graph.svg        |    38 +
 .../classtvm_1_1SourceName__inherit__graph.svg     |    38 +
 docs/api/doxygen/classtvm_1_1Span-members.html     |   106 +
 docs/api/doxygen/classtvm_1_1Span.html             |   161 +
 docs/api/doxygen/classtvm_1_1SpanNode-members.html |   113 +
 docs/api/doxygen/classtvm_1_1SpanNode.html         |   350 +
 .../doxygen/classtvm_1_1SpanNode__coll__graph.svg  |    75 +
 .../classtvm_1_1SpanNode__inherit__graph.svg       |    42 +
 docs/api/doxygen/classtvm_1_1Span__coll__graph.svg |    37 +
 .../doxygen/classtvm_1_1Span__inherit__graph.svg   |    37 +
 .../doxygen/classtvm_1_1StrMapNode-members.html    |   109 +
 docs/api/doxygen/classtvm_1_1StrMapNode.html       |   230 +
 .../classtvm_1_1StrMapNode__coll__graph.svg        |    37 +
 .../classtvm_1_1StrMapNode__inherit__graph.svg     |    37 +
 .../classtvm_1_1StructuralEqual-members.html       |   114 +
 docs/api/doxygen/classtvm_1_1StructuralEqual.html  |   201 +
 .../classtvm_1_1StructuralEqual__coll__graph.svg   |    46 +
 ...classtvm_1_1StructuralEqual__inherit__graph.svg |    46 +
 .../classtvm_1_1StructuralHash-members.html        |   114 +
 docs/api/doxygen/classtvm_1_1StructuralHash.html   |   183 +
 .../classtvm_1_1StructuralHash__coll__graph.svg    |    46 +
 .../classtvm_1_1StructuralHash__inherit__graph.svg |    46 +
 docs/api/doxygen/classtvm_1_1Target-members.html   |   113 +
 docs/api/doxygen/classtvm_1_1Target.html           |   353 +
 .../doxygen/classtvm_1_1TargetNode-members.html    |   120 +
 docs/api/doxygen/classtvm_1_1TargetNode.html       |   433 +
 .../classtvm_1_1TargetNode__coll__graph.svg        |    63 +
 .../classtvm_1_1TargetNode__inherit__graph.svg     |    49 +
 .../doxygen/classtvm_1_1Target__coll__graph.svg    |    40 +
 .../doxygen/classtvm_1_1Target__inherit__graph.svg |    40 +
 .../doxygen/classtvm_1_1TensorType-members.html    |   109 +
 docs/api/doxygen/classtvm_1_1TensorType.html       |   249 +
 .../classtvm_1_1TensorTypeNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1TensorTypeNode.html   |   359 +
 .../classtvm_1_1TensorTypeNode__coll__graph.svg    |   163 +
 .../classtvm_1_1TensorTypeNode__inherit__graph.svg |    83 +
 .../classtvm_1_1TensorType__coll__graph.svg        |    57 +
 .../classtvm_1_1TensorType__inherit__graph.svg     |    57 +
 .../api/doxygen/classtvm_1_1TupleType-members.html |   109 +
 docs/api/doxygen/classtvm_1_1TupleType.html        |   239 +
 .../doxygen/classtvm_1_1TupleTypeNode-members.html |   117 +
 docs/api/doxygen/classtvm_1_1TupleTypeNode.html    |   339 +
 .../classtvm_1_1TupleTypeNode__coll__graph.svg     |   110 +
 .../classtvm_1_1TupleTypeNode__inherit__graph.svg  |    64 +
 .../doxygen/classtvm_1_1TupleType__coll__graph.svg |    57 +
 .../classtvm_1_1TupleType__inherit__graph.svg      |    57 +
 docs/api/doxygen/classtvm_1_1Type-members.html     |   106 +
 docs/api/doxygen/classtvm_1_1Type.html             |   167 +
 docs/api/doxygen/classtvm_1_1TypeCall-members.html |   108 +
 docs/api/doxygen/classtvm_1_1TypeCall.html         |   209 +
 .../doxygen/classtvm_1_1TypeCallNode-members.html  |   117 +
 docs/api/doxygen/classtvm_1_1TypeCallNode.html     |   330 +
 .../classtvm_1_1TypeCallNode__coll__graph.svg      |   133 +
 .../classtvm_1_1TypeCallNode__inherit__graph.svg   |    64 +
 .../doxygen/classtvm_1_1TypeCall__coll__graph.svg  |    56 +
 .../classtvm_1_1TypeCall__inherit__graph.svg       |    56 +
 .../classtvm_1_1TypeConstraint-members.html        |   107 +
 docs/api/doxygen/classtvm_1_1TypeConstraint.html   |   170 +
 .../classtvm_1_1TypeConstraintNode-members.html    |   112 +
 .../doxygen/classtvm_1_1TypeConstraintNode.html    |   229 +
 ...classtvm_1_1TypeConstraintNode__coll__graph.svg |    92 +
 ...sstvm_1_1TypeConstraintNode__inherit__graph.svg |    84 +
 .../classtvm_1_1TypeConstraint__coll__graph.svg    |    55 +
 .../classtvm_1_1TypeConstraint__inherit__graph.svg |    74 +
 docs/api/doxygen/classtvm_1_1TypeData-members.html |   108 +
 docs/api/doxygen/classtvm_1_1TypeData.html         |   216 +
 .../doxygen/classtvm_1_1TypeDataNode-members.html  |   118 +
 docs/api/doxygen/classtvm_1_1TypeDataNode.html     |   346 +
 .../classtvm_1_1TypeDataNode__coll__graph.svg      |   167 +
 .../classtvm_1_1TypeDataNode__inherit__graph.svg   |    65 +
 .../doxygen/classtvm_1_1TypeData__coll__graph.svg  |    56 +
 .../classtvm_1_1TypeData__inherit__graph.svg       |    56 +
 docs/api/doxygen/classtvm_1_1TypeFunctor.html      |   113 +
 ..._01Type_01_6n_00_01Args_8_8_8_08_4-members.html |   123 +
 ..._07const_01Type_01_6n_00_01Args_8_8_8_08_4.html |   806 ++
 ...ype_01_6n_00_01Args_8_8_8_08_4__coll__graph.svg |    33 +
 .../classtvm_1_1TypeFunctor__coll__graph.svg       |    22 +
 .../doxygen/classtvm_1_1TypeMutator-members.html   |   118 +
 docs/api/doxygen/classtvm_1_1TypeMutator.html      |   470 +
 .../classtvm_1_1TypeMutator__coll__graph.svg       |    52 +
 .../classtvm_1_1TypeMutator__inherit__graph.svg    |    52 +
 docs/api/doxygen/classtvm_1_1TypeNode-members.html |   111 +
 docs/api/doxygen/classtvm_1_1TypeNode.html         |   289 +
 .../doxygen/classtvm_1_1TypeNode__coll__graph.svg  |    74 +
 .../classtvm_1_1TypeNode__inherit__graph.svg       |   345 +
 .../doxygen/classtvm_1_1TypeRelation-members.html  |   109 +
 docs/api/doxygen/classtvm_1_1TypeRelation.html     |   227 +
 .../classtvm_1_1TypeRelationNode-members.html      |   120 +
 docs/api/doxygen/classtvm_1_1TypeRelationNode.html |   373 +
 .../classtvm_1_1TypeRelationNode__coll__graph.svg  |   174 +
 ...lasstvm_1_1TypeRelationNode__inherit__graph.svg |    84 +
 .../classtvm_1_1TypeRelation__coll__graph.svg      |    74 +
 .../classtvm_1_1TypeRelation__inherit__graph.svg   |    74 +
 .../doxygen/classtvm_1_1TypeReporter-members.html  |   109 +
 docs/api/doxygen/classtvm_1_1TypeReporter.html     |   229 +
 .../classtvm_1_1TypeReporterNode-members.html      |   114 +
 docs/api/doxygen/classtvm_1_1TypeReporterNode.html |   430 +
 .../classtvm_1_1TypeReporterNode__coll__graph.svg  |    43 +
 ...lasstvm_1_1TypeReporterNode__inherit__graph.svg |    43 +
 .../classtvm_1_1TypeReporter__coll__graph.svg      |    38 +
 .../classtvm_1_1TypeReporter__inherit__graph.svg   |    38 +
 docs/api/doxygen/classtvm_1_1TypeVar-members.html  |   108 +
 docs/api/doxygen/classtvm_1_1TypeVar.html          |   209 +
 .../doxygen/classtvm_1_1TypeVarNode-members.html   |   117 +
 docs/api/doxygen/classtvm_1_1TypeVarNode.html      |   332 +
 .../classtvm_1_1TypeVarNode__coll__graph.svg       |   110 +
 .../classtvm_1_1TypeVarNode__inherit__graph.svg    |    64 +
 .../doxygen/classtvm_1_1TypeVar__coll__graph.svg   |    56 +
 .../classtvm_1_1TypeVar__inherit__graph.svg        |    56 +
 .../doxygen/classtvm_1_1TypeVisitor-members.html   |   117 +
 docs/api/doxygen/classtvm_1_1TypeVisitor.html      |   444 +
 .../classtvm_1_1TypeVisitor__coll__graph.svg       |    51 +
 .../classtvm_1_1TypeVisitor__inherit__graph.svg    |    51 +
 docs/api/doxygen/classtvm_1_1Type__coll__graph.svg |    37 +
 .../doxygen/classtvm_1_1Type__inherit__graph.svg   |   303 +
 docs/api/doxygen/classtvm_1_1TypedEnvFunc.html     |   121 +
 ...pedEnvFunc_3_01R_07Args_8_8_8_08_4-members.html |   112 +
 ...vm_1_1TypedEnvFunc_3_01R_07Args_8_8_8_08_4.html |   346 +
 ...nvFunc_3_01R_07Args_8_8_8_08_4__coll__graph.svg |    41 +
 ...unc_3_01R_07Args_8_8_8_08_4__inherit__graph.svg |    41 +
 .../classtvm_1_1TypedEnvFunc__coll__graph.svg      |    23 +
 docs/api/doxygen/classtvm_1_1With-members.html     |   107 +
 docs/api/doxygen/classtvm_1_1With.html             |   199 +
 docs/api/doxygen/classtvm_1_1With__coll__graph.svg |    23 +
 .../classtvm_1_1arith_1_1Analyzer-members.html     |   120 +
 .../api/doxygen/classtvm_1_1arith_1_1Analyzer.html |   561 +
 .../classtvm_1_1arith_1_1Analyzer__coll__graph.svg |   129 +
 ...vm_1_1arith_1_1CanonicalSimplifier-members.html |   109 +
 .../classtvm_1_1arith_1_1CanonicalSimplifier.html  |   248 +
 ..._1arith_1_1CanonicalSimplifier__coll__graph.svg |    23 +
 ...classtvm_1_1arith_1_1ConstIntBound-members.html |   109 +
 .../classtvm_1_1arith_1_1ConstIntBound.html        |   255 +
 ..._1_1arith_1_1ConstIntBoundAnalyzer-members.html |   112 +
 ...classtvm_1_1arith_1_1ConstIntBoundAnalyzer.html |   351 +
 ...arith_1_1ConstIntBoundAnalyzer__coll__graph.svg |    26 +
 ...stvm_1_1arith_1_1ConstIntBoundNode-members.html |   113 +
 .../classtvm_1_1arith_1_1ConstIntBoundNode.html    |   333 +
 ..._1_1arith_1_1ConstIntBoundNode__coll__graph.svg |    42 +
 ...1arith_1_1ConstIntBoundNode__inherit__graph.svg |    42 +
 ...stvm_1_1arith_1_1ConstIntBound__coll__graph.svg |    39 +
 ...m_1_1arith_1_1ConstIntBound__inherit__graph.svg |    39 +
 ...stvm_1_1arith_1_1ConstraintContext-members.html |   106 +
 .../classtvm_1_1arith_1_1ConstraintContext.html    |   148 +
 ..._1_1arith_1_1ConstraintContext__coll__graph.svg |    22 +
 ...lasstvm_1_1arith_1_1IntConstraints-members.html |   107 +
 .../classtvm_1_1arith_1_1IntConstraints.html       |   213 +
 ...tvm_1_1arith_1_1IntConstraintsNode-members.html |   114 +
 .../classtvm_1_1arith_1_1IntConstraintsNode.html   |   344 +
 ...1_1arith_1_1IntConstraintsNode__coll__graph.svg |   114 +
 ...arith_1_1IntConstraintsNode__inherit__graph.svg |    44 +
 ..._1arith_1_1IntConstraintsTransform-members.html |   107 +
 ...asstvm_1_1arith_1_1IntConstraintsTransform.html |   220 +
 ...ith_1_1IntConstraintsTransformNode-members.html |   115 +
 ...vm_1_1arith_1_1IntConstraintsTransformNode.html |   358 +
 ...1_1IntConstraintsTransformNode__coll__graph.svg |   112 +
 ...IntConstraintsTransformNode__inherit__graph.svg |    46 +
 ...ith_1_1IntConstraintsTransform__coll__graph.svg |    39 +
 ..._1_1IntConstraintsTransform__inherit__graph.svg |    39 +
 ...tvm_1_1arith_1_1IntConstraints__coll__graph.svg |    38 +
 ..._1_1arith_1_1IntConstraints__inherit__graph.svg |    38 +
 .../classtvm_1_1arith_1_1IntSet-members.html       |   127 +
 docs/api/doxygen/classtvm_1_1arith_1_1IntSet.html  |   680 ++
 ...lasstvm_1_1arith_1_1IntSetAnalyzer-members.html |   107 +
 .../classtvm_1_1arith_1_1IntSetAnalyzer.html       |   192 +
 ...tvm_1_1arith_1_1IntSetAnalyzer__coll__graph.svg |    22 +
 .../classtvm_1_1arith_1_1IntSetNode-members.html   |   108 +
 .../doxygen/classtvm_1_1arith_1_1IntSetNode.html   |   210 +
 ...lasstvm_1_1arith_1_1IntSetNode__coll__graph.svg |    38 +
 ...stvm_1_1arith_1_1IntSetNode__inherit__graph.svg |    38 +
 .../classtvm_1_1arith_1_1IntSet__coll__graph.svg   |    52 +
 ...classtvm_1_1arith_1_1IntSet__inherit__graph.svg |    52 +
 .../classtvm_1_1arith_1_1ModularSet-members.html   |   107 +
 .../doxygen/classtvm_1_1arith_1_1ModularSet.html   |   196 +
 ...tvm_1_1arith_1_1ModularSetAnalyzer-members.html |   109 +
 .../classtvm_1_1arith_1_1ModularSetAnalyzer.html   |   248 +
 ...1_1arith_1_1ModularSetAnalyzer__coll__graph.svg |    23 +
 ...lasstvm_1_1arith_1_1ModularSetNode-members.html |   111 +
 .../classtvm_1_1arith_1_1ModularSetNode.html       |   290 +
 ...tvm_1_1arith_1_1ModularSetNode__coll__graph.svg |    40 +
 ..._1_1arith_1_1ModularSetNode__inherit__graph.svg |    40 +
 ...lasstvm_1_1arith_1_1ModularSet__coll__graph.svg |    38 +
 ...stvm_1_1arith_1_1ModularSet__inherit__graph.svg |    38 +
 ...stvm_1_1arith_1_1RewriteSimplifier-members.html |   111 +
 .../classtvm_1_1arith_1_1RewriteSimplifier.html    |   288 +
 ..._1_1arith_1_1RewriteSimplifier__coll__graph.svg |    24 +
 ...classtvm_1_1detail_1_1AttrDocEntry-members.html |   111 +
 .../classtvm_1_1detail_1_1AttrDocEntry.html        |   280 +
 ...stvm_1_1detail_1_1AttrDocEntry__coll__graph.svg |    26 +
 ...asstvm_1_1detail_1_1AttrDocVisitor-members.html |   107 +
 .../classtvm_1_1detail_1_1AttrDocVisitor.html      |   179 +
 ...vm_1_1detail_1_1AttrDocVisitor__coll__graph.svg |    37 +
 ...stvm_1_1detail_1_1AttrExistVisitor-members.html |   108 +
 .../classtvm_1_1detail_1_1AttrExistVisitor.html    |   193 +
 ..._1_1detail_1_1AttrExistVisitor__coll__graph.svg |    23 +
 ...sstvm_1_1detail_1_1AttrInitVisitor-members.html |   108 +
 .../classtvm_1_1detail_1_1AttrInitVisitor.html     |   222 +
 ...m_1_1detail_1_1AttrInitVisitor__coll__graph.svg |    24 +
 ...1_1detail_1_1AttrNonDefaultVisitor-members.html |   107 +
 ...lasstvm_1_1detail_1_1AttrNonDefaultVisitor.html |   187 +
 ...etail_1_1AttrNonDefaultVisitor__coll__graph.svg |    24 +
 ...tvm_1_1detail_1_1AttrNormalVisitor-members.html |   107 +
 .../classtvm_1_1detail_1_1AttrNormalVisitor.html   |   187 +
 ...1_1detail_1_1AttrNormalVisitor__coll__graph.svg |    23 +
 ...vm_1_1detail_1_1AttrsSEqualVisitor-members.html |   108 +
 .../classtvm_1_1detail_1_1AttrsSEqualVisitor.html  |   222 +
 ..._1detail_1_1AttrsSEqualVisitor__coll__graph.svg |    24 +
 ...tvm_1_1detail_1_1AttrsSHashVisitor-members.html |   107 +
 .../classtvm_1_1detail_1_1AttrsSHashVisitor.html   |   187 +
 ...1_1detail_1_1AttrsSHashVisitor__coll__graph.svg |    23 +
 .../classtvm_1_1relay_1_1AltPattern-members.html   |   108 +
 .../doxygen/classtvm_1_1relay_1_1AltPattern.html   |   198 +
 ...lasstvm_1_1relay_1_1AltPatternNode-members.html |   111 +
 .../classtvm_1_1relay_1_1AltPatternNode.html       |   257 +
 ...tvm_1_1relay_1_1AltPatternNode__coll__graph.svg |    88 +
 ..._1_1relay_1_1AltPatternNode__inherit__graph.svg |    56 +
 ...lasstvm_1_1relay_1_1AltPattern__coll__graph.svg |    56 +
 ...stvm_1_1relay_1_1AltPattern__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1AttrPattern-members.html  |   108 +
 .../doxygen/classtvm_1_1relay_1_1AttrPattern.html  |   198 +
 ...asstvm_1_1relay_1_1AttrPatternNode-members.html |   111 +
 .../classtvm_1_1relay_1_1AttrPatternNode.html      |   257 +
 ...vm_1_1relay_1_1AttrPatternNode__coll__graph.svg |   111 +
 ...1_1relay_1_1AttrPatternNode__inherit__graph.svg |    56 +
 ...asstvm_1_1relay_1_1AttrPattern__coll__graph.svg |    56 +
 ...tvm_1_1relay_1_1AttrPattern__inherit__graph.svg |    56 +
 .../doxygen/classtvm_1_1relay_1_1Call-members.html |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1Call.html    |   220 +
 .../classtvm_1_1relay_1_1CallNode-members.html     |   123 +
 .../api/doxygen/classtvm_1_1relay_1_1CallNode.html |   385 +
 .../classtvm_1_1relay_1_1CallNode__coll__graph.svg |   206 +
 ...asstvm_1_1relay_1_1CallNode__inherit__graph.svg |    87 +
 .../classtvm_1_1relay_1_1CallPattern-members.html  |   108 +
 .../doxygen/classtvm_1_1relay_1_1CallPattern.html  |   205 +
 ...asstvm_1_1relay_1_1CallPatternNode-members.html |   113 +
 .../classtvm_1_1relay_1_1CallPatternNode.html      |   296 +
 ...vm_1_1relay_1_1CallPatternNode__coll__graph.svg |   113 +
 ...1_1relay_1_1CallPatternNode__inherit__graph.svg |    58 +
 ...asstvm_1_1relay_1_1CallPattern__coll__graph.svg |    56 +
 ...tvm_1_1relay_1_1CallPattern__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1Call__coll__graph.svg     |    74 +
 .../classtvm_1_1relay_1_1Call__inherit__graph.svg  |    74 +
 .../classtvm_1_1relay_1_1Clause-members.html       |   107 +
 docs/api/doxygen/classtvm_1_1relay_1_1Clause.html  |   208 +
 .../classtvm_1_1relay_1_1ClauseNode-members.html   |   114 +
 .../doxygen/classtvm_1_1relay_1_1ClauseNode.html   |   357 +
 ...lasstvm_1_1relay_1_1ClauseNode__coll__graph.svg |   118 +
 ...stvm_1_1relay_1_1ClauseNode__inherit__graph.svg |    45 +
 .../classtvm_1_1relay_1_1Clause__coll__graph.svg   |    38 +
 ...classtvm_1_1relay_1_1Clause__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1Constant-members.html     |   109 +
 .../api/doxygen/classtvm_1_1relay_1_1Constant.html |   203 +
 .../classtvm_1_1relay_1_1ConstantNode-members.html |   122 +
 .../doxygen/classtvm_1_1relay_1_1ConstantNode.html |   373 +
 ...sstvm_1_1relay_1_1ConstantNode__coll__graph.svg |   236 +
 ...vm_1_1relay_1_1ConstantNode__inherit__graph.svg |    86 +
 .../classtvm_1_1relay_1_1Constant__coll__graph.svg |    74 +
 ...asstvm_1_1relay_1_1Constant__inherit__graph.svg |    74 +
 ...sstvm_1_1relay_1_1ConstructorValue-members.html |   107 +
 .../classtvm_1_1relay_1_1ConstructorValue.html     |   196 +
 ...m_1_1relay_1_1ConstructorValue__coll__graph.svg |    38 +
 ..._1relay_1_1ConstructorValue__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1DFPattern-members.html    |   106 +
 .../doxygen/classtvm_1_1relay_1_1DFPattern.html    |   167 +
 ...stvm_1_1relay_1_1DFPatternCallback-members.html |   107 +
 .../classtvm_1_1relay_1_1DFPatternCallback.html    |   196 +
 ..._1_1relay_1_1DFPatternCallbackNode-members.html |   110 +
 ...classtvm_1_1relay_1_1DFPatternCallbackNode.html |   252 +
 ...relay_1_1DFPatternCallbackNode__coll__graph.svg |    85 +
 ...ay_1_1DFPatternCallbackNode__inherit__graph.svg |    39 +
 ..._1_1relay_1_1DFPatternCallback__coll__graph.svg |    38 +
 ...1relay_1_1DFPatternCallback__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1DFPatternFunctor.html     |   127 +
 ...Pattern_01_6n_00_01Args_8_8_8_08_4-members.html |   119 +
 ...nst_01DFPattern_01_6n_00_01Args_8_8_8_08_4.html |   668 ++
 ...ern_01_6n_00_01Args_8_8_8_08_4__coll__graph.svg |    36 +
 ...m_1_1relay_1_1DFPatternFunctor__coll__graph.svg |    23 +
 ...classtvm_1_1relay_1_1DFPatternNode-members.html |   107 +
 .../classtvm_1_1relay_1_1DFPatternNode.html        |   188 +
 ...stvm_1_1relay_1_1DFPatternNode__coll__graph.svg |    36 +
 ...m_1_1relay_1_1DFPatternNode__inherit__graph.svg |   237 +
 ...sstvm_1_1relay_1_1DFPatternVisitor-members.html |   117 +
 .../classtvm_1_1relay_1_1DFPatternVisitor.html     |   446 +
 ...m_1_1relay_1_1DFPatternVisitor__coll__graph.svg |    50 +
 ..._1relay_1_1DFPatternVisitor__inherit__graph.svg |    50 +
 ...classtvm_1_1relay_1_1DFPattern__coll__graph.svg |    37 +
 ...sstvm_1_1relay_1_1DFPattern__inherit__graph.svg |   227 +
 ...sstvm_1_1relay_1_1DominatorPattern-members.html |   108 +
 .../classtvm_1_1relay_1_1DominatorPattern.html     |   204 +
 ...m_1_1relay_1_1DominatorPatternNode-members.html |   112 +
 .../classtvm_1_1relay_1_1DominatorPatternNode.html |   274 +
 ...1relay_1_1DominatorPatternNode__coll__graph.svg |    89 +
 ...lay_1_1DominatorPatternNode__inherit__graph.svg |    57 +
 ...m_1_1relay_1_1DominatorPattern__coll__graph.svg |    56 +
 ..._1relay_1_1DominatorPattern__inherit__graph.svg |    56 +
 .../doxygen/classtvm_1_1relay_1_1ExprFunctor.html  |   128 +
 ..._01Expr_01_6n_00_01Args_8_8_8_08_4-members.html |   125 +
 ..._07const_01Expr_01_6n_00_01Args_8_8_8_08_4.html |   882 ++
 ...xpr_01_6n_00_01Args_8_8_8_08_4__coll__graph.svg |    33 +
 ...asstvm_1_1relay_1_1ExprFunctor__coll__graph.svg |    23 +
 .../classtvm_1_1relay_1_1ExprMutator-members.html  |   126 +
 .../doxygen/classtvm_1_1relay_1_1ExprMutator.html  |   691 ++
 ...asstvm_1_1relay_1_1ExprMutator__coll__graph.svg |    50 +
 ...tvm_1_1relay_1_1ExprMutator__inherit__graph.svg |    77 +
 .../classtvm_1_1relay_1_1ExprPattern-members.html  |   108 +
 .../doxygen/classtvm_1_1relay_1_1ExprPattern.html  |   197 +
 ...asstvm_1_1relay_1_1ExprPatternNode-members.html |   110 +
 .../classtvm_1_1relay_1_1ExprPatternNode.html      |   240 +
 ...vm_1_1relay_1_1ExprPatternNode__coll__graph.svg |   105 +
 ...1_1relay_1_1ExprPatternNode__inherit__graph.svg |    55 +
 ...asstvm_1_1relay_1_1ExprPattern__coll__graph.svg |    56 +
 ...tvm_1_1relay_1_1ExprPattern__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1ExprRewriter-members.html |   123 +
 .../doxygen/classtvm_1_1relay_1_1ExprRewriter.html |   791 ++
 ...sstvm_1_1relay_1_1ExprRewriter__coll__graph.svg |    32 +
 .../classtvm_1_1relay_1_1ExprVisitor-members.html  |   125 +
 .../doxygen/classtvm_1_1relay_1_1ExprVisitor.html  |   654 ++
 ...asstvm_1_1relay_1_1ExprVisitor__coll__graph.svg |    50 +
 ...tvm_1_1relay_1_1ExprVisitor__inherit__graph.svg |    73 +
 .../classtvm_1_1relay_1_1FeatureSet-members.html   |   116 +
 .../doxygen/classtvm_1_1relay_1_1FeatureSet.html   |   451 +
 ...lasstvm_1_1relay_1_1FeatureSet__coll__graph.svg |    32 +
 .../classtvm_1_1relay_1_1Function-members.html     |   111 +
 .../api/doxygen/classtvm_1_1relay_1_1Function.html |   254 +
 .../classtvm_1_1relay_1_1FunctionNode-members.html |   129 +
 .../doxygen/classtvm_1_1relay_1_1FunctionNode.html |   426 +
 ...sstvm_1_1relay_1_1FunctionNode__coll__graph.svg |   255 +
 ...vm_1_1relay_1_1FunctionNode__inherit__graph.svg |   110 +
 .../classtvm_1_1relay_1_1Function__coll__graph.svg |    94 +
 ...asstvm_1_1relay_1_1Function__inherit__graph.svg |    94 +
 .../doxygen/classtvm_1_1relay_1_1Id-members.html   |   107 +
 docs/api/doxygen/classtvm_1_1relay_1_1Id.html      |   197 +
 .../classtvm_1_1relay_1_1IdNode-members.html       |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1IdNode.html  |   236 +
 .../classtvm_1_1relay_1_1IdNode__coll__graph.svg   |    52 +
 ...classtvm_1_1relay_1_1IdNode__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1Id__coll__graph.svg       |    38 +
 .../classtvm_1_1relay_1_1Id__inherit__graph.svg    |    38 +
 .../doxygen/classtvm_1_1relay_1_1If-members.html   |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1If.html      |   213 +
 .../classtvm_1_1relay_1_1IfNode-members.html       |   122 +
 docs/api/doxygen/classtvm_1_1relay_1_1IfNode.html  |   363 +
 .../classtvm_1_1relay_1_1IfNode__coll__graph.svg   |   182 +
 ...classtvm_1_1relay_1_1IfNode__inherit__graph.svg |    86 +
 .../classtvm_1_1relay_1_1If__coll__graph.svg       |    74 +
 .../classtvm_1_1relay_1_1If__inherit__graph.svg    |    74 +
 ...tvm_1_1relay_1_1InterpreterClosure-members.html |   127 +
 .../classtvm_1_1relay_1_1InterpreterClosure.html   |   255 +
 ..._1_1relay_1_1InterpreterClosureObj-members.html |   141 +
 ...classtvm_1_1relay_1_1InterpreterClosureObj.html |   368 +
 ...relay_1_1InterpreterClosureObj__coll__graph.svg |   218 +
 ...ay_1_1InterpreterClosureObj__inherit__graph.svg |    91 +
 ...1_1relay_1_1InterpreterClosure__coll__graph.svg |   103 +
 ...relay_1_1InterpreterClosure__inherit__graph.svg |    75 +
 .../doxygen/classtvm_1_1relay_1_1Let-members.html  |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1Let.html     |   213 +
 .../classtvm_1_1relay_1_1LetNode-members.html      |   122 +
 docs/api/doxygen/classtvm_1_1relay_1_1LetNode.html |   363 +
 .../classtvm_1_1relay_1_1LetNode__coll__graph.svg  |   225 +
 ...lasstvm_1_1relay_1_1LetNode__inherit__graph.svg |    86 +
 .../classtvm_1_1relay_1_1Let__coll__graph.svg      |    74 +
 .../classtvm_1_1relay_1_1Let__inherit__graph.svg   |    74 +
 .../classtvm_1_1relay_1_1Match-members.html        |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1Match.html   |   213 +
 .../classtvm_1_1relay_1_1MatchNode-members.html    |   122 +
 .../doxygen/classtvm_1_1relay_1_1MatchNode.html    |   363 +
 ...classtvm_1_1relay_1_1MatchNode__coll__graph.svg |   182 +
 ...sstvm_1_1relay_1_1MatchNode__inherit__graph.svg |    86 +
 .../classtvm_1_1relay_1_1Match__coll__graph.svg    |    74 +
 .../classtvm_1_1relay_1_1Match__inherit__graph.svg |    74 +
 ...sstvm_1_1relay_1_1MixedModeMutator-members.html |   133 +
 .../classtvm_1_1relay_1_1MixedModeMutator.html     |   521 +
 ...m_1_1relay_1_1MixedModeMutator__coll__graph.svg |    77 +
 ..._1relay_1_1MixedModeMutator__inherit__graph.svg |    77 +
 ...sstvm_1_1relay_1_1MixedModeVisitor-members.html |   129 +
 .../classtvm_1_1relay_1_1MixedModeVisitor.html     |   411 +
 ...m_1_1relay_1_1MixedModeVisitor__coll__graph.svg |    73 +
 ..._1relay_1_1MixedModeVisitor__inherit__graph.svg |    73 +
 ...sstvm_1_1relay_1_1OpImplementation-members.html |   108 +
 .../classtvm_1_1relay_1_1OpImplementation.html     |   258 +
 ...m_1_1relay_1_1OpImplementationNode-members.html |   112 +
 .../classtvm_1_1relay_1_1OpImplementationNode.html |   285 +
 ...1relay_1_1OpImplementationNode__coll__graph.svg |    83 +
 ...lay_1_1OpImplementationNode__inherit__graph.svg |    41 +
 ...m_1_1relay_1_1OpImplementation__coll__graph.svg |    39 +
 ..._1relay_1_1OpImplementation__inherit__graph.svg |    39 +
 ...sstvm_1_1relay_1_1OpSpecialization-members.html |   107 +
 .../classtvm_1_1relay_1_1OpSpecialization.html     |   218 +
 ...m_1_1relay_1_1OpSpecializationNode-members.html |   110 +
 .../classtvm_1_1relay_1_1OpSpecializationNode.html |   251 +
 ...1relay_1_1OpSpecializationNode__coll__graph.svg |    88 +
 ...lay_1_1OpSpecializationNode__inherit__graph.svg |    39 +
 ...m_1_1relay_1_1OpSpecialization__coll__graph.svg |    38 +
 ..._1relay_1_1OpSpecialization__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1OpStrategy-members.html   |   107 +
 .../doxygen/classtvm_1_1relay_1_1OpStrategy.html   |   218 +
 ...lasstvm_1_1relay_1_1OpStrategyNode-members.html |   109 +
 .../classtvm_1_1relay_1_1OpStrategyNode.html       |   234 +
 ...tvm_1_1relay_1_1OpStrategyNode__coll__graph.svg |    53 +
 ..._1_1relay_1_1OpStrategyNode__inherit__graph.svg |    38 +
 ...lasstvm_1_1relay_1_1OpStrategy__coll__graph.svg |    38 +
 ...stvm_1_1relay_1_1OpStrategy__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1Pattern-members.html      |   108 +
 docs/api/doxygen/classtvm_1_1relay_1_1Pattern.html |   204 +
 ...tvm_1_1relay_1_1PatternConstructor-members.html |   110 +
 .../classtvm_1_1relay_1_1PatternConstructor.html   |   211 +
 ...1_1relay_1_1PatternConstructorNode-members.html |   117 +
 ...lasstvm_1_1relay_1_1PatternConstructorNode.html |   329 +
 ...elay_1_1PatternConstructorNode__coll__graph.svg |   172 +
 ...y_1_1PatternConstructorNode__inherit__graph.svg |    80 +
 ...1_1relay_1_1PatternConstructor__coll__graph.svg |    56 +
 ...relay_1_1PatternConstructor__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1PatternFunctor.html       |   128 +
 ...Pattern_01_6n_00_01Args_8_8_8_08_4-members.html |   114 +
 ...const_01Pattern_01_6n_00_01Args_8_8_8_08_4.html |   464 +
 ...ern_01_6n_00_01Args_8_8_8_08_4__coll__graph.svg |    30 +
 ...tvm_1_1relay_1_1PatternFunctor__coll__graph.svg |    23 +
 ...lasstvm_1_1relay_1_1PatternMutator-members.html |   113 +
 .../classtvm_1_1relay_1_1PatternMutator.html       |   343 +
 ...tvm_1_1relay_1_1PatternMutator__coll__graph.svg |    47 +
 ..._1_1relay_1_1PatternMutator__inherit__graph.svg |    47 +
 .../classtvm_1_1relay_1_1PatternNode-members.html  |   111 +
 .../doxygen/classtvm_1_1relay_1_1PatternNode.html  |   244 +
 ...asstvm_1_1relay_1_1PatternNode__coll__graph.svg |    90 +
 ...tvm_1_1relay_1_1PatternNode__inherit__graph.svg |   142 +
 .../classtvm_1_1relay_1_1PatternTuple-members.html |   110 +
 .../doxygen/classtvm_1_1relay_1_1PatternTuple.html |   208 +
 ...sstvm_1_1relay_1_1PatternTupleNode-members.html |   116 +
 .../classtvm_1_1relay_1_1PatternTupleNode.html     |   314 +
 ...m_1_1relay_1_1PatternTupleNode__coll__graph.svg |   111 +
 ..._1relay_1_1PatternTupleNode__inherit__graph.svg |    79 +
 ...sstvm_1_1relay_1_1PatternTuple__coll__graph.svg |    56 +
 ...vm_1_1relay_1_1PatternTuple__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1PatternVar-members.html   |   110 +
 .../doxygen/classtvm_1_1relay_1_1PatternVar.html   |   208 +
 ...lasstvm_1_1relay_1_1PatternVarNode-members.html |   116 +
 .../classtvm_1_1relay_1_1PatternVarNode.html       |   316 +
 ...tvm_1_1relay_1_1PatternVarNode__coll__graph.svg |   172 +
 ..._1_1relay_1_1PatternVarNode__inherit__graph.svg |    79 +
 ...lasstvm_1_1relay_1_1PatternVar__coll__graph.svg |    56 +
 ...stvm_1_1relay_1_1PatternVar__inherit__graph.svg |    56 +
 ...lasstvm_1_1relay_1_1PatternVisitor-members.html |   112 +
 .../classtvm_1_1relay_1_1PatternVisitor.html       |   315 +
 ...tvm_1_1relay_1_1PatternVisitor__coll__graph.svg |    46 +
 ..._1_1relay_1_1PatternVisitor__inherit__graph.svg |    46 +
 ...asstvm_1_1relay_1_1PatternWildcard-members.html |   115 +
 .../classtvm_1_1relay_1_1PatternWildcard.html      |   327 +
 ...vm_1_1relay_1_1PatternWildcardNode-members.html |   115 +
 .../classtvm_1_1relay_1_1PatternWildcardNode.html  |   298 +
 ..._1relay_1_1PatternWildcardNode__coll__graph.svg |   110 +
 ...elay_1_1PatternWildcardNode__inherit__graph.svg |    78 +
 ...vm_1_1relay_1_1PatternWildcard__coll__graph.svg |    60 +
 ...1_1relay_1_1PatternWildcard__inherit__graph.svg |    60 +
 .../classtvm_1_1relay_1_1Pattern__coll__graph.svg  |    37 +
 ...lasstvm_1_1relay_1_1Pattern__inherit__graph.svg |   117 +
 .../classtvm_1_1relay_1_1RecClosure-members.html   |   107 +
 .../doxygen/classtvm_1_1relay_1_1RecClosure.html   |   190 +
 ...classtvm_1_1relay_1_1RecClosureObj-members.html |   111 +
 .../classtvm_1_1relay_1_1RecClosureObj.html        |   277 +
 ...stvm_1_1relay_1_1RecClosureObj__coll__graph.svg |   208 +
 ...m_1_1relay_1_1RecClosureObj__inherit__graph.svg |    40 +
 ...lasstvm_1_1relay_1_1RecClosure__coll__graph.svg |    38 +
 ...stvm_1_1relay_1_1RecClosure__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1RefCreate-members.html    |   109 +
 .../doxygen/classtvm_1_1relay_1_1RefCreate.html    |   203 +
 ...classtvm_1_1relay_1_1RefCreateNode-members.html |   120 +
 .../classtvm_1_1relay_1_1RefCreateNode.html        |   324 +
 ...stvm_1_1relay_1_1RefCreateNode__coll__graph.svg |   180 +
 ...m_1_1relay_1_1RefCreateNode__inherit__graph.svg |    84 +
 ...classtvm_1_1relay_1_1RefCreate__coll__graph.svg |    74 +
 ...sstvm_1_1relay_1_1RefCreate__inherit__graph.svg |    74 +
 .../classtvm_1_1relay_1_1RefRead-members.html      |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1RefRead.html |   203 +
 .../classtvm_1_1relay_1_1RefReadNode-members.html  |   120 +
 .../doxygen/classtvm_1_1relay_1_1RefReadNode.html  |   324 +
 ...asstvm_1_1relay_1_1RefReadNode__coll__graph.svg |   180 +
 ...tvm_1_1relay_1_1RefReadNode__inherit__graph.svg |    84 +
 .../classtvm_1_1relay_1_1RefRead__coll__graph.svg  |    74 +
 ...lasstvm_1_1relay_1_1RefRead__inherit__graph.svg |    74 +
 .../classtvm_1_1relay_1_1RefValue-members.html     |   107 +
 .../api/doxygen/classtvm_1_1relay_1_1RefValue.html |   180 +
 .../classtvm_1_1relay_1_1RefValue__coll__graph.svg |    38 +
 ...asstvm_1_1relay_1_1RefValue__inherit__graph.svg |    38 +
 .../classtvm_1_1relay_1_1RefWrite-members.html     |   109 +
 .../api/doxygen/classtvm_1_1relay_1_1RefWrite.html |   206 +
 .../classtvm_1_1relay_1_1RefWriteNode-members.html |   122 +
 .../doxygen/classtvm_1_1relay_1_1RefWriteNode.html |   381 +
 ...sstvm_1_1relay_1_1RefWriteNode__coll__graph.svg |   182 +
 ...vm_1_1relay_1_1RefWriteNode__inherit__graph.svg |    86 +
 .../classtvm_1_1relay_1_1RefWrite__coll__graph.svg |    74 +
 ...asstvm_1_1relay_1_1RefWrite__inherit__graph.svg |    74 +
 .../classtvm_1_1relay_1_1RelayNode-members.html    |   108 +
 .../doxygen/classtvm_1_1relay_1_1RelayNode.html    |   216 +
 ...classtvm_1_1relay_1_1RelayNode__coll__graph.svg |    69 +
 ...sstvm_1_1relay_1_1RelayNode__inherit__graph.svg |   142 +
 .../classtvm_1_1relay_1_1TempExpr-members.html     |   108 +
 .../api/doxygen/classtvm_1_1relay_1_1TempExpr.html |   167 +
 .../classtvm_1_1relay_1_1TempExprNode-members.html |   118 +
 .../doxygen/classtvm_1_1relay_1_1TempExprNode.html |   350 +
 ...sstvm_1_1relay_1_1TempExprNode__coll__graph.svg |   142 +
 ...vm_1_1relay_1_1TempExprNode__inherit__graph.svg |    87 +
 .../classtvm_1_1relay_1_1TempExpr__coll__graph.svg |    73 +
 ...asstvm_1_1relay_1_1TempExpr__inherit__graph.svg |    73 +
 .../classtvm_1_1relay_1_1Tuple-members.html        |   109 +
 docs/api/doxygen/classtvm_1_1relay_1_1Tuple.html   |   203 +
 .../classtvm_1_1relay_1_1TupleGetItem-members.html |   109 +
 .../doxygen/classtvm_1_1relay_1_1TupleGetItem.html |   206 +
 ...sstvm_1_1relay_1_1TupleGetItemNode-members.html |   121 +
 .../classtvm_1_1relay_1_1TupleGetItemNode.html     |   341 +
 ...m_1_1relay_1_1TupleGetItemNode__coll__graph.svg |   181 +
 ..._1relay_1_1TupleGetItemNode__inherit__graph.svg |    85 +
 ...vm_1_1relay_1_1TupleGetItemPattern-members.html |   108 +
 .../classtvm_1_1relay_1_1TupleGetItemPattern.html  |   193 +
 ..._1relay_1_1TupleGetItemPatternNode-members.html |   111 +
 ...asstvm_1_1relay_1_1TupleGetItemPatternNode.html |   252 +
 ...lay_1_1TupleGetItemPatternNode__coll__graph.svg |    89 +
 ..._1_1TupleGetItemPatternNode__inherit__graph.svg |    57 +
 ..._1relay_1_1TupleGetItemPattern__coll__graph.svg |    57 +
 ...elay_1_1TupleGetItemPattern__inherit__graph.svg |    57 +
 ...sstvm_1_1relay_1_1TupleGetItem__coll__graph.svg |    74 +
 ...vm_1_1relay_1_1TupleGetItem__inherit__graph.svg |    74 +
 .../classtvm_1_1relay_1_1TupleNode-members.html    |   120 +
 .../doxygen/classtvm_1_1relay_1_1TupleNode.html    |   329 +
 ...classtvm_1_1relay_1_1TupleNode__coll__graph.svg |   139 +
 ...sstvm_1_1relay_1_1TupleNode__inherit__graph.svg |    84 +
 .../classtvm_1_1relay_1_1TuplePattern-members.html |   108 +
 .../doxygen/classtvm_1_1relay_1_1TuplePattern.html |   191 +
 ...sstvm_1_1relay_1_1TuplePatternNode-members.html |   110 +
 .../classtvm_1_1relay_1_1TuplePatternNode.html     |   240 +
 ...m_1_1relay_1_1TuplePatternNode__coll__graph.svg |    55 +
 ..._1relay_1_1TuplePatternNode__inherit__graph.svg |    55 +
 ...sstvm_1_1relay_1_1TuplePattern__coll__graph.svg |    56 +
 ...vm_1_1relay_1_1TuplePattern__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1Tuple__coll__graph.svg    |    74 +
 .../classtvm_1_1relay_1_1Tuple__inherit__graph.svg |    74 +
 .../classtvm_1_1relay_1_1TypePattern-members.html  |   108 +
 .../doxygen/classtvm_1_1relay_1_1TypePattern.html  |   198 +
 ...asstvm_1_1relay_1_1TypePatternNode-members.html |   111 +
 .../classtvm_1_1relay_1_1TypePatternNode.html      |   257 +
 ...vm_1_1relay_1_1TypePatternNode__coll__graph.svg |   111 +
 ...1_1relay_1_1TypePatternNode__inherit__graph.svg |    56 +
 ...asstvm_1_1relay_1_1TypePattern__coll__graph.svg |    56 +
 ...tvm_1_1relay_1_1TypePattern__inherit__graph.svg |    56 +
 .../doxygen/classtvm_1_1relay_1_1Var-members.html  |   110 +
 docs/api/doxygen/classtvm_1_1relay_1_1Var.html     |   252 +
 .../classtvm_1_1relay_1_1VarNode-members.html      |   124 +
 docs/api/doxygen/classtvm_1_1relay_1_1VarNode.html |   449 +
 .../classtvm_1_1relay_1_1VarNode__coll__graph.svg  |   172 +
 ...lasstvm_1_1relay_1_1VarNode__inherit__graph.svg |    88 +
 .../classtvm_1_1relay_1_1VarPattern-members.html   |   108 +
 .../doxygen/classtvm_1_1relay_1_1VarPattern.html   |   193 +
 ...lasstvm_1_1relay_1_1VarPatternNode-members.html |   112 +
 .../classtvm_1_1relay_1_1VarPatternNode.html       |   283 +
 ...tvm_1_1relay_1_1VarPatternNode__coll__graph.svg |   103 +
 ..._1_1relay_1_1VarPatternNode__inherit__graph.svg |    57 +
 ...lasstvm_1_1relay_1_1VarPattern__coll__graph.svg |    56 +
 ...stvm_1_1relay_1_1VarPattern__inherit__graph.svg |    56 +
 .../classtvm_1_1relay_1_1Var__coll__graph.svg      |    75 +
 .../classtvm_1_1relay_1_1Var__inherit__graph.svg   |    75 +
 ...asstvm_1_1relay_1_1WildcardPattern-members.html |   107 +
 .../classtvm_1_1relay_1_1WildcardPattern.html      |   169 +
 ...vm_1_1relay_1_1WildcardPatternNode-members.html |   109 +
 .../classtvm_1_1relay_1_1WildcardPatternNode.html  |   219 +
 ..._1relay_1_1WildcardPatternNode__coll__graph.svg |    54 +
 ...elay_1_1WildcardPatternNode__inherit__graph.svg |    54 +
 ...vm_1_1relay_1_1WildcardPattern__coll__graph.svg |    55 +
 ...1_1relay_1_1WildcardPattern__inherit__graph.svg |    55 +
 .../classtvm_1_1runtime_1_1ADT-members.html        |   132 +
 docs/api/doxygen/classtvm_1_1runtime_1_1ADT.html   |   521 +
 .../classtvm_1_1runtime_1_1ADTObj-members.html     |   145 +
 .../api/doxygen/classtvm_1_1runtime_1_1ADTObj.html |   375 +
 .../classtvm_1_1runtime_1_1ADTObj__coll__graph.svg |   100 +
 ...asstvm_1_1runtime_1_1ADTObj__inherit__graph.svg |    95 +
 .../classtvm_1_1runtime_1_1ADT__coll__graph.svg    |    91 +
 .../classtvm_1_1runtime_1_1ADT__inherit__graph.svg |    63 +
 .../classtvm_1_1runtime_1_1Array-members.html      |   160 +
 docs/api/doxygen/classtvm_1_1runtime_1_1Array.html |  1525 +++
 .../classtvm_1_1runtime_1_1ArrayNode-members.html  |   153 +
 .../doxygen/classtvm_1_1runtime_1_1ArrayNode.html  |   698 ++
 ...asstvm_1_1runtime_1_1ArrayNode__coll__graph.svg |   107 +
 ...tvm_1_1runtime_1_1ArrayNode__inherit__graph.svg |   102 +
 .../classtvm_1_1runtime_1_1Array__coll__graph.svg  |    94 +
 ...lasstvm_1_1runtime_1_1Array__inherit__graph.svg |    66 +
 .../classtvm_1_1runtime_1_1DataType-members.html   |   140 +
 .../doxygen/classtvm_1_1runtime_1_1DataType.html   |  1132 ++
 ...lasstvm_1_1runtime_1_1DataType__coll__graph.svg |    39 +
 .../classtvm_1_1runtime_1_1DeviceAPI-members.html  |   120 +
 .../doxygen/classtvm_1_1runtime_1_1DeviceAPI.html  |   865 ++
 ...asstvm_1_1runtime_1_1DeviceAPI__coll__graph.svg |    36 +
 ...tvm_1_1runtime_1_1InplaceArrayBase-members.html |   111 +
 .../classtvm_1_1runtime_1_1InplaceArrayBase.html   |   375 +
 ...1_1runtime_1_1InplaceArrayBase__coll__graph.svg |    28 +
 ...classtvm_1_1runtime_1_1IterAdapter-members.html |   120 +
 .../classtvm_1_1runtime_1_1IterAdapter.html        |   502 +
 ...stvm_1_1runtime_1_1IterAdapter__coll__graph.svg |    32 +
 .../classtvm_1_1runtime_1_1Module-members.html     |   131 +
 .../api/doxygen/classtvm_1_1runtime_1_1Module.html |   480 +
 .../classtvm_1_1runtime_1_1ModuleNode-members.html |   149 +
 .../doxygen/classtvm_1_1runtime_1_1ModuleNode.html |   718 ++
 ...sstvm_1_1runtime_1_1ModuleNode__coll__graph.svg |    86 +
 ...vm_1_1runtime_1_1ModuleNode__inherit__graph.svg |   152 +
 .../classtvm_1_1runtime_1_1Module__coll__graph.svg |    89 +
 ...asstvm_1_1runtime_1_1Module__inherit__graph.svg |    61 +
 .../classtvm_1_1runtime_1_1NDArray-members.html    |   150 +
 .../doxygen/classtvm_1_1runtime_1_1NDArray.html    |  1164 ++
 ...1_1runtime_1_1NDArray_1_1Container-members.html |   144 +
 ...lasstvm_1_1runtime_1_1NDArray_1_1Container.html |   507 +
 ...untime_1_1NDArray_1_1ContainerBase-members.html |   108 +
 ...tvm_1_1runtime_1_1NDArray_1_1ContainerBase.html |   198 +
 ...me_1_1NDArray_1_1ContainerBase__coll__graph.svg |    25 +
 ...1_1NDArray_1_1ContainerBase__inherit__graph.svg |    50 +
 ...untime_1_1NDArray_1_1Container__coll__graph.svg |   102 +
 ...ime_1_1NDArray_1_1Container__inherit__graph.svg |    97 +
 ...classtvm_1_1runtime_1_1NDArray__coll__graph.svg |   100 +
 ...sstvm_1_1runtime_1_1NDArray__inherit__graph.svg |    72 +
 ...tvm_1_1runtime_1_1ObjAllocatorBase-members.html |   107 +
 .../classtvm_1_1runtime_1_1ObjAllocatorBase.html   |   238 +
 ...1_1runtime_1_1ObjAllocatorBase__coll__graph.svg |    24 +
 .../classtvm_1_1runtime_1_1Object-members.html     |   139 +
 .../api/doxygen/classtvm_1_1runtime_1_1Object.html |  1094 ++
 .../classtvm_1_1runtime_1_1ObjectPtr-members.html  |   137 +
 .../doxygen/classtvm_1_1runtime_1_1ObjectPtr.html  |  1094 ++
 ...asstvm_1_1runtime_1_1ObjectPtr__coll__graph.svg |    32 +
 .../classtvm_1_1runtime_1_1ObjectRef-members.html  |   128 +
 .../doxygen/classtvm_1_1runtime_1_1ObjectRef.html  |   846 ++
 ...asstvm_1_1runtime_1_1ObjectRef__coll__graph.svg |    66 +
 ...tvm_1_1runtime_1_1ObjectRef__inherit__graph.svg |   259 +
 .../classtvm_1_1runtime_1_1Object__coll__graph.svg |    57 +
 ...asstvm_1_1runtime_1_1Object__inherit__graph.svg |   320 +
 .../classtvm_1_1runtime_1_1Optional-members.html   |   148 +
 .../doxygen/classtvm_1_1runtime_1_1Optional.html   |   945 ++
 ...lasstvm_1_1runtime_1_1Optional__coll__graph.svg |    93 +
 ...stvm_1_1runtime_1_1Optional__inherit__graph.svg |    65 +
 .../classtvm_1_1runtime_1_1PackedFunc-members.html |   114 +
 .../doxygen/classtvm_1_1runtime_1_1PackedFunc.html |   419 +
 ...sstvm_1_1runtime_1_1PackedFunc__coll__graph.svg |    29 +
 .../classtvm_1_1runtime_1_1Registry-members.html   |   119 +
 .../doxygen/classtvm_1_1runtime_1_1Registry.html   |   652 ++
 ...lasstvm_1_1runtime_1_1Registry__coll__graph.svg |    57 +
 ...m_1_1runtime_1_1ReverseIterAdapter-members.html |   120 +
 .../classtvm_1_1runtime_1_1ReverseIterAdapter.html |   502 +
 ...1runtime_1_1ReverseIterAdapter__coll__graph.svg |    32 +
 ...m_1_1runtime_1_1SimpleObjAllocator-members.html |   107 +
 .../classtvm_1_1runtime_1_1SimpleObjAllocator.html |   139 +
 ...SimpleObjAllocator_1_1ArrayHandler-members.html |   108 +
 ...time_1_1SimpleObjAllocator_1_1ArrayHandler.html |   216 +
 ...leObjAllocator_1_1ArrayHandler__coll__graph.svg |    25 +
 ...e_1_1SimpleObjAllocator_1_1Handler-members.html |   108 +
 ..._1runtime_1_1SimpleObjAllocator_1_1Handler.html |   210 +
 ...1SimpleObjAllocator_1_1Handler__coll__graph.svg |    24 +
 ...1runtime_1_1SimpleObjAllocator__coll__graph.svg |    41 +
 ...ntime_1_1SimpleObjAllocator__inherit__graph.svg |    41 +
 .../classtvm_1_1runtime_1_1String-members.html     |   142 +
 .../api/doxygen/classtvm_1_1runtime_1_1String.html |   837 ++
 .../classtvm_1_1runtime_1_1StringObj-members.html  |   139 +
 .../doxygen/classtvm_1_1runtime_1_1StringObj.html  |   362 +
 ...1_1runtime_1_1StringObj_1_1FromStd-members.html |   140 +
 ...lasstvm_1_1runtime_1_1StringObj_1_1FromStd.html |   291 +
 ...untime_1_1StringObj_1_1FromStd__coll__graph.svg |    95 +
 ...ime_1_1StringObj_1_1FromStd__inherit__graph.svg |    90 +
 ...asstvm_1_1runtime_1_1StringObj__coll__graph.svg |    77 +
 ...tvm_1_1runtime_1_1StringObj__inherit__graph.svg |    90 +
 .../classtvm_1_1runtime_1_1String__coll__graph.svg |    94 +
 ...asstvm_1_1runtime_1_1String__inherit__graph.svg |    66 +
 ...classtvm_1_1runtime_1_1TVMArgValue-members.html |   131 +
 .../classtvm_1_1runtime_1_1TVMArgValue.html        |   412 +
 ...stvm_1_1runtime_1_1TVMArgValue__coll__graph.svg |    85 +
 ...m_1_1runtime_1_1TVMArgValue__inherit__graph.svg |    82 +
 .../classtvm_1_1runtime_1_1TVMArgs-members.html    |   111 +
 .../doxygen/classtvm_1_1runtime_1_1TVMArgs.html    |   289 +
 ...asstvm_1_1runtime_1_1TVMArgsSetter-members.html |   125 +
 .../classtvm_1_1runtime_1_1TVMArgsSetter.html      |   857 ++
 ...vm_1_1runtime_1_1TVMArgsSetter__coll__graph.svg |    32 +
 ...classtvm_1_1runtime_1_1TVMArgs__coll__graph.svg |    48 +
 ...1_1runtime_1_1TVMMovableArgValue__-members.html |   132 +
 ...lasstvm_1_1runtime_1_1TVMMovableArgValue__.html |   271 +
 ...untime_1_1TVMMovableArgValue____coll__graph.svg |   104 +
 ...ime_1_1TVMMovableArgValue____inherit__graph.svg |    82 +
 ...asstvm_1_1runtime_1_1TVMPODValue__-members.html |   125 +
 .../classtvm_1_1runtime_1_1TVMPODValue__.html      |   671 ++
 ...vm_1_1runtime_1_1TVMPODValue____coll__graph.svg |    60 +
 ...1_1runtime_1_1TVMPODValue____inherit__graph.svg |   111 +
 ...classtvm_1_1runtime_1_1TVMRetValue-members.html |   155 +
 .../classtvm_1_1runtime_1_1TVMRetValue.html        |  1079 ++
 ...stvm_1_1runtime_1_1TVMRetValue__coll__graph.svg |    89 +
 ...m_1_1runtime_1_1TVMRetValue__inherit__graph.svg |    67 +
 .../classtvm_1_1runtime_1_1TypedPackedFunc.html    |   121 +
 ...PackedFunc_3_01R_07Args_8_8_8_08_4-members.html |   122 +
 ...1_1TypedPackedFunc_3_01R_07Args_8_8_8_08_4.html |   722 ++
 ...edFunc_3_01R_07Args_8_8_8_08_4__coll__graph.svg |    37 +
 ..._1_1runtime_1_1TypedPackedFunc__coll__graph.svg |    23 +
 ...untime_1_1threading_1_1ThreadGroup-members.html |   112 +
 ...tvm_1_1runtime_1_1threading_1_1ThreadGroup.html |   282 +
 ...me_1_1threading_1_1ThreadGroup__coll__graph.svg |    26 +
 ...asstvm_1_1runtime_1_1vm_1_1Closure-members.html |   125 +
 .../classtvm_1_1runtime_1_1vm_1_1Closure.html      |   228 +
 ...tvm_1_1runtime_1_1vm_1_1ClosureObj-members.html |   136 +
 .../classtvm_1_1runtime_1_1vm_1_1ClosureObj.html   |   290 +
 ...1_1runtime_1_1vm_1_1ClosureObj__coll__graph.svg |    75 +
 ...runtime_1_1vm_1_1ClosureObj__inherit__graph.svg |   110 +
 ...vm_1_1runtime_1_1vm_1_1Closure__coll__graph.svg |    84 +
 ...1_1runtime_1_1vm_1_1Closure__inherit__graph.svg |    94 +
 ...tvm_1_1runtime_1_1vm_1_1Executable-members.html |   160 +
 .../classtvm_1_1runtime_1_1vm_1_1Executable.html   |   667 ++
 ...1_1runtime_1_1vm_1_1Executable__coll__graph.svg |   200 +
 ...runtime_1_1vm_1_1Executable__inherit__graph.svg |   111 +
 ...stvm_1_1runtime_1_1vm_1_1VMClosure-members.html |   127 +
 .../classtvm_1_1runtime_1_1vm_1_1VMClosure.html    |   260 +
 ...m_1_1runtime_1_1vm_1_1VMClosureObj-members.html |   139 +
 .../classtvm_1_1runtime_1_1vm_1_1VMClosureObj.html |   314 +
 ...1runtime_1_1vm_1_1VMClosureObj__coll__graph.svg |    94 +
 ...ntime_1_1vm_1_1VMClosureObj__inherit__graph.svg |    89 +
 ..._1_1runtime_1_1vm_1_1VMClosure__coll__graph.svg |   103 +
 ...1runtime_1_1vm_1_1VMClosure__inherit__graph.svg |    75 +
 ...1_1runtime_1_1vm_1_1VirtualMachine-members.html |   170 +
 ...lasstvm_1_1runtime_1_1vm_1_1VirtualMachine.html |  1095 ++
 ...untime_1_1vm_1_1VirtualMachine__coll__graph.svg |   292 +
 ...ime_1_1vm_1_1VirtualMachine__inherit__graph.svg |   122 +
 ...lasstvm_1_1te_1_1BaseComputeOpNode-members.html |   130 +
 .../classtvm_1_1te_1_1BaseComputeOpNode.html       |   478 +
 ...tvm_1_1te_1_1BaseComputeOpNode__coll__graph.svg |   140 +
 ..._1_1te_1_1BaseComputeOpNode__inherit__graph.svg |   157 +
 .../classtvm_1_1te_1_1ComputeOpNode-members.html   |   135 +
 .../doxygen/classtvm_1_1te_1_1ComputeOpNode.html   |   667 ++
 ...lasstvm_1_1te_1_1ComputeOpNode__coll__graph.svg |   182 +
 ...stvm_1_1te_1_1ComputeOpNode__inherit__graph.svg |   125 +
 .../classtvm_1_1te_1_1ExternOpNode-members.html    |   134 +
 .../doxygen/classtvm_1_1te_1_1ExternOpNode.html    |   857 ++
 ...classtvm_1_1te_1_1ExternOpNode__coll__graph.svg |   187 +
 ...sstvm_1_1te_1_1ExternOpNode__inherit__graph.svg |   107 +
 .../classtvm_1_1te_1_1FuseNode-members.html        |   113 +
 docs/api/doxygen/classtvm_1_1te_1_1FuseNode.html   |   320 +
 .../classtvm_1_1te_1_1FuseNode__coll__graph.svg    |    92 +
 .../classtvm_1_1te_1_1FuseNode__inherit__graph.svg |    58 +
 .../classtvm_1_1te_1_1HybridOpNode-members.html    |   134 +
 .../doxygen/classtvm_1_1te_1_1HybridOpNode.html    |   851 ++
 ...classtvm_1_1te_1_1HybridOpNode__coll__graph.svg |   187 +
 ...sstvm_1_1te_1_1HybridOpNode__inherit__graph.svg |   107 +
 .../classtvm_1_1te_1_1IterVarAttr-members.html     |   108 +
 .../api/doxygen/classtvm_1_1te_1_1IterVarAttr.html |   213 +
 .../classtvm_1_1te_1_1IterVarAttrNode-members.html |   117 +
 .../doxygen/classtvm_1_1te_1_1IterVarAttrNode.html |   370 +
 ...sstvm_1_1te_1_1IterVarAttrNode__coll__graph.svg |   132 +
 ...vm_1_1te_1_1IterVarAttrNode__inherit__graph.svg |    46 +
 .../classtvm_1_1te_1_1IterVarAttr__coll__graph.svg |    38 +
 ...asstvm_1_1te_1_1IterVarAttr__inherit__graph.svg |    38 +
 .../classtvm_1_1te_1_1IterVarRelation-members.html |   108 +
 .../doxygen/classtvm_1_1te_1_1IterVarRelation.html |   213 +
 ...sstvm_1_1te_1_1IterVarRelationNode-members.html |   107 +
 .../classtvm_1_1te_1_1IterVarRelationNode.html     |   187 +
 ...m_1_1te_1_1IterVarRelationNode__coll__graph.svg |    36 +
 ..._1te_1_1IterVarRelationNode__inherit__graph.svg |   123 +
 ...sstvm_1_1te_1_1IterVarRelation__coll__graph.svg |    38 +
 ...vm_1_1te_1_1IterVarRelation__inherit__graph.svg |    38 +
 .../classtvm_1_1te_1_1Operation-members.html       |   111 +
 docs/api/doxygen/classtvm_1_1te_1_1Operation.html  |   270 +
 .../classtvm_1_1te_1_1OperationNode-members.html   |   126 +
 .../doxygen/classtvm_1_1te_1_1OperationNode.html   |   699 ++
 ...lasstvm_1_1te_1_1OperationNode__coll__graph.svg |   102 +
 ...stvm_1_1te_1_1OperationNode__inherit__graph.svg |   292 +
 .../classtvm_1_1te_1_1Operation__coll__graph.svg   |    57 +
 ...classtvm_1_1te_1_1Operation__inherit__graph.svg |    57 +
 ...lasstvm_1_1te_1_1PlaceholderOpNode-members.html |   131 +
 .../classtvm_1_1te_1_1PlaceholderOpNode.html       |   770 ++
 ...tvm_1_1te_1_1PlaceholderOpNode__coll__graph.svg |   181 +
 ..._1_1te_1_1PlaceholderOpNode__inherit__graph.svg |   104 +
 .../classtvm_1_1te_1_1RebaseNode-members.html      |   112 +
 docs/api/doxygen/classtvm_1_1te_1_1RebaseNode.html |   297 +
 .../classtvm_1_1te_1_1RebaseNode__coll__graph.svg  |    91 +
 ...lasstvm_1_1te_1_1RebaseNode__inherit__graph.svg |    57 +
 .../classtvm_1_1te_1_1ScanOpNode-members.html      |   136 +
 docs/api/doxygen/classtvm_1_1te_1_1ScanOpNode.html |   898 ++
 .../classtvm_1_1te_1_1ScanOpNode__coll__graph.svg  |   191 +
 ...lasstvm_1_1te_1_1ScanOpNode__inherit__graph.svg |   109 +
 .../classtvm_1_1te_1_1Schedule-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1te_1_1Schedule.html   |   585 +
 .../classtvm_1_1te_1_1ScheduleNode-members.html    |   118 +
 .../doxygen/classtvm_1_1te_1_1ScheduleNode.html    |   446 +
 ...classtvm_1_1te_1_1ScheduleNode__coll__graph.svg |   118 +
 ...sstvm_1_1te_1_1ScheduleNode__inherit__graph.svg |    47 +
 .../classtvm_1_1te_1_1Schedule__coll__graph.svg    |    48 +
 .../classtvm_1_1te_1_1Schedule__inherit__graph.svg |    48 +
 .../classtvm_1_1te_1_1SingletonNode-members.html   |   111 +
 .../doxygen/classtvm_1_1te_1_1SingletonNode.html   |   270 +
 ...lasstvm_1_1te_1_1SingletonNode__coll__graph.svg |    90 +
 ...stvm_1_1te_1_1SingletonNode__inherit__graph.svg |    56 +
 ...stvm_1_1te_1_1SpecializedCondition-members.html |   110 +
 .../classtvm_1_1te_1_1SpecializedCondition.html    |   276 +
 ..._1_1te_1_1SpecializedConditionNode-members.html |   109 +
 ...classtvm_1_1te_1_1SpecializedConditionNode.html |   234 +
 ...te_1_1SpecializedConditionNode__coll__graph.svg |    52 +
 ...1_1SpecializedConditionNode__inherit__graph.svg |    38 +
 ..._1_1te_1_1SpecializedCondition__coll__graph.svg |    39 +
 ...1te_1_1SpecializedCondition__inherit__graph.svg |    39 +
 .../classtvm_1_1te_1_1SplitNode-members.html       |   115 +
 docs/api/doxygen/classtvm_1_1te_1_1SplitNode.html  |   366 +
 .../classtvm_1_1te_1_1SplitNode__coll__graph.svg   |   138 +
 ...classtvm_1_1te_1_1SplitNode__inherit__graph.svg |    60 +
 .../doxygen/classtvm_1_1te_1_1Stage-members.html   |   134 +
 docs/api/doxygen/classtvm_1_1te_1_1Stage.html      |  1127 ++
 .../classtvm_1_1te_1_1StageNode-members.html       |   124 +
 docs/api/doxygen/classtvm_1_1te_1_1StageNode.html  |   494 +
 .../classtvm_1_1te_1_1StageNode__coll__graph.svg   |   268 +
 ...classtvm_1_1te_1_1StageNode__inherit__graph.svg |    48 +
 .../classtvm_1_1te_1_1Stage__coll__graph.svg       |    46 +
 .../classtvm_1_1te_1_1Stage__inherit__graph.svg    |    46 +
 .../doxygen/classtvm_1_1te_1_1Tensor-members.html  |   116 +
 docs/api/doxygen/classtvm_1_1te_1_1Tensor.html     |   474 +
 ...sstvm_1_1te_1_1TensorComputeOpNode-members.html |   139 +
 .../classtvm_1_1te_1_1TensorComputeOpNode.html     |   759 ++
 ...m_1_1te_1_1TensorComputeOpNode__coll__graph.svg |   238 +
 ..._1te_1_1TensorComputeOpNode__inherit__graph.svg |   129 +
 .../classtvm_1_1te_1_1TensorIntrin-members.html    |   109 +
 .../doxygen/classtvm_1_1te_1_1TensorIntrin.html    |   235 +
 ...classtvm_1_1te_1_1TensorIntrinCall-members.html |   109 +
 .../classtvm_1_1te_1_1TensorIntrinCall.html        |   235 +
 ...stvm_1_1te_1_1TensorIntrinCallNode-members.html |   114 +
 .../classtvm_1_1te_1_1TensorIntrinCallNode.html    |   355 +
 ..._1_1te_1_1TensorIntrinCallNode__coll__graph.svg |   132 +
 ...1te_1_1TensorIntrinCallNode__inherit__graph.svg |    43 +
 ...stvm_1_1te_1_1TensorIntrinCall__coll__graph.svg |    38 +
 ...m_1_1te_1_1TensorIntrinCall__inherit__graph.svg |    38 +
 ...classtvm_1_1te_1_1TensorIntrinNode-members.html |   118 +
 .../classtvm_1_1te_1_1TensorIntrinNode.html        |   459 +
 ...stvm_1_1te_1_1TensorIntrinNode__coll__graph.svg |   164 +
 ...m_1_1te_1_1TensorIntrinNode__inherit__graph.svg |    47 +
 ...classtvm_1_1te_1_1TensorIntrin__coll__graph.svg |    38 +
 ...sstvm_1_1te_1_1TensorIntrin__inherit__graph.svg |    38 +
 .../classtvm_1_1te_1_1TensorNode-members.html      |   114 +
 docs/api/doxygen/classtvm_1_1te_1_1TensorNode.html |   366 +
 .../classtvm_1_1te_1_1TensorNode__coll__graph.svg  |   143 +
 ...lasstvm_1_1te_1_1TensorNode__inherit__graph.svg |    43 +
 .../classtvm_1_1te_1_1Tensor_1_1Slice-members.html |   108 +
 .../doxygen/classtvm_1_1te_1_1Tensor_1_1Slice.html |   228 +
 ...sstvm_1_1te_1_1Tensor_1_1Slice__coll__graph.svg |    24 +
 .../classtvm_1_1te_1_1Tensor__coll__graph.svg      |    45 +
 .../classtvm_1_1te_1_1Tensor__inherit__graph.svg   |    45 +
 .../classtvm_1_1tir_1_1AddNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1AddNode.html   |   200 +
 .../classtvm_1_1tir_1_1AddNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1AddNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1AllocateNode-members.html   |   122 +
 .../doxygen/classtvm_1_1tir_1_1AllocateNode.html   |   499 +
 ...lasstvm_1_1tir_1_1AllocateNode__coll__graph.svg |   220 +
 ...stvm_1_1tir_1_1AllocateNode__inherit__graph.svg |    69 +
 .../classtvm_1_1tir_1_1AndNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1AndNode.html   |   377 +
 .../classtvm_1_1tir_1_1AndNode__coll__graph.svg    |   170 +
 .../classtvm_1_1tir_1_1AndNode__inherit__graph.svg |    83 +
 .../classtvm_1_1tir_1_1AnyNode-members.html        |   118 +
 docs/api/doxygen/classtvm_1_1tir_1_1AnyNode.html   |   359 +
 .../classtvm_1_1tir_1_1AnyNode__coll__graph.svg    |   116 +
 .../classtvm_1_1tir_1_1AnyNode__inherit__graph.svg |    82 +
 .../classtvm_1_1tir_1_1AssertStmtNode-members.html |   118 +
 .../doxygen/classtvm_1_1tir_1_1AssertStmtNode.html |   388 +
 ...sstvm_1_1tir_1_1AssertStmtNode__coll__graph.svg |   141 +
 ...vm_1_1tir_1_1AssertStmtNode__inherit__graph.svg |    65 +
 .../classtvm_1_1tir_1_1AttrStmtNode-members.html   |   119 +
 .../doxygen/classtvm_1_1tir_1_1AttrStmtNode.html   |   416 +
 ...lasstvm_1_1tir_1_1AttrStmtNode__coll__graph.svg |   147 +
 ...stvm_1_1tir_1_1AttrStmtNode__inherit__graph.svg |    66 +
 ...classtvm_1_1tir_1_1BijectiveLayout-members.html |   114 +
 .../classtvm_1_1tir_1_1BijectiveLayout.html        |   345 +
 ...stvm_1_1tir_1_1BijectiveLayoutNode-members.html |   112 +
 .../classtvm_1_1tir_1_1BijectiveLayoutNode.html    |   280 +
 ..._1_1tir_1_1BijectiveLayoutNode__coll__graph.svg |    97 +
 ...1tir_1_1BijectiveLayoutNode__inherit__graph.svg |    41 +
 ...stvm_1_1tir_1_1BijectiveLayout__coll__graph.svg |    43 +
 ...m_1_1tir_1_1BijectiveLayout__inherit__graph.svg |    43 +
 .../classtvm_1_1tir_1_1BinaryOpNode-members.html   |   119 +
 .../doxygen/classtvm_1_1tir_1_1BinaryOpNode.html   |   377 +
 ...lasstvm_1_1tir_1_1BinaryOpNode__coll__graph.svg |   170 +
 ...stvm_1_1tir_1_1BinaryOpNode__inherit__graph.svg |    82 +
 .../classtvm_1_1tir_1_1BroadcastNode-members.html  |   119 +
 .../doxygen/classtvm_1_1tir_1_1BroadcastNode.html  |   377 +
 ...asstvm_1_1tir_1_1BroadcastNode__coll__graph.svg |   170 +
 ...tvm_1_1tir_1_1BroadcastNode__inherit__graph.svg |    83 +
 .../doxygen/classtvm_1_1tir_1_1Buffer-members.html |   114 +
 docs/api/doxygen/classtvm_1_1tir_1_1Buffer.html    |   424 +
 .../classtvm_1_1tir_1_1BufferLoad-members.html     |   112 +
 .../api/doxygen/classtvm_1_1tir_1_1BufferLoad.html |   212 +
 .../classtvm_1_1tir_1_1BufferLoadNode-members.html |   118 +
 .../doxygen/classtvm_1_1tir_1_1BufferLoadNode.html |   338 +
 ...sstvm_1_1tir_1_1BufferLoadNode__coll__graph.svg |   168 +
 ...vm_1_1tir_1_1BufferLoadNode__inherit__graph.svg |    82 +
 .../classtvm_1_1tir_1_1BufferLoad__coll__graph.svg |    77 +
 ...asstvm_1_1tir_1_1BufferLoad__inherit__graph.svg |    77 +
 .../classtvm_1_1tir_1_1BufferNode-members.html     |   125 +
 .../api/doxygen/classtvm_1_1tir_1_1BufferNode.html |   637 +
 .../classtvm_1_1tir_1_1BufferNode__coll__graph.svg |   184 +
 ...asstvm_1_1tir_1_1BufferNode__inherit__graph.svg |    56 +
 .../classtvm_1_1tir_1_1BufferRealize-members.html  |   108 +
 .../doxygen/classtvm_1_1tir_1_1BufferRealize.html  |   219 +
 ...asstvm_1_1tir_1_1BufferRealizeNode-members.html |   120 +
 .../classtvm_1_1tir_1_1BufferRealizeNode.html      |   435 +
 ...vm_1_1tir_1_1BufferRealizeNode__coll__graph.svg |   186 +
 ...1_1tir_1_1BufferRealizeNode__inherit__graph.svg |    67 +
 ...asstvm_1_1tir_1_1BufferRealize__coll__graph.svg |    56 +
 ...tvm_1_1tir_1_1BufferRealize__inherit__graph.svg |    56 +
 .../classtvm_1_1tir_1_1BufferStore-members.html    |   108 +
 .../doxygen/classtvm_1_1tir_1_1BufferStore.html    |   213 +
 ...classtvm_1_1tir_1_1BufferStoreNode-members.html |   117 +
 .../classtvm_1_1tir_1_1BufferStoreNode.html        |   343 +
 ...stvm_1_1tir_1_1BufferStoreNode__coll__graph.svg |   160 +
 ...m_1_1tir_1_1BufferStoreNode__inherit__graph.svg |    64 +
 ...classtvm_1_1tir_1_1BufferStore__coll__graph.svg |    56 +
 ...sstvm_1_1tir_1_1BufferStore__inherit__graph.svg |    56 +
 .../classtvm_1_1tir_1_1Buffer__coll__graph.svg     |    43 +
 .../classtvm_1_1tir_1_1Buffer__inherit__graph.svg  |    43 +
 .../classtvm_1_1tir_1_1CallNode-members.html       |   146 +
 docs/api/doxygen/classtvm_1_1tir_1_1CallNode.html  |   894 ++
 .../classtvm_1_1tir_1_1CallNode__coll__graph.svg   |   183 +
 ...classtvm_1_1tir_1_1CallNode__inherit__graph.svg |   103 +
 .../classtvm_1_1tir_1_1CastNode-members.html       |   118 +
 docs/api/doxygen/classtvm_1_1tir_1_1CastNode.html  |   361 +
 .../classtvm_1_1tir_1_1CastNode__coll__graph.svg   |   169 +
 ...classtvm_1_1tir_1_1CastNode__inherit__graph.svg |    82 +
 .../classtvm_1_1tir_1_1CmpOpNode-members.html      |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1CmpOpNode.html |   377 +
 .../classtvm_1_1tir_1_1CmpOpNode__coll__graph.svg  |   170 +
 ...lasstvm_1_1tir_1_1CmpOpNode__inherit__graph.svg |    82 +
 .../classtvm_1_1tir_1_1CommReducer-members.html    |   110 +
 .../doxygen/classtvm_1_1tir_1_1CommReducer.html    |   259 +
 ...classtvm_1_1tir_1_1CommReducerNode-members.html |   118 +
 .../classtvm_1_1tir_1_1CommReducerNode.html        |   477 +
 ...stvm_1_1tir_1_1CommReducerNode__coll__graph.svg |    77 +
 ...m_1_1tir_1_1CommReducerNode__inherit__graph.svg |    49 +
 ...classtvm_1_1tir_1_1CommReducer__coll__graph.svg |    39 +
 ...sstvm_1_1tir_1_1CommReducer__inherit__graph.svg |    39 +
 .../classtvm_1_1tir_1_1DivNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1DivNode.html   |   201 +
 .../classtvm_1_1tir_1_1DivNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1DivNode__inherit__graph.svg |   100 +
 .../doxygen/classtvm_1_1tir_1_1EQNode-members.html |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1EQNode.html    |   200 +
 .../classtvm_1_1tir_1_1EQNode__coll__graph.svg     |   188 +
 .../classtvm_1_1tir_1_1EQNode__inherit__graph.svg  |   100 +
 .../classtvm_1_1tir_1_1EvaluateNode-members.html   |   116 +
 .../doxygen/classtvm_1_1tir_1_1EvaluateNode.html   |   339 +
 ...lasstvm_1_1tir_1_1EvaluateNode__coll__graph.svg |   116 +
 ...stvm_1_1tir_1_1EvaluateNode__inherit__graph.svg |    63 +
 .../doxygen/classtvm_1_1tir_1_1ExprFunctor.html    |   130 +
 ...rimExpr_01_6n_00_01Args_8_8_8_08_4-members.html |   143 +
 ...onst_01PrimExpr_01_6n_00_01Args_8_8_8_08_4.html |  1566 +++
 ...xpr_01_6n_00_01Args_8_8_8_08_4__coll__graph.svg |    34 +
 ...classtvm_1_1tir_1_1ExprFunctor__coll__graph.svg |    23 +
 .../classtvm_1_1tir_1_1ExprMutator-members.html    |   138 +
 .../doxygen/classtvm_1_1tir_1_1ExprMutator.html    |   990 ++
 ...classtvm_1_1tir_1_1ExprMutator__coll__graph.svg |    50 +
 ...sstvm_1_1tir_1_1ExprMutator__inherit__graph.svg |    67 +
 .../classtvm_1_1tir_1_1ExprVisitor-members.html    |   138 +
 .../doxygen/classtvm_1_1tir_1_1ExprVisitor.html    |   990 ++
 ...classtvm_1_1tir_1_1ExprVisitor__coll__graph.svg |    50 +
 ...sstvm_1_1tir_1_1ExprVisitor__inherit__graph.svg |    67 +
 .../classtvm_1_1tir_1_1FloorDivNode-members.html   |   119 +
 .../doxygen/classtvm_1_1tir_1_1FloorDivNode.html   |   200 +
 ...lasstvm_1_1tir_1_1FloorDivNode__coll__graph.svg |   188 +
 ...stvm_1_1tir_1_1FloorDivNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1FloorModNode-members.html   |   119 +
 .../doxygen/classtvm_1_1tir_1_1FloorModNode.html   |   200 +
 ...lasstvm_1_1tir_1_1FloorModNode__coll__graph.svg |   188 +
 ...stvm_1_1tir_1_1FloorModNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1ForNode-members.html        |   121 +
 docs/api/doxygen/classtvm_1_1tir_1_1ForNode.html   |   457 +
 .../classtvm_1_1tir_1_1ForNode__coll__graph.svg    |   171 +
 .../classtvm_1_1tir_1_1ForNode__inherit__graph.svg |    68 +
 .../classtvm_1_1tir_1_1FreeNode-members.html       |   116 +
 docs/api/doxygen/classtvm_1_1tir_1_1FreeNode.html  |   338 +
 .../classtvm_1_1tir_1_1FreeNode__coll__graph.svg   |   138 +
 ...classtvm_1_1tir_1_1FreeNode__inherit__graph.svg |    63 +
 ...lasstvm_1_1tir_1_1FunctionBaseNode-members.html |   112 +
 .../classtvm_1_1tir_1_1FunctionBaseNode.html       |   328 +
 ...tvm_1_1tir_1_1FunctionBaseNode__coll__graph.svg |    43 +
 ..._1_1tir_1_1FunctionBaseNode__inherit__graph.svg |   292 +
 .../classtvm_1_1tir_1_1FunctionRef-members.html    |   106 +
 .../doxygen/classtvm_1_1tir_1_1FunctionRef.html    |   166 +
 ...classtvm_1_1tir_1_1FunctionRef__coll__graph.svg |    37 +
 ...sstvm_1_1tir_1_1FunctionRef__inherit__graph.svg |    57 +
 .../doxygen/classtvm_1_1tir_1_1GENode-members.html |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1GENode.html    |   200 +
 .../classtvm_1_1tir_1_1GENode__coll__graph.svg     |   188 +
 .../classtvm_1_1tir_1_1GENode__inherit__graph.svg  |   100 +
 .../doxygen/classtvm_1_1tir_1_1GTNode-members.html |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1GTNode.html    |   200 +
 .../classtvm_1_1tir_1_1GTNode__coll__graph.svg     |   188 +
 .../classtvm_1_1tir_1_1GTNode__inherit__graph.svg  |   100 +
 .../classtvm_1_1tir_1_1IfThenElseNode-members.html |   118 +
 .../doxygen/classtvm_1_1tir_1_1IfThenElseNode.html |   388 +
 ...sstvm_1_1tir_1_1IfThenElseNode__coll__graph.svg |   141 +
 ...vm_1_1tir_1_1IfThenElseNode__inherit__graph.svg |    65 +
 .../classtvm_1_1tir_1_1IterVar-members.html        |   110 +
 docs/api/doxygen/classtvm_1_1tir_1_1IterVar.html   |   261 +
 .../classtvm_1_1tir_1_1IterVarNode-members.html    |   117 +
 .../doxygen/classtvm_1_1tir_1_1IterVarNode.html    |   443 +
 ...classtvm_1_1tir_1_1IterVarNode__coll__graph.svg |   148 +
 ...sstvm_1_1tir_1_1IterVarNode__inherit__graph.svg |    48 +
 .../classtvm_1_1tir_1_1IterVar__coll__graph.svg    |    39 +
 .../classtvm_1_1tir_1_1IterVar__inherit__graph.svg |    39 +
 .../doxygen/classtvm_1_1tir_1_1LTNode-members.html |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1LTNode.html    |   200 +
 .../classtvm_1_1tir_1_1LTNode__coll__graph.svg     |   188 +
 .../classtvm_1_1tir_1_1LTNode__inherit__graph.svg  |   100 +
 .../doxygen/classtvm_1_1tir_1_1Layout-members.html |   126 +
 docs/api/doxygen/classtvm_1_1tir_1_1Layout.html    |   792 ++
 .../classtvm_1_1tir_1_1LayoutAxis-members.html     |   115 +
 .../api/doxygen/classtvm_1_1tir_1_1LayoutAxis.html |   395 +
 .../classtvm_1_1tir_1_1LayoutAxis__coll__graph.svg |    30 +
 .../classtvm_1_1tir_1_1LayoutNode-members.html     |   111 +
 .../api/doxygen/classtvm_1_1tir_1_1LayoutNode.html |   276 +
 .../classtvm_1_1tir_1_1LayoutNode__coll__graph.svg |    55 +
 ...asstvm_1_1tir_1_1LayoutNode__inherit__graph.svg |    40 +
 .../classtvm_1_1tir_1_1Layout__coll__graph.svg     |    47 +
 .../classtvm_1_1tir_1_1Layout__inherit__graph.svg  |    47 +
 .../classtvm_1_1tir_1_1LetNode-members.html        |   120 +
 docs/api/doxygen/classtvm_1_1tir_1_1LetNode.html   |   400 +
 .../classtvm_1_1tir_1_1LetNode__coll__graph.svg    |   198 +
 .../classtvm_1_1tir_1_1LetNode__inherit__graph.svg |    84 +
 .../classtvm_1_1tir_1_1LetStmtNode-members.html    |   118 +
 .../doxygen/classtvm_1_1tir_1_1LetStmtNode.html    |   388 +
 ...classtvm_1_1tir_1_1LetStmtNode__coll__graph.svg |   168 +
 ...sstvm_1_1tir_1_1LetStmtNode__inherit__graph.svg |    65 +
 .../classtvm_1_1tir_1_1LoadNode-members.html       |   120 +
 docs/api/doxygen/classtvm_1_1tir_1_1LoadNode.html  |   408 +
 .../classtvm_1_1tir_1_1LoadNode__coll__graph.svg   |   198 +
 ...classtvm_1_1tir_1_1LoadNode__inherit__graph.svg |    84 +
 .../classtvm_1_1tir_1_1MaxNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1MaxNode.html   |   200 +
 .../classtvm_1_1tir_1_1MaxNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1MaxNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1MinNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1MinNode.html   |   200 +
 .../classtvm_1_1tir_1_1MinNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1MinNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1ModNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1ModNode.html   |   201 +
 .../classtvm_1_1tir_1_1ModNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1ModNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1MulNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1MulNode.html   |   200 +
 .../classtvm_1_1tir_1_1MulNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1MulNode__inherit__graph.svg |   100 +
 .../doxygen/classtvm_1_1tir_1_1NENode-members.html |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1NENode.html    |   200 +
 .../classtvm_1_1tir_1_1NENode__coll__graph.svg     |   188 +
 .../classtvm_1_1tir_1_1NENode__inherit__graph.svg  |   100 +
 .../classtvm_1_1tir_1_1NotNode-members.html        |   118 +
 docs/api/doxygen/classtvm_1_1tir_1_1NotNode.html   |   350 +
 .../classtvm_1_1tir_1_1NotNode__coll__graph.svg    |   169 +
 .../classtvm_1_1tir_1_1NotNode__inherit__graph.svg |    82 +
 .../doxygen/classtvm_1_1tir_1_1OrNode-members.html |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1OrNode.html    |   377 +
 .../classtvm_1_1tir_1_1OrNode__coll__graph.svg     |   170 +
 .../classtvm_1_1tir_1_1OrNode__inherit__graph.svg  |    83 +
 .../classtvm_1_1tir_1_1Prefetch-members.html       |   108 +
 docs/api/doxygen/classtvm_1_1tir_1_1Prefetch.html  |   207 +
 .../classtvm_1_1tir_1_1PrefetchNode-members.html   |   118 +
 .../doxygen/classtvm_1_1tir_1_1PrefetchNode.html   |   387 +
 ...lasstvm_1_1tir_1_1PrefetchNode__coll__graph.svg |   117 +
 ...stvm_1_1tir_1_1PrefetchNode__inherit__graph.svg |    65 +
 .../classtvm_1_1tir_1_1Prefetch__coll__graph.svg   |    56 +
 ...classtvm_1_1tir_1_1Prefetch__inherit__graph.svg |    56 +
 .../classtvm_1_1tir_1_1PrimFunc-members.html       |   111 +
 docs/api/doxygen/classtvm_1_1tir_1_1PrimFunc.html  |   254 +
 .../classtvm_1_1tir_1_1PrimFuncNode-members.html   |   129 +
 .../doxygen/classtvm_1_1tir_1_1PrimFuncNode.html   |   437 +
 ...lasstvm_1_1tir_1_1PrimFuncNode__coll__graph.svg |   286 +
 ...stvm_1_1tir_1_1PrimFuncNode__inherit__graph.svg |   110 +
 .../classtvm_1_1tir_1_1PrimFunc__coll__graph.svg   |    94 +
 ...classtvm_1_1tir_1_1PrimFunc__inherit__graph.svg |    94 +
 .../classtvm_1_1tir_1_1ProvideNode-members.html    |   119 +
 .../doxygen/classtvm_1_1tir_1_1ProvideNode.html    |   412 +
 ...classtvm_1_1tir_1_1ProvideNode__coll__graph.svg |   156 +
 ...sstvm_1_1tir_1_1ProvideNode__inherit__graph.svg |    66 +
 .../classtvm_1_1tir_1_1RampNode-members.html       |   120 +
 docs/api/doxygen/classtvm_1_1tir_1_1RampNode.html  |   404 +
 .../classtvm_1_1tir_1_1RampNode__coll__graph.svg   |   171 +
 ...classtvm_1_1tir_1_1RampNode__inherit__graph.svg |    84 +
 .../classtvm_1_1tir_1_1RealizeNode-members.html    |   121 +
 .../doxygen/classtvm_1_1tir_1_1RealizeNode.html    |   458 +
 ...classtvm_1_1tir_1_1RealizeNode__coll__graph.svg |   215 +
 ...sstvm_1_1tir_1_1RealizeNode__inherit__graph.svg |    68 +
 .../classtvm_1_1tir_1_1ReduceNode-members.html     |   122 +
 .../api/doxygen/classtvm_1_1tir_1_1ReduceNode.html |   449 +
 .../classtvm_1_1tir_1_1ReduceNode__coll__graph.svg |   226 +
 ...asstvm_1_1tir_1_1ReduceNode__inherit__graph.svg |    86 +
 .../classtvm_1_1tir_1_1SelectNode-members.html     |   120 +
 .../api/doxygen/classtvm_1_1tir_1_1SelectNode.html |   401 +
 .../classtvm_1_1tir_1_1SelectNode__coll__graph.svg |   171 +
 ...asstvm_1_1tir_1_1SelectNode__inherit__graph.svg |    84 +
 .../classtvm_1_1tir_1_1SeqStmt-members.html        |   111 +
 docs/api/doxygen/classtvm_1_1tir_1_1SeqStmt.html   |   322 +
 .../classtvm_1_1tir_1_1SeqStmtNode-members.html    |   117 +
 .../doxygen/classtvm_1_1tir_1_1SeqStmtNode.html    |   363 +
 ...classtvm_1_1tir_1_1SeqStmtNode__coll__graph.svg |    78 +
 ...sstvm_1_1tir_1_1SeqStmtNode__inherit__graph.svg |    64 +
 ...tvm_1_1tir_1_1SeqStmt_1_1Flattener-members.html |   108 +
 .../classtvm_1_1tir_1_1SeqStmt_1_1Flattener.html   |   228 +
 ...1_1tir_1_1SeqStmt_1_1Flattener__coll__graph.svg |    25 +
 .../classtvm_1_1tir_1_1SeqStmt__coll__graph.svg    |    59 +
 .../classtvm_1_1tir_1_1SeqStmt__inherit__graph.svg |    59 +
 .../classtvm_1_1tir_1_1ShuffleNode-members.html    |   121 +
 .../doxygen/classtvm_1_1tir_1_1ShuffleNode.html    |   439 +
 ...classtvm_1_1tir_1_1ShuffleNode__coll__graph.svg |   133 +
 ...sstvm_1_1tir_1_1ShuffleNode__inherit__graph.svg |    85 +
 .../classtvm_1_1tir_1_1SizeVar-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1SizeVar.html   |   321 +
 .../classtvm_1_1tir_1_1SizeVarNode-members.html    |   119 +
 .../doxygen/classtvm_1_1tir_1_1SizeVarNode.html    |   235 +
 ...classtvm_1_1tir_1_1SizeVarNode__coll__graph.svg |   166 +
 ...sstvm_1_1tir_1_1SizeVarNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1SizeVar__coll__graph.svg    |   100 +
 .../classtvm_1_1tir_1_1SizeVar__inherit__graph.svg |   100 +
 .../doxygen/classtvm_1_1tir_1_1Stmt-members.html   |   106 +
 docs/api/doxygen/classtvm_1_1tir_1_1Stmt.html      |   166 +
 ...classtvm_1_1tir_1_1StmtExprMutator-members.html |   159 +
 .../classtvm_1_1tir_1_1StmtExprMutator.html        |   283 +
 ...stvm_1_1tir_1_1StmtExprMutator__coll__graph.svg |   113 +
 ...m_1_1tir_1_1StmtExprMutator__inherit__graph.svg |   113 +
 ...classtvm_1_1tir_1_1StmtExprVisitor-members.html |   154 +
 .../classtvm_1_1tir_1_1StmtExprVisitor.html        |   262 +
 ...stvm_1_1tir_1_1StmtExprVisitor__coll__graph.svg |   112 +
 ...m_1_1tir_1_1StmtExprVisitor__inherit__graph.svg |   112 +
 .../doxygen/classtvm_1_1tir_1_1StmtFunctor.html    |   128 +
 ...tmt_01_6n_00_01Args_8_8_8args_08_4-members.html |   125 +
 ...onst_01Stmt_01_6n_00_01Args_8_8_8args_08_4.html |   882 ++
 ...01_6n_00_01Args_8_8_8args_08_4__coll__graph.svg |    33 +
 ...classtvm_1_1tir_1_1StmtFunctor__coll__graph.svg |    23 +
 .../classtvm_1_1tir_1_1StmtMutator-members.html    |   126 +
 .../doxygen/classtvm_1_1tir_1_1StmtMutator.html    |   751 ++
 ...classtvm_1_1tir_1_1StmtMutator__coll__graph.svg |    51 +
 ...sstvm_1_1tir_1_1StmtMutator__inherit__graph.svg |    68 +
 .../classtvm_1_1tir_1_1StmtNode-members.html       |   110 +
 docs/api/doxygen/classtvm_1_1tir_1_1StmtNode.html  |   253 +
 .../classtvm_1_1tir_1_1StmtNode__coll__graph.svg   |    41 +
 ...classtvm_1_1tir_1_1StmtNode__inherit__graph.svg |   410 +
 .../classtvm_1_1tir_1_1StmtVisitor-members.html    |   121 +
 .../doxygen/classtvm_1_1tir_1_1StmtVisitor.html    |   554 +
 ...classtvm_1_1tir_1_1StmtVisitor__coll__graph.svg |    50 +
 ...sstvm_1_1tir_1_1StmtVisitor__inherit__graph.svg |    67 +
 .../classtvm_1_1tir_1_1Stmt__coll__graph.svg       |    37 +
 .../classtvm_1_1tir_1_1Stmt__inherit__graph.svg    |   116 +
 .../classtvm_1_1tir_1_1StoreNode-members.html      |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1StoreNode.html |   414 +
 .../classtvm_1_1tir_1_1StoreNode__coll__graph.svg  |   146 +
 ...lasstvm_1_1tir_1_1StoreNode__inherit__graph.svg |    66 +
 .../classtvm_1_1tir_1_1StringImm-members.html      |   111 +
 docs/api/doxygen/classtvm_1_1tir_1_1StringImm.html |   175 +
 .../classtvm_1_1tir_1_1StringImmNode-members.html  |   118 +
 .../doxygen/classtvm_1_1tir_1_1StringImmNode.html  |   350 +
 ...asstvm_1_1tir_1_1StringImmNode__coll__graph.svg |   116 +
 ...tvm_1_1tir_1_1StringImmNode__inherit__graph.svg |    82 +
 .../classtvm_1_1tir_1_1StringImm__coll__graph.svg  |    76 +
 ...lasstvm_1_1tir_1_1StringImm__inherit__graph.svg |    76 +
 .../classtvm_1_1tir_1_1SubNode-members.html        |   119 +
 docs/api/doxygen/classtvm_1_1tir_1_1SubNode.html   |   200 +
 .../classtvm_1_1tir_1_1SubNode__coll__graph.svg    |   188 +
 .../classtvm_1_1tir_1_1SubNode__inherit__graph.svg |   100 +
 .../doxygen/classtvm_1_1tir_1_1Var-members.html    |   117 +
 docs/api/doxygen/classtvm_1_1tir_1_1Var.html       |   373 +
 .../classtvm_1_1tir_1_1VarNode-members.html        |   118 +
 docs/api/doxygen/classtvm_1_1tir_1_1VarNode.html   |   369 +
 .../classtvm_1_1tir_1_1VarNode__coll__graph.svg    |   149 +
 .../classtvm_1_1tir_1_1VarNode__inherit__graph.svg |   100 +
 .../classtvm_1_1tir_1_1Var__coll__graph.svg        |    80 +
 .../classtvm_1_1tir_1_1Var__inherit__graph.svg     |   100 +
 .../classtvm_1_1transform_1_1Pass-members.html     |   108 +
 .../api/doxygen/classtvm_1_1transform_1_1Pass.html |   244 +
 ...asstvm_1_1transform_1_1PassContext-members.html |   116 +
 .../classtvm_1_1transform_1_1PassContext.html      |   462 +
 ...vm_1_1transform_1_1PassContextNode-members.html |   119 +
 .../classtvm_1_1transform_1_1PassContextNode.html  |   486 +
 ..._1transform_1_1PassContextNode__coll__graph.svg |   134 +
 ...ransform_1_1PassContextNode__inherit__graph.svg |    49 +
 ...vm_1_1transform_1_1PassContext__coll__graph.svg |    43 +
 ...1_1transform_1_1PassContext__inherit__graph.svg |    43 +
 .../classtvm_1_1transform_1_1PassInfo-members.html |   107 +
 .../doxygen/classtvm_1_1transform_1_1PassInfo.html |   207 +
 ...sstvm_1_1transform_1_1PassInfoNode-members.html |   113 +
 .../classtvm_1_1transform_1_1PassInfoNode.html     |   317 +
 ...m_1_1transform_1_1PassInfoNode__coll__graph.svg |    57 +
 ..._1transform_1_1PassInfoNode__inherit__graph.svg |    43 +
 ...sstvm_1_1transform_1_1PassInfo__coll__graph.svg |    38 +
 ...vm_1_1transform_1_1PassInfo__inherit__graph.svg |    38 +
 .../classtvm_1_1transform_1_1PassNode-members.html |   112 +
 .../doxygen/classtvm_1_1transform_1_1PassNode.html |   350 +
 ...sstvm_1_1transform_1_1PassNode__coll__graph.svg |    41 +
 ...vm_1_1transform_1_1PassNode__inherit__graph.svg |    41 +
 .../classtvm_1_1transform_1_1Pass__coll__graph.svg |    39 +
 ...asstvm_1_1transform_1_1Pass__inherit__graph.svg |    60 +
 ...lasstvm_1_1transform_1_1Sequential-members.html |   114 +
 .../classtvm_1_1transform_1_1Sequential.html       |   300 +
 ...tvm_1_1transform_1_1Sequential__coll__graph.svg |    60 +
 ..._1_1transform_1_1Sequential__inherit__graph.svg |    60 +
 docs/api/doxygen/closed.png                        |   Bin 0 -> 132 bytes
 docs/api/doxygen/codegen_8h.html                   |   142 +
 docs/api/doxygen/codegen_8h__incl.svg              |  1393 +++
 docs/api/doxygen/codegen_8h_source.html            |   115 +
 docs/api/doxygen/constant__utils_8h.html           |   133 +
 docs/api/doxygen/constant__utils_8h__dep__incl.svg |   222 +
 docs/api/doxygen/constant__utils_8h__incl.svg      |  1501 +++
 docs/api/doxygen/constant__utils_8h_source.html    |   112 +
 docs/api/doxygen/cublas_8h.html                    |   141 +
 docs/api/doxygen/cublas_8h__dep__incl.svg          |    47 +
 docs/api/doxygen/cublas_8h__incl.svg               |  1384 +++
 docs/api/doxygen/cublas_8h_source.html             |   112 +
 docs/api/doxygen/cuda_2dense_8h.html               |   147 +
 docs/api/doxygen/cuda_2dense_8h__dep__incl.svg     |    33 +
 docs/api/doxygen/cuda_2dense_8h__incl.svg          |  1330 +++
 docs/api/doxygen/cuda_2dense_8h_source.html        |   141 +
 docs/api/doxygen/cuda_2injective_8h.html           |   144 +
 docs/api/doxygen/cuda_2injective_8h__dep__incl.svg |    33 +
 docs/api/doxygen/cuda_2injective_8h__incl.svg      |  1283 ++
 docs/api/doxygen/cuda_2injective_8h_source.html    |   124 +
 docs/api/doxygen/cuda_2normalization_8h.html       |   134 +
 docs/api/doxygen/cuda_2normalization_8h__incl.svg  |  1303 +++
 .../api/doxygen/cuda_2normalization_8h_source.html |   125 +
 docs/api/doxygen/cuda_2pooling_8h.html             |   145 +
 docs/api/doxygen/cuda_2pooling_8h__dep__incl.svg   |    33 +
 docs/api/doxygen/cuda_2pooling_8h__incl.svg        |  1291 +++
 docs/api/doxygen/cuda_2pooling_8h_source.html      |   129 +
 docs/api/doxygen/cuda_2reduction_8h.html           |   150 +
 docs/api/doxygen/cuda_2reduction_8h__dep__incl.svg |    33 +
 docs/api/doxygen/cuda_2reduction_8h__incl.svg      |  1283 ++
 docs/api/doxygen/cuda_2reduction_8h_source.html    |   140 +
 docs/api/doxygen/cuda_2softmax_8h.html             |   136 +
 docs/api/doxygen/cuda_2softmax_8h__dep__incl.svg   |    33 +
 docs/api/doxygen/cuda_2softmax_8h__incl.svg        |  1283 ++
 docs/api/doxygen/cuda_2softmax_8h_source.html      |   127 +
 docs/api/doxygen/data__layout_8h.html              |   152 +
 docs/api/doxygen/data__layout_8h__dep__incl.svg    |   161 +
 docs/api/doxygen/data__layout_8h__incl.svg         |  1180 ++
 docs/api/doxygen/data__layout_8h_source.html       |   149 +
 docs/api/doxygen/data__type_8h.html                |   176 +
 docs/api/doxygen/data__type_8h__dep__incl.svg      |  1103 ++
 docs/api/doxygen/data__type_8h__incl.svg           |    93 +
 docs/api/doxygen/data__type_8h_source.html         |   163 +
 docs/api/doxygen/dataflow__matcher_8h.html         |   152 +
 docs/api/doxygen/dataflow__matcher_8h__incl.svg    |  1448 +++
 docs/api/doxygen/dataflow__matcher_8h_source.html  |   118 +
 docs/api/doxygen/dataflow__pattern_8h.html         |   197 +
 .../doxygen/dataflow__pattern_8h__dep__incl.svg    |    52 +
 docs/api/doxygen/dataflow__pattern_8h__incl.svg    |  1453 +++
 docs/api/doxygen/dataflow__pattern_8h_source.html  |   163 +
 .../api/doxygen/dataflow__pattern__functor_8h.html |   182 +
 .../dataflow__pattern__functor_8h__dep__incl.svg   |    33 +
 .../dataflow__pattern__functor_8h__incl.svg        |  1462 +++
 .../dataflow__pattern__functor_8h_source.html      |   126 +
 docs/api/doxygen/debug_8h.html                     |   134 +
 docs/api/doxygen/debug_8h__incl.svg                |  1041 ++
 docs/api/doxygen/debug_8h_source.html              |   109 +
 docs/api/doxygen/detail_2broadcast_8h.html         |   132 +
 .../doxygen/detail_2broadcast_8h__dep__incl.svg    |   119 +
 docs/api/doxygen/detail_2broadcast_8h__incl.svg    |  1491 +++
 docs/api/doxygen/detail_2broadcast_8h_source.html  |   113 +
 docs/api/doxygen/detail_2extern_8h.html            |   130 +
 docs/api/doxygen/detail_2extern_8h__dep__incl.svg  |    80 +
 docs/api/doxygen/detail_2extern_8h__incl.svg       |  1381 +++
 docs/api/doxygen/detail_2extern_8h_source.html     |   119 +
 docs/api/doxygen/device__api_8h.html               |   179 +
 docs/api/doxygen/device__api_8h__incl.svg          |   440 +
 docs/api/doxygen/device__api_8h_source.html        |   132 +
 docs/api/doxygen/device__copy_8h.html              |   133 +
 docs/api/doxygen/device__copy_8h__incl.svg         |  1013 ++
 docs/api/doxygen/device__copy_8h_source.html       |   108 +
 docs/api/doxygen/dilate_8h.html                    |   137 +
 docs/api/doxygen/dilate_8h__incl.svg               |  1384 +++
 docs/api/doxygen/dilate_8h_source.html             |   122 +
 docs/api/doxygen/dir_000002_000007.html            |    90 +
 docs/api/doxygen/dir_000002_000010.html            |    90 +
 docs/api/doxygen/dir_000002_000013.html            |    90 +
 docs/api/doxygen/dir_000002_000017.html            |    90 +
 docs/api/doxygen/dir_000004_000000.html            |    90 +
 docs/api/doxygen/dir_000005_000000.html            |    90 +
 docs/api/doxygen/dir_000006_000007.html            |    90 +
 docs/api/doxygen/dir_000006_000011.html            |    90 +
 docs/api/doxygen/dir_000006_000017.html            |    90 +
 docs/api/doxygen/dir_000006_000018.html            |    90 +
 docs/api/doxygen/dir_000006_000019.html            |    90 +
 docs/api/doxygen/dir_000007_000008.html            |    90 +
 docs/api/doxygen/dir_000007_000011.html            |    90 +
 docs/api/doxygen/dir_000007_000013.html            |    90 +
 docs/api/doxygen/dir_000007_000017.html            |    90 +
 docs/api/doxygen/dir_000008_000007.html            |    90 +
 docs/api/doxygen/dir_000008_000010.html            |    90 +
 docs/api/doxygen/dir_000008_000011.html            |    90 +
 docs/api/doxygen/dir_000008_000012.html            |    90 +
 docs/api/doxygen/dir_000008_000013.html            |    90 +
 docs/api/doxygen/dir_000008_000018.html            |    90 +
 docs/api/doxygen/dir_000008_000019.html            |    90 +
 docs/api/doxygen/dir_000009_000007.html            |    90 +
 docs/api/doxygen/dir_000009_000011.html            |    90 +
 docs/api/doxygen/dir_000010_000007.html            |    90 +
 docs/api/doxygen/dir_000010_000011.html            |    90 +
 docs/api/doxygen/dir_000010_000013.html            |    90 +
 docs/api/doxygen/dir_000012_000007.html            |    90 +
 docs/api/doxygen/dir_000013_000011.html            |    90 +
 docs/api/doxygen/dir_000018_000007.html            |    90 +
 docs/api/doxygen/dir_000018_000010.html            |    90 +
 docs/api/doxygen/dir_000018_000011.html            |    90 +
 docs/api/doxygen/dir_000018_000013.html            |    90 +
 docs/api/doxygen/dir_000018_000017.html            |    90 +
 docs/api/doxygen/dir_000019_000002.html            |    90 +
 docs/api/doxygen/dir_000019_000010.html            |    90 +
 docs/api/doxygen/dir_000019_000011.html            |    90 +
 docs/api/doxygen/dir_000019_000013.html            |    90 +
 docs/api/doxygen/dir_000019_000017.html            |    90 +
 docs/api/doxygen/dir_000020_000000.html            |    90 +
 docs/api/doxygen/dir_000021_000000.html            |    90 +
 docs/api/doxygen/dir_000021_000020.html            |    90 +
 docs/api/doxygen/dir_000022_000000.html            |    90 +
 docs/api/doxygen/dir_000022_000020.html            |    90 +
 docs/api/doxygen/dir_000022_000021.html            |    90 +
 docs/api/doxygen/dir_000022_000023.html            |    90 +
 docs/api/doxygen/dir_000022_000025.html            |    90 +
 docs/api/doxygen/dir_000023_000000.html            |    90 +
 docs/api/doxygen/dir_000023_000020.html            |    90 +
 docs/api/doxygen/dir_000024_000000.html            |    90 +
 docs/api/doxygen/dir_000024_000020.html            |    90 +
 docs/api/doxygen/dir_000024_000021.html            |    90 +
 docs/api/doxygen/dir_000024_000022.html            |    90 +
 docs/api/doxygen/dir_000024_000023.html            |    90 +
 docs/api/doxygen/dir_000024_000025.html            |    90 +
 docs/api/doxygen/dir_000025_000000.html            |    90 +
 docs/api/doxygen/dir_000025_000020.html            |    90 +
 docs/api/doxygen/dir_000026_000000.html            |    90 +
 docs/api/doxygen/dir_000026_000020.html            |    90 +
 docs/api/doxygen/dir_000027_000000.html            |    90 +
 docs/api/doxygen/dir_000027_000020.html            |    90 +
 .../dir_02be2c9d68e402f80df60bd528724ee5.html      |   113 +
 .../dir_02be2c9d68e402f80df60bd528724ee5_dep.svg   |   176 +
 .../dir_0a768efda19551002dc8866436c9ffae.html      |   106 +
 .../dir_14640941691eabc830844bef8114fc0c.html      |   134 +
 .../dir_14640941691eabc830844bef8114fc0c_dep.svg   |    45 +
 .../dir_194ecda214f05a38134392ac6a69b970.html      |   128 +
 .../dir_194ecda214f05a38134392ac6a69b970_dep.svg   |   132 +
 .../dir_404558507ed35459f0d7a6d81d8c508d.html      |   151 +
 .../dir_501163e255a572c2b8f8622055dcc830.html      |   140 +
 .../dir_501163e255a572c2b8f8622055dcc830_dep.svg   |    71 +
 .../dir_519be2d4a83a987dbf989f1de527b870.html      |   142 +
 .../dir_519be2d4a83a987dbf989f1de527b870_dep.svg   |    45 +
 .../dir_58d8b9f286105d83d91913f543711c4c.html      |   106 +
 .../dir_59fae77b9344561cec492d4c84fe16f0.html      |   127 +
 .../dir_59fae77b9344561cec492d4c84fe16f0_dep.svg   |   238 +
 .../dir_5da96592f3a7c442b838b075c58254c2.html      |   122 +
 .../dir_5da96592f3a7c442b838b075c58254c2_dep.svg   |   176 +
 .../dir_63946bee875c6d52bce55e72a67a86ad.html      |   168 +
 .../dir_63946bee875c6d52bce55e72a67a86ad_dep.svg   |   292 +
 .../dir_6cd4295f6ad5aa17e5b568d0e5b190e5.html      |   135 +
 .../dir_6cd4295f6ad5aa17e5b568d0e5b190e5_dep.svg   |    45 +
 .../dir_72c2f11201cd7636dc7624de0754daa5.html      |   143 +
 .../dir_72c2f11201cd7636dc7624de0754daa5_dep.svg   |   106 +
 .../dir_82fbc0b750acd2d16bf657eba2735040.html      |   115 +
 .../dir_82fbc0b750acd2d16bf657eba2735040_dep.svg   |    71 +
 .../dir_85f3d6180da4edc5eb489febd20e807a.html      |   150 +
 .../dir_85f3d6180da4edc5eb489febd20e807a_dep.svg   |   300 +
 .../dir_9028d5d964ed0471973ff1d6dc49c294.html      |   119 +
 .../dir_9028d5d964ed0471973ff1d6dc49c294_dep.svg   |    71 +
 .../dir_919d148e3bc0d2ada10274b170555243.html      |   119 +
 .../dir_919d148e3bc0d2ada10274b170555243_dep.svg   |    71 +
 .../dir_9a72de697ed8769045f2ae88dc0db9c6.html      |   127 +
 .../dir_9a72de697ed8769045f2ae88dc0db9c6_dep.svg   |   176 +
 .../dir_a2900df4deca8dd2bcded616f0fe650a.html      |   107 +
 .../dir_a99f4dc995763900c0e382b7dd5d0038.html      |   112 +
 .../dir_a99f4dc995763900c0e382b7dd5d0038_dep.svg   |    48 +
 .../dir_b4c7d8e826c599ba55146c099a14beb5.html      |   130 +
 .../dir_b4c7d8e826c599ba55146c099a14beb5_dep.svg   |   407 +
 .../dir_cf1b2a4a187708c24d9394e639e6417e.html      |   113 +
 .../dir_cf1b2a4a187708c24d9394e639e6417e_dep.svg   |    71 +
 .../dir_d44c64559bbebec7f509842c48db8b23.html      |   112 +
 .../dir_d44c64559bbebec7f509842c48db8b23_dep.svg   |    31 +
 .../dir_d523279167051dc3aad9a40981221f4d.html      |   115 +
 .../dir_d523279167051dc3aad9a40981221f4d_dep.svg   |    71 +
 .../dir_dc867ff9a37cad1764f1670dc7eba6c1.html      |   151 +
 .../dir_dc867ff9a37cad1764f1670dc7eba6c1_dep.svg   |   123 +
 .../dir_e79ffd3285e304ad4c501fa62028ed74.html      |   112 +
 .../dir_e79ffd3285e304ad4c501fa62028ed74_dep.svg   |    55 +
 .../dir_f97d855a3173728370e632aa77170e34.html      |   128 +
 .../dir_f97d855a3173728370e632aa77170e34_dep.svg   |   167 +
 .../dir_fb1b1bc11a768ab8cf63a96a73170118.html      |   107 +
 docs/api/doxygen/doc.png                           |   Bin 0 -> 746 bytes
 docs/api/doxygen/doxygen.css                       |  1475 +++
 docs/api/doxygen/doxygen.png                       |   Bin 0 -> 3779 bytes
 docs/api/doxygen/driver__api_8h.html               |   148 +
 docs/api/doxygen/driver__api_8h__incl.svg          |  1399 +++
 docs/api/doxygen/driver__api_8h_source.html        |   108 +
 docs/api/doxygen/dynsections.js                    |    97 +
 docs/api/doxygen/elemwise_8h.html                  |   271 +
 docs/api/doxygen/elemwise_8h__dep__incl.svg        |    73 +
 docs/api/doxygen/elemwise_8h__incl.svg             |  1285 ++
 docs/api/doxygen/elemwise_8h_source.html           |   168 +
 docs/api/doxygen/env__func_8h.html                 |   146 +
 docs/api/doxygen/env__func_8h__dep__incl.svg       |   441 +
 docs/api/doxygen/env__func_8h__incl.svg            |   740 ++
 docs/api/doxygen/env__func_8h_source.html          |   131 +
 docs/api/doxygen/error_8h.html                     |   146 +
 docs/api/doxygen/error_8h__dep__incl.svg           |   733 ++
 docs/api/doxygen/error_8h__incl.svg                |  1166 ++
 docs/api/doxygen/error_8h_source.html              |   121 +
 docs/api/doxygen/feature_8h.html                   |   184 +
 docs/api/doxygen/feature_8h__incl.svg              |  1378 +++
 docs/api/doxygen/feature_8h_source.html            |   138 +
 docs/api/doxygen/files.html                        |   272 +
 docs/api/doxygen/flatten_8h.html                   |   135 +
 docs/api/doxygen/flatten_8h__incl.svg              |  1499 +++
 docs/api/doxygen/flatten_8h_source.html            |   115 +
 docs/api/doxygen/folderclosed.png                  |   Bin 0 -> 616 bytes
 docs/api/doxygen/folderopen.png                    |   Bin 0 -> 597 bytes
 docs/api/doxygen/functions.html                    |   390 +
 docs/api/doxygen/functions_0x7e.html               |   207 +
 docs/api/doxygen/functions_a.html                  |   416 +
 docs/api/doxygen/functions_b.html                  |   302 +
 docs/api/doxygen/functions_c.html                  |   522 +
 docs/api/doxygen/functions_d.html                  |   351 +
 docs/api/doxygen/functions_e.html                  |   252 +
 docs/api/doxygen/functions_enum.html               |   116 +
 docs/api/doxygen/functions_eval.html               |   170 +
 docs/api/doxygen/functions_f.html                  |   343 +
 docs/api/doxygen/functions_func.html               |   140 +
 docs/api/doxygen/functions_func_0x7e.html          |   207 +
 docs/api/doxygen/functions_func_a.html             |   260 +
 docs/api/doxygen/functions_func_b.html             |   212 +
 docs/api/doxygen/functions_func_c.html             |   336 +
 docs/api/doxygen/functions_func_d.html             |   191 +
 docs/api/doxygen/functions_func_e.html             |   197 +
 docs/api/doxygen/functions_func_f.html             |   233 +
 docs/api/doxygen/functions_func_g.html             |   288 +
 docs/api/doxygen/functions_func_h.html             |   152 +
 docs/api/doxygen/functions_func_i.html             |   328 +
 docs/api/doxygen/functions_func_j.html             |   140 +
 docs/api/doxygen/functions_func_k.html             |   140 +
 docs/api/doxygen/functions_func_l.html             |   194 +
 docs/api/doxygen/functions_func_m.html             |   259 +
 docs/api/doxygen/functions_func_n.html             |   185 +
 docs/api/doxygen/functions_func_o.html             |   418 +
 docs/api/doxygen/functions_func_p.html             |   233 +
 docs/api/doxygen/functions_func_r.html             |   280 +
 docs/api/doxygen/functions_func_s.html             |   510 +
 docs/api/doxygen/functions_func_t.html             |   640 +
 docs/api/doxygen/functions_func_u.html             |   165 +
 docs/api/doxygen/functions_func_v.html             |   419 +
 docs/api/doxygen/functions_func_w.html             |   153 +
 docs/api/doxygen/functions_g.html                  |   317 +
 docs/api/doxygen/functions_h.html                  |   164 +
 docs/api/doxygen/functions_i.html                  |   459 +
 docs/api/doxygen/functions_j.html                  |   140 +
 docs/api/doxygen/functions_k.html                  |   235 +
 docs/api/doxygen/functions_l.html                  |   245 +
 docs/api/doxygen/functions_m.html                  |   325 +
 docs/api/doxygen/functions_n.html                  |   249 +
 docs/api/doxygen/functions_o.html                  |   526 +
 docs/api/doxygen/functions_p.html                  |   367 +
 docs/api/doxygen/functions_r.html                  |   413 +
 docs/api/doxygen/functions_rela.html               |   329 +
 docs/api/doxygen/functions_s.html                  |   701 ++
 docs/api/doxygen/functions_t.html                  |   771 ++
 docs/api/doxygen/functions_type.html               |   282 +
 docs/api/doxygen/functions_u.html                  |   182 +
 docs/api/doxygen/functions_v.html                  |   524 +
 docs/api/doxygen/functions_vars.html               |   385 +
 docs/api/doxygen/functions_vars_a.html             |   273 +
 docs/api/doxygen/functions_vars_b.html             |   230 +
 docs/api/doxygen/functions_vars_c.html             |   276 +
 docs/api/doxygen/functions_vars_d.html             |   294 +
 docs/api/doxygen/functions_vars_e.html             |   187 +
 docs/api/doxygen/functions_vars_f.html             |   223 +
 docs/api/doxygen/functions_vars_g.html             |   158 +
 docs/api/doxygen/functions_vars_h.html             |   144 +
 docs/api/doxygen/functions_vars_i.html             |   249 +
 docs/api/doxygen/functions_vars_k.html             |   185 +
 docs/api/doxygen/functions_vars_l.html             |   188 +
 docs/api/doxygen/functions_vars_m.html             |   191 +
 docs/api/doxygen/functions_vars_n.html             |   204 +
 docs/api/doxygen/functions_vars_o.html             |   222 +
 docs/api/doxygen/functions_vars_p.html             |   259 +
 docs/api/doxygen/functions_vars_r.html             |   240 +
 docs/api/doxygen/functions_vars_s.html             |   324 +
 docs/api/doxygen/functions_vars_t.html             |   236 +
 docs/api/doxygen/functions_vars_u.html             |   152 +
 docs/api/doxygen/functions_vars_v.html             |   236 +
 docs/api/doxygen/functions_vars_w.html             |   139 +
 docs/api/doxygen/functions_w.html                  |   172 +
 docs/api/doxygen/functor_8h.html                   |   202 +
 docs/api/doxygen/functor_8h__dep__incl.svg         |  1012 ++
 docs/api/doxygen/functor_8h__incl.svg              |   150 +
 docs/api/doxygen/functor_8h_source.html            |   109 +
 docs/api/doxygen/fuse_8h.html                      |   128 +
 docs/api/doxygen/fuse_8h__dep__incl.svg            |   273 +
 docs/api/doxygen/fuse_8h__incl.svg                 |  1371 +++
 docs/api/doxygen/fuse_8h_source.html               |   106 +
 docs/api/doxygen/generic_2default_8h.html          |   138 +
 docs/api/doxygen/generic_2default_8h__incl.svg     |  1283 ++
 docs/api/doxygen/generic_2default_8h_source.html   |   117 +
 docs/api/doxygen/generic_2extern_8h.html           |   142 +
 docs/api/doxygen/generic_2extern_8h__dep__incl.svg |    52 +
 docs/api/doxygen/generic_2extern_8h__incl.svg      |  1311 +++
 docs/api/doxygen/generic_2extern_8h_source.html    |   118 +
 docs/api/doxygen/generic_2injective_8h.html        |   144 +
 .../doxygen/generic_2injective_8h__dep__incl.svg   |    66 +
 docs/api/doxygen/generic_2injective_8h__incl.svg   |  1283 ++
 docs/api/doxygen/generic_2injective_8h_source.html |   119 +
 docs/api/doxygen/generic__func_8h.html             |   190 +
 docs/api/doxygen/generic__func_8h__dep__incl.svg   |   366 +
 docs/api/doxygen/generic__func_8h__incl.svg        |  1246 ++
 docs/api/doxygen/generic__func_8h_source.html      |   127 +
 docs/api/doxygen/globals.html                      |   632 +
 docs/api/doxygen/globals_defs.html                 |   345 +
 docs/api/doxygen/globals_enum.html                 |   110 +
 docs/api/doxygen/globals_eval.html                 |   176 +
 docs/api/doxygen/globals_func.html                 |   271 +
 docs/api/doxygen/globals_type.html                 |   143 +
 docs/api/doxygen/graph_legend.html                 |   116 +
 docs/api/doxygen/graph_legend.svg                  |   121 +
 docs/api/doxygen/hierarchy.html                    |   797 ++
 docs/api/doxygen/image_8h.html                     |   149 +
 docs/api/doxygen/image_8h__incl.svg                |  1185 ++
 docs/api/doxygen/image_8h_source.html              |   144 +
 docs/api/doxygen/include_2tvm_2arith_2util_8h.html |   133 +
 .../doxygen/include_2tvm_2arith_2util_8h__incl.svg |    38 +
 .../include_2tvm_2arith_2util_8h_source.html       |   102 +
 .../doxygen/include_2tvm_2ir_2transform_8h.html    |   233 +
 .../include_2tvm_2ir_2transform_8h__dep__incl.svg  |   692 ++
 .../include_2tvm_2ir_2transform_8h__incl.svg       |  1227 ++
 .../include_2tvm_2ir_2transform_8h_source.html     |   157 +
 .../doxygen/include_2tvm_2relay_2attrs_2nn_8h.html |   253 +
 .../include_2tvm_2relay_2attrs_2nn_8h__incl.svg    |  1184 ++
 .../include_2tvm_2relay_2attrs_2nn_8h_source.html  |   376 +
 .../include_2tvm_2relay_2attrs_2transform_8h.html  |   200 +
 ...2tvm_2relay_2attrs_2transform_8h__dep__incl.svg |    46 +
 ...lude_2tvm_2relay_2attrs_2transform_8h__incl.svg |  1471 +++
 ...de_2tvm_2relay_2attrs_2transform_8h_source.html |   193 +
 .../include_2tvm_2relay_2qnn_2transform_8h.html    |   134 +
 ...nclude_2tvm_2relay_2qnn_2transform_8h__incl.svg |  1280 ++
 ...lude_2tvm_2relay_2qnn_2transform_8h_source.html |   105 +
 .../doxygen/include_2tvm_2relay_2transform_8h.html |   269 +
 ...nclude_2tvm_2relay_2transform_8h__dep__incl.svg |    32 +
 .../include_2tvm_2relay_2transform_8h__incl.svg    |  1426 +++
 .../include_2tvm_2relay_2transform_8h_source.html  |   165 +
 .../doxygen/include_2tvm_2tir_2transform_8h.html   |   228 +
 .../include_2tvm_2tir_2transform_8h__incl.svg      |  1367 +++
 .../include_2tvm_2tir_2transform_8h_source.html    |   144 +
 docs/api/doxygen/index.html                        |    90 +
 docs/api/doxygen/inherit_graph_0.svg               |    22 +
 docs/api/doxygen/inherit_graph_1.svg               |    22 +
 docs/api/doxygen/inherit_graph_10.svg              |    44 +
 docs/api/doxygen/inherit_graph_100.svg             |    22 +
 docs/api/doxygen/inherit_graph_101.svg             |    21 +
 docs/api/doxygen/inherit_graph_102.svg             |    21 +
 docs/api/doxygen/inherit_graph_103.svg             |    61 +
 docs/api/doxygen/inherit_graph_104.svg             |    25 +
 docs/api/doxygen/inherit_graph_105.svg             |    22 +
 docs/api/doxygen/inherit_graph_106.svg             |    22 +
 docs/api/doxygen/inherit_graph_107.svg             |    25 +
 docs/api/doxygen/inherit_graph_108.svg             |    24 +
 docs/api/doxygen/inherit_graph_109.svg             |    21 +
 docs/api/doxygen/inherit_graph_11.svg              |    22 +
 docs/api/doxygen/inherit_graph_110.svg             |    21 +
 docs/api/doxygen/inherit_graph_111.svg             |    21 +
 docs/api/doxygen/inherit_graph_112.svg             |    21 +
 docs/api/doxygen/inherit_graph_113.svg             |    22 +
 docs/api/doxygen/inherit_graph_114.svg             |    21 +
 docs/api/doxygen/inherit_graph_115.svg             |    22 +
 docs/api/doxygen/inherit_graph_116.svg             |    21 +
 docs/api/doxygen/inherit_graph_117.svg             |    21 +
 docs/api/doxygen/inherit_graph_118.svg             |    21 +
 docs/api/doxygen/inherit_graph_119.svg             |    22 +
 docs/api/doxygen/inherit_graph_12.svg              |    35 +
 docs/api/doxygen/inherit_graph_120.svg             |    23 +
 docs/api/doxygen/inherit_graph_121.svg             |    21 +
 docs/api/doxygen/inherit_graph_122.svg             |    22 +
 docs/api/doxygen/inherit_graph_123.svg             |    22 +
 docs/api/doxygen/inherit_graph_124.svg             |    22 +
 docs/api/doxygen/inherit_graph_125.svg             |    75 +
 docs/api/doxygen/inherit_graph_126.svg             |    75 +
 docs/api/doxygen/inherit_graph_127.svg             |    21 +
 docs/api/doxygen/inherit_graph_128.svg             |    25 +
 docs/api/doxygen/inherit_graph_129.svg             |    22 +
 docs/api/doxygen/inherit_graph_13.svg              |    22 +
 docs/api/doxygen/inherit_graph_130.svg             |    21 +
 docs/api/doxygen/inherit_graph_131.svg             |    22 +
 docs/api/doxygen/inherit_graph_132.svg             |    35 +
 docs/api/doxygen/inherit_graph_133.svg             |    35 +
 docs/api/doxygen/inherit_graph_134.svg             |    21 +
 docs/api/doxygen/inherit_graph_135.svg             |    21 +
 docs/api/doxygen/inherit_graph_136.svg             |    21 +
 docs/api/doxygen/inherit_graph_137.svg             |    21 +
 docs/api/doxygen/inherit_graph_14.svg              |    22 +
 docs/api/doxygen/inherit_graph_15.svg              |    21 +
 docs/api/doxygen/inherit_graph_16.svg              |    47 +
 docs/api/doxygen/inherit_graph_17.svg              |    34 +
 docs/api/doxygen/inherit_graph_18.svg              |    21 +
 docs/api/doxygen/inherit_graph_19.svg              |    21 +
 docs/api/doxygen/inherit_graph_2.svg               |    21 +
 docs/api/doxygen/inherit_graph_20.svg              |    21 +
 docs/api/doxygen/inherit_graph_21.svg              |    21 +
 docs/api/doxygen/inherit_graph_22.svg              |    22 +
 docs/api/doxygen/inherit_graph_23.svg              |    22 +
 docs/api/doxygen/inherit_graph_24.svg              |    21 +
 docs/api/doxygen/inherit_graph_25.svg              |    21 +
 docs/api/doxygen/inherit_graph_26.svg              |    22 +
 docs/api/doxygen/inherit_graph_27.svg              |    21 +
 docs/api/doxygen/inherit_graph_28.svg              |    22 +
 docs/api/doxygen/inherit_graph_29.svg              |    22 +
 docs/api/doxygen/inherit_graph_3.svg               |    21 +
 docs/api/doxygen/inherit_graph_30.svg              |    22 +
 docs/api/doxygen/inherit_graph_31.svg              |    22 +
 docs/api/doxygen/inherit_graph_32.svg              |    22 +
 docs/api/doxygen/inherit_graph_33.svg              |    60 +
 docs/api/doxygen/inherit_graph_34.svg              |    22 +
 docs/api/doxygen/inherit_graph_35.svg              |    22 +
 docs/api/doxygen/inherit_graph_36.svg              |    22 +
 docs/api/doxygen/inherit_graph_37.svg              |    22 +
 docs/api/doxygen/inherit_graph_38.svg              |    23 +
 docs/api/doxygen/inherit_graph_39.svg              |    23 +
 docs/api/doxygen/inherit_graph_4.svg               |    22 +
 docs/api/doxygen/inherit_graph_40.svg              |    22 +
 docs/api/doxygen/inherit_graph_41.svg              |    22 +
 docs/api/doxygen/inherit_graph_42.svg              |    22 +
 docs/api/doxygen/inherit_graph_43.svg              |    22 +
 docs/api/doxygen/inherit_graph_44.svg              |    22 +
 docs/api/doxygen/inherit_graph_45.svg              |    22 +
 docs/api/doxygen/inherit_graph_46.svg              |    22 +
 docs/api/doxygen/inherit_graph_47.svg              |    21 +
 docs/api/doxygen/inherit_graph_48.svg              |    22 +
 docs/api/doxygen/inherit_graph_49.svg              |    22 +
 docs/api/doxygen/inherit_graph_5.svg               |  4863 ++++++++
 docs/api/doxygen/inherit_graph_50.svg              |    21 +
 docs/api/doxygen/inherit_graph_51.svg              |    21 +
 docs/api/doxygen/inherit_graph_52.svg              |    22 +
 docs/api/doxygen/inherit_graph_53.svg              |  1606 +++
 docs/api/doxygen/inherit_graph_54.svg              |    21 +
 docs/api/doxygen/inherit_graph_55.svg              |    23 +
 docs/api/doxygen/inherit_graph_56.svg              |    21 +
 docs/api/doxygen/inherit_graph_57.svg              |    21 +
 docs/api/doxygen/inherit_graph_58.svg              |    22 +
 docs/api/doxygen/inherit_graph_59.svg              |    22 +
 docs/api/doxygen/inherit_graph_6.svg               |    21 +
 docs/api/doxygen/inherit_graph_60.svg              |    22 +
 docs/api/doxygen/inherit_graph_61.svg              |    35 +
 docs/api/doxygen/inherit_graph_62.svg              |    48 +
 docs/api/doxygen/inherit_graph_63.svg              |    22 +
 docs/api/doxygen/inherit_graph_64.svg              |    22 +
 docs/api/doxygen/inherit_graph_65.svg              |    48 +
 docs/api/doxygen/inherit_graph_66.svg              |    21 +
 docs/api/doxygen/inherit_graph_67.svg              |    21 +
 docs/api/doxygen/inherit_graph_68.svg              |    22 +
 docs/api/doxygen/inherit_graph_69.svg              |    35 +
 docs/api/doxygen/inherit_graph_7.svg               |    21 +
 docs/api/doxygen/inherit_graph_70.svg              |    22 +
 docs/api/doxygen/inherit_graph_71.svg              |    35 +
 docs/api/doxygen/inherit_graph_72.svg              |    21 +
 docs/api/doxygen/inherit_graph_73.svg              |    22 +
 docs/api/doxygen/inherit_graph_74.svg              |    21 +
 docs/api/doxygen/inherit_graph_75.svg              |    21 +
 docs/api/doxygen/inherit_graph_76.svg              |    22 +
 docs/api/doxygen/inherit_graph_77.svg              |    22 +
 docs/api/doxygen/inherit_graph_78.svg              |    21 +
 docs/api/doxygen/inherit_graph_79.svg              |    22 +
 docs/api/doxygen/inherit_graph_8.svg               |    21 +
 docs/api/doxygen/inherit_graph_80.svg              |    35 +
 docs/api/doxygen/inherit_graph_81.svg              |   209 +
 docs/api/doxygen/inherit_graph_82.svg              |    21 +
 docs/api/doxygen/inherit_graph_83.svg              |    21 +
 docs/api/doxygen/inherit_graph_84.svg              |    21 +
 docs/api/doxygen/inherit_graph_85.svg              |    22 +
 docs/api/doxygen/inherit_graph_86.svg              |   139 +
 docs/api/doxygen/inherit_graph_87.svg              |    22 +
 docs/api/doxygen/inherit_graph_88.svg              |    22 +
 docs/api/doxygen/inherit_graph_89.svg              |    22 +
 docs/api/doxygen/inherit_graph_9.svg               |    21 +
 docs/api/doxygen/inherit_graph_90.svg              |    21 +
 docs/api/doxygen/inherit_graph_91.svg              |    23 +
 docs/api/doxygen/inherit_graph_92.svg              |    22 +
 docs/api/doxygen/inherit_graph_93.svg              |    22 +
 docs/api/doxygen/inherit_graph_94.svg              |    22 +
 docs/api/doxygen/inherit_graph_95.svg              |    23 +
 docs/api/doxygen/inherit_graph_96.svg              |    21 +
 docs/api/doxygen/inherit_graph_97.svg              |    22 +
 docs/api/doxygen/inherit_graph_98.svg              |    23 +
 docs/api/doxygen/inherit_graph_99.svg              |    22 +
 docs/api/doxygen/inherits.html                     |   378 +
 docs/api/doxygen/int__set_8h.html                  |   192 +
 docs/api/doxygen/int__set_8h__dep__incl.svg        |   992 ++
 docs/api/doxygen/int__set_8h__incl.svg             |  1084 ++
 docs/api/doxygen/int__set_8h_source.html           |   127 +
 docs/api/doxygen/int__solver_8h.html               |   154 +
 docs/api/doxygen/int__solver_8h__incl.svg          |  1089 ++
 docs/api/doxygen/int__solver_8h_source.html        |   131 +
 docs/api/doxygen/interpreter_8h.html               |   162 +
 docs/api/doxygen/interpreter_8h__incl.svg          |  1414 +++
 docs/api/doxygen/interpreter_8h_source.html        |   143 +
 docs/api/doxygen/ir_2adt_8h.html                   |   150 +
 docs/api/doxygen/ir_2adt_8h__dep__incl.svg         |   905 ++
 docs/api/doxygen/ir_2adt_8h__incl.svg              |   964 ++
 docs/api/doxygen/ir_2adt_8h_source.html            |   142 +
 docs/api/doxygen/ir_2attrs_8h.html                 |   316 +
 docs/api/doxygen/ir_2attrs_8h__dep__incl.svg       |   916 ++
 docs/api/doxygen/ir_2attrs_8h__incl.svg            |   994 ++
 docs/api/doxygen/ir_2attrs_8h_source.html          |   217 +
 docs/api/doxygen/ir_2expr_8h.html                  |   208 +
 docs/api/doxygen/ir_2expr_8h__dep__incl.svg        |   953 ++
 docs/api/doxygen/ir_2expr_8h__incl.svg             |   926 ++
 docs/api/doxygen/ir_2expr_8h_source.html           |   189 +
 docs/api/doxygen/ir_2function_8h.html              |   176 +
 docs/api/doxygen/ir_2function_8h__dep__incl.svg    |   951 ++
 docs/api/doxygen/ir_2function_8h__incl.svg         |  1027 ++
 docs/api/doxygen/ir_2function_8h_source.html       |   124 +
 docs/api/doxygen/ir_2module_8h.html                |   156 +
 docs/api/doxygen/ir_2module_8h__dep__incl.svg      |   911 ++
 docs/api/doxygen/ir_2module_8h__incl.svg           |  1123 ++
 docs/api/doxygen/ir_2module_8h_source.html         |   158 +
 docs/api/doxygen/ir_2op_8h.html                    |   284 +
 docs/api/doxygen/ir_2op_8h__dep__incl.svg          |   351 +
 docs/api/doxygen/ir_2op_8h__incl.svg               |  1264 ++
 docs/api/doxygen/ir_2op_8h_source.html             |   168 +
 docs/api/doxygen/ir_2type_8h.html                  |   226 +
 docs/api/doxygen/ir_2type_8h__dep__incl.svg        |  1077 ++
 docs/api/doxygen/ir_2type_8h__incl.svg             |   873 ++
 docs/api/doxygen/ir_2type_8h_source.html           |   199 +
 docs/api/doxygen/jquery.js                         |    68 +
 docs/api/doxygen/local__response__norm_8h.html     |   133 +
 .../api/doxygen/local__response__norm_8h__incl.svg |  1379 +++
 .../doxygen/local__response__norm_8h_source.html   |   118 +
 docs/api/doxygen/mapping_8h.html                   |   136 +
 docs/api/doxygen/mapping_8h__incl.svg              |  1379 +++
 docs/api/doxygen/mapping_8h_source.html            |   112 +
 docs/api/doxygen/namespacedmlc.html                |   104 +
 docs/api/doxygen/namespacedmlc_1_1serializer.html  |   110 +
 docs/api/doxygen/namespacemembers.html             |   228 +
 docs/api/doxygen/namespacemembers_b.html           |   198 +
 docs/api/doxygen/namespacemembers_c.html           |   270 +
 docs/api/doxygen/namespacemembers_d.html           |   241 +
 docs/api/doxygen/namespacemembers_e.html           |   190 +
 docs/api/doxygen/namespacemembers_enum.html        |   149 +
 docs/api/doxygen/namespacemembers_eval.html        |   343 +
 docs/api/doxygen/namespacemembers_f.html           |   342 +
 docs/api/doxygen/namespacemembers_func.html        |   219 +
 docs/api/doxygen/namespacemembers_func_b.html      |   180 +
 docs/api/doxygen/namespacemembers_func_c.html      |   240 +
 docs/api/doxygen/namespacemembers_func_d.html      |   214 +
 docs/api/doxygen/namespacemembers_func_e.html      |   178 +
 docs/api/doxygen/namespacemembers_func_f.html      |   219 +
 docs/api/doxygen/namespacemembers_func_g.html      |   185 +
 docs/api/doxygen/namespacemembers_func_h.html      |   140 +
 docs/api/doxygen/namespacemembers_func_i.html      |   243 +
 docs/api/doxygen/namespacemembers_func_j.html      |   137 +
 docs/api/doxygen/namespacemembers_func_k.html      |   137 +
 docs/api/doxygen/namespacemembers_func_l.html      |   225 +
 docs/api/doxygen/namespacemembers_func_m.html      |   214 +
 docs/api/doxygen/namespacemembers_func_n.html      |   155 +
 docs/api/doxygen/namespacemembers_func_o.html      |   239 +
 docs/api/doxygen/namespacemembers_func_p.html      |   214 +
 docs/api/doxygen/namespacemembers_func_r.html      |   195 +
 docs/api/doxygen/namespacemembers_func_s.html      |   313 +
 docs/api/doxygen/namespacemembers_func_t.html      |   204 +
 docs/api/doxygen/namespacemembers_func_u.html      |   152 +
 docs/api/doxygen/namespacemembers_func_v.html      |   161 +
 docs/api/doxygen/namespacemembers_func_w.html      |   143 +
 docs/api/doxygen/namespacemembers_func_x.html      |   137 +
 docs/api/doxygen/namespacemembers_func_y.html      |   137 +
 docs/api/doxygen/namespacemembers_g.html           |   197 +
 docs/api/doxygen/namespacemembers_h.html           |   140 +
 docs/api/doxygen/namespacemembers_i.html           |   261 +
 docs/api/doxygen/namespacemembers_j.html           |   137 +
 docs/api/doxygen/namespacemembers_k.html           |   410 +
 docs/api/doxygen/namespacemembers_l.html           |   228 +
 docs/api/doxygen/namespacemembers_m.html           |   214 +
 docs/api/doxygen/namespacemembers_n.html           |   158 +
 docs/api/doxygen/namespacemembers_o.html           |   251 +
 docs/api/doxygen/namespacemembers_p.html           |   256 +
 docs/api/doxygen/namespacemembers_r.html           |   213 +
 docs/api/doxygen/namespacemembers_s.html           |   343 +
 docs/api/doxygen/namespacemembers_t.html           |   400 +
 docs/api/doxygen/namespacemembers_type.html        |   417 +
 docs/api/doxygen/namespacemembers_u.html           |   152 +
 docs/api/doxygen/namespacemembers_v.html           |   167 +
 docs/api/doxygen/namespacemembers_vars.html        |   498 +
 docs/api/doxygen/namespacemembers_w.html           |   143 +
 docs/api/doxygen/namespacemembers_x.html           |   137 +
 docs/api/doxygen/namespacemembers_y.html           |   137 +
 docs/api/doxygen/namespaces.html                   |   131 +
 docs/api/doxygen/namespacetopi.html                | 11580 +++++++++++++++++++
 docs/api/doxygen/namespacetopi_1_1contrib.html     |   290 +
 docs/api/doxygen/namespacetopi_1_1cuda.html        |   668 ++
 docs/api/doxygen/namespacetopi_1_1generic.html     |   342 +
 docs/api/doxygen/namespacetopi_1_1nn.html          |  1968 ++++
 docs/api/doxygen/namespacetopi_1_1rocm.html        |   532 +
 docs/api/doxygen/namespacetopi_1_1vision.html      |   168 +
 docs/api/doxygen/namespacetopi_1_1x86.html         |   443 +
 docs/api/doxygen/namespacetvm.html                 |  7094 ++++++++++++
 docs/api/doxygen/namespacetvm_1_1arith.html        |   900 ++
 docs/api/doxygen/namespacetvm_1_1attr.html         |   173 +
 docs/api/doxygen/namespacetvm_1_1codegen.html      |   236 +
 docs/api/doxygen/namespacetvm_1_1detail.html       |   490 +
 docs/api/doxygen/namespacetvm_1_1relay.html        |  3084 +++++
 .../api/doxygen/namespacetvm_1_1relay_1_1attr.html |   265 +
 docs/api/doxygen/namespacetvm_1_1relay_1_1qnn.html |   118 +
 .../namespacetvm_1_1relay_1_1qnn_1_1transform.html |   128 +
 .../namespacetvm_1_1relay_1_1transform.html        |   917 ++
 docs/api/doxygen/namespacetvm_1_1runtime.html      |  1468 +++
 .../doxygen/namespacetvm_1_1runtime_1_1symbol.html |   231 +
 .../namespacetvm_1_1runtime_1_1threading.html      |   152 +
 .../api/doxygen/namespacetvm_1_1runtime_1_1vm.html |   284 +
 docs/api/doxygen/namespacetvm_1_1target.html       |   321 +
 docs/api/doxygen/namespacetvm_1_1te.html           |  2847 +++++
 docs/api/doxygen/namespacetvm_1_1tir.html          |  1815 +++
 docs/api/doxygen/namespacetvm_1_1tir_1_1attr.html  |   810 ++
 .../doxygen/namespacetvm_1_1tir_1_1intrinsic.html  |   737 ++
 .../doxygen/namespacetvm_1_1tir_1_1transform.html  |  1002 ++
 docs/api/doxygen/namespacetvm_1_1transform.html    |   230 +
 docs/api/doxygen/nav_f.png                         |   Bin 0 -> 153 bytes
 docs/api/doxygen/nav_g.png                         |   Bin 0 -> 95 bytes
 docs/api/doxygen/nav_h.png                         |   Bin 0 -> 98 bytes
 docs/api/doxygen/ndarray_8h.html                   |   171 +
 docs/api/doxygen/ndarray_8h__dep__incl.svg         |  1091 ++
 docs/api/doxygen/ndarray_8h__incl.svg              |   227 +
 docs/api/doxygen/ndarray_8h_source.html            |   161 +
 docs/api/doxygen/nn_2bnn_8h.html                   |   138 +
 docs/api/doxygen/nn_2bnn_8h__incl.svg              |  1499 +++
 docs/api/doxygen/nn_2bnn_8h_source.html            |   127 +
 docs/api/doxygen/nn_2dense_8h.html                 |   139 +
 docs/api/doxygen/nn_2dense_8h__dep__incl.svg       |    52 +
 docs/api/doxygen/nn_2dense_8h__incl.svg            |  1379 +++
 docs/api/doxygen/nn_2dense_8h_source.html          |   117 +
 docs/api/doxygen/nn_2pooling_8h.html               |   186 +
 docs/api/doxygen/nn_2pooling_8h__incl.svg          |  1448 +++
 docs/api/doxygen/nn_2pooling_8h_source.html        |   158 +
 docs/api/doxygen/nn_2softmax_8h.html               |   138 +
 docs/api/doxygen/nn_2softmax_8h__incl.svg          |  1375 +++
 docs/api/doxygen/nn_2softmax_8h_source.html        |   124 +
 docs/api/doxygen/node_2container_8h.html           |   158 +
 docs/api/doxygen/node_2container_8h__dep__incl.svg |  1165 ++
 docs/api/doxygen/node_2container_8h__incl.svg      |   557 +
 docs/api/doxygen/node_2container_8h_source.html    |   149 +
 docs/api/doxygen/node_8h.html                      |   143 +
 docs/api/doxygen/node_8h__dep__incl.svg            |  1087 ++
 docs/api/doxygen/node_8h__incl.svg                 |   812 ++
 docs/api/doxygen/node_8h_source.html               |   113 +
 docs/api/doxygen/object_8h.html                    |   542 +
 docs/api/doxygen/object_8h__dep__incl.svg          |  1228 ++
 docs/api/doxygen/object_8h__incl.svg               |   113 +
 docs/api/doxygen/object_8h_source.html             |   181 +
 docs/api/doxygen/op__attr__types_8h.html           |   207 +
 docs/api/doxygen/op__attr__types_8h__dep__incl.svg |    60 +
 docs/api/doxygen/op__attr__types_8h__incl.svg      |  1491 +++
 docs/api/doxygen/op__attr__types_8h_source.html    |   132 +
 docs/api/doxygen/op__strategy_8h.html              |   152 +
 docs/api/doxygen/op__strategy_8h__incl.svg         |  1490 +++
 docs/api/doxygen/op__strategy_8h_source.html       |   134 +
 docs/api/doxygen/open.png                          |   Bin 0 -> 123 bytes
 docs/api/doxygen/operation_8h.html                 |   213 +
 docs/api/doxygen/operation_8h__dep__incl.svg       |   894 ++
 docs/api/doxygen/operation_8h__incl.svg            |  1367 +++
 docs/api/doxygen/operation_8h_source.html          |   186 +
 docs/api/doxygen/packed__func_8h.html              |   327 +
 docs/api/doxygen/packed__func_8h__dep__incl.svg    |  1065 ++
 docs/api/doxygen/packed__func_8h__incl.svg         |   416 +
 docs/api/doxygen/packed__func_8h_source.html       |   244 +
 docs/api/doxygen/pad__utils_8h.html                |   131 +
 docs/api/doxygen/pad__utils_8h__dep__incl.svg      |    33 +
 docs/api/doxygen/pad__utils_8h__incl.svg           |  1386 +++
 docs/api/doxygen/pad__utils_8h_source.html         |   108 +
 docs/api/doxygen/pattern_8h.html                   |   137 +
 docs/api/doxygen/pattern_8h__incl.svg              |  1083 ++
 docs/api/doxygen/pattern_8h_source.html            |   106 +
 docs/api/doxygen/pattern__functor_8h.html          |   184 +
 docs/api/doxygen/pattern__functor_8h__incl.svg     |  1438 +++
 docs/api/doxygen/pattern__functor_8h_source.html   |   130 +
 docs/api/doxygen/ravel__unravel_8h.html            |   129 +
 docs/api/doxygen/ravel__unravel_8h__dep__incl.svg  |   111 +
 docs/api/doxygen/ravel__unravel_8h__incl.svg       |  1376 +++
 docs/api/doxygen/ravel__unravel_8h_source.html     |   108 +
 docs/api/doxygen/reduce_8h.html                    |   133 +
 docs/api/doxygen/reduce_8h__incl.svg               |  1013 ++
 docs/api/doxygen/reduce_8h_source.html             |   110 +
 docs/api/doxygen/reduction_8h.html                 |   216 +
 docs/api/doxygen/reduction_8h__dep__incl.svg       |    60 +
 docs/api/doxygen/reduction_8h__incl.svg            |  1366 +++
 docs/api/doxygen/reduction_8h_source.html          |   164 +
 docs/api/doxygen/reflection_8h.html                |   272 +
 docs/api/doxygen/reflection_8h__dep__incl.svg      |  1078 ++
 docs/api/doxygen/reflection_8h__incl.svg           |   716 ++
 docs/api/doxygen/reflection_8h_source.html         |   140 +
 docs/api/doxygen/registry_8h.html                  |   183 +
 docs/api/doxygen/registry_8h__dep__incl.svg        |   426 +
 docs/api/doxygen/registry_8h__incl.svg             |   445 +
 docs/api/doxygen/registry_8h_source.html           |   120 +
 docs/api/doxygen/relay_2adt_8h.html                |   190 +
 docs/api/doxygen/relay_2adt_8h__dep__incl.svg      |    73 +
 docs/api/doxygen/relay_2adt_8h__incl.svg           |  1486 +++
 docs/api/doxygen/relay_2adt_8h_source.html         |   184 +
 docs/api/doxygen/relay_2analysis_8h.html           |   186 +
 docs/api/doxygen/relay_2analysis_8h__incl.svg      |  1460 +++
 docs/api/doxygen/relay_2analysis_8h_source.html    |   123 +
 docs/api/doxygen/relay_2attrs_2memory_8h.html      |   151 +
 docs/api/doxygen/relay_2attrs_2memory_8h__incl.svg |  1430 +++
 .../doxygen/relay_2attrs_2memory_8h_source.html    |   126 +
 docs/api/doxygen/relay_2expr_8h.html               |   209 +
 docs/api/doxygen/relay_2expr_8h__dep__incl.svg     |   333 +
 docs/api/doxygen/relay_2expr_8h__incl.svg          |  1457 +++
 docs/api/doxygen/relay_2expr_8h_source.html        |   221 +
 docs/api/doxygen/relay_2expr__functor_8h.html      |   237 +
 docs/api/doxygen/relay_2expr__functor_8h__incl.svg |  1456 +++
 .../doxygen/relay_2expr__functor_8h_source.html    |   180 +
 docs/api/doxygen/relay_2function_8h.html           |   177 +
 docs/api/doxygen/relay_2function_8h__dep__incl.svg |    72 +
 docs/api/doxygen/relay_2function_8h__incl.svg      |  1424 +++
 docs/api/doxygen/relay_2function_8h_source.html    |   143 +
 docs/api/doxygen/relay_2op_8h.html                 |   164 +
 docs/api/doxygen/relay_2op_8h__dep__incl.svg       |    73 +
 docs/api/doxygen/relay_2op_8h__incl.svg            |  1457 +++
 docs/api/doxygen/relay_2op_8h_source.html          |   108 +
 docs/api/doxygen/relay_2qnn_2attrs_8h.html         |   138 +
 docs/api/doxygen/relay_2qnn_2attrs_8h__incl.svg    |  1013 ++
 docs/api/doxygen/relay_2qnn_2attrs_8h_source.html  |   115 +
 docs/api/doxygen/relay_2type_8h.html               |   197 +
 docs/api/doxygen/relay_2type_8h__dep__incl.svg     |   371 +
 docs/api/doxygen/relay_2type_8h__incl.svg          |  1372 +++
 docs/api/doxygen/relay_2type_8h_source.html        |   161 +
 docs/api/doxygen/reorg_8h.html                     |   137 +
 docs/api/doxygen/reorg_8h__incl.svg                |  1400 +++
 docs/api/doxygen/reorg_8h_source.html              |   116 +
 docs/api/doxygen/repr__printer_8h.html             |   150 +
 docs/api/doxygen/repr__printer_8h__dep__incl.svg   |  1068 ++
 docs/api/doxygen/repr__printer_8h__incl.svg        |   174 +
 docs/api/doxygen/repr__printer_8h_source.html      |   114 +
 docs/api/doxygen/rocblas_8h.html                   |   133 +
 docs/api/doxygen/rocblas_8h__dep__incl.svg         |    33 +
 docs/api/doxygen/rocblas_8h__incl.svg              |  1384 +++
 docs/api/doxygen/rocblas_8h_source.html            |   110 +
 docs/api/doxygen/rocm_2dense_8h.html               |   141 +
 docs/api/doxygen/rocm_2dense_8h__incl.svg          |  1325 +++
 docs/api/doxygen/rocm_2dense_8h_source.html        |   130 +
 docs/api/doxygen/rocm_2injective_8h.html           |   139 +
 docs/api/doxygen/rocm_2injective_8h__incl.svg      |  1288 +++
 docs/api/doxygen/rocm_2injective_8h_source.html    |   117 +
 docs/api/doxygen/rocm_2normalization_8h.html       |   133 +
 docs/api/doxygen/rocm_2normalization_8h__incl.svg  |  1300 +++
 .../api/doxygen/rocm_2normalization_8h_source.html |   111 +
 docs/api/doxygen/rocm_2pooling_8h.html             |   139 +
 docs/api/doxygen/rocm_2pooling_8h__incl.svg        |  1319 +++
 docs/api/doxygen/rocm_2pooling_8h_source.html      |   117 +
 docs/api/doxygen/rocm_2reduction_8h.html           |   135 +
 docs/api/doxygen/rocm_2reduction_8h__incl.svg      |  1288 +++
 docs/api/doxygen/rocm_2reduction_8h_source.html    |   114 +
 docs/api/doxygen/rocm_2softmax_8h.html             |   130 +
 docs/api/doxygen/rocm_2softmax_8h__incl.svg        |  1288 +++
 docs/api/doxygen/rocm_2softmax_8h_source.html      |   114 +
 docs/api/doxygen/runtime_2container_8h.html        |   237 +
 .../doxygen/runtime_2container_8h__dep__incl.svg   |  1139 ++
 docs/api/doxygen/runtime_2container_8h__incl.svg   |   500 +
 docs/api/doxygen/runtime_2container_8h_source.html |   272 +
 docs/api/doxygen/runtime_2crt_2memory_8h.html      |   209 +
 .../doxygen/runtime_2crt_2memory_8h_source.html    |   103 +
 docs/api/doxygen/runtime_2memory_8h.html           |   157 +
 docs/api/doxygen/runtime_2memory_8h__dep__incl.svg |  1192 ++
 docs/api/doxygen/runtime_2memory_8h__incl.svg      |   146 +
 docs/api/doxygen/runtime_2memory_8h_source.html    |   119 +
 docs/api/doxygen/runtime_2module_8h.html           |   183 +
 docs/api/doxygen/runtime_2module_8h__dep__incl.svg |  1065 ++
 docs/api/doxygen/runtime_2module_8h__incl.svg      |   417 +
 docs/api/doxygen/runtime_2module_8h_source.html    |   132 +
 docs/api/doxygen/schedule_8h.html                  |   204 +
 docs/api/doxygen/schedule_8h__dep__incl.svg        |  1003 ++
 docs/api/doxygen/schedule_8h__incl.svg             |  1309 +++
 docs/api/doxygen/schedule_8h_source.html           |   221 +
 docs/api/doxygen/schedule__pass_8h.html            |   158 +
 docs/api/doxygen/schedule__pass_8h__dep__incl.svg  |   258 +
 docs/api/doxygen/schedule__pass_8h__incl.svg       |  1313 +++
 docs/api/doxygen/schedule__pass_8h_source.html     |   110 +
 docs/api/doxygen/search/all_0.html                 |    26 +
 docs/api/doxygen/search/all_0.js                   |    13 +
 docs/api/doxygen/search/all_1.html                 |    26 +
 docs/api/doxygen/search/all_1.js                   |   253 +
 docs/api/doxygen/search/all_10.html                |    26 +
 docs/api/doxygen/search/all_10.js                  |   150 +
 docs/api/doxygen/search/all_11.html                |    26 +
 docs/api/doxygen/search/all_11.js                  |     4 +
 docs/api/doxygen/search/all_12.html                |    26 +
 docs/api/doxygen/search/all_12.js                  |   158 +
 docs/api/doxygen/search/all_13.html                |    26 +
 docs/api/doxygen/search/all_13.js                  |   240 +
 docs/api/doxygen/search/all_14.html                |    26 +
 docs/api/doxygen/search/all_14.js                  |   388 +
 docs/api/doxygen/search/all_15.html                |    26 +
 docs/api/doxygen/search/all_15.js                  |    33 +
 docs/api/doxygen/search/all_16.html                |    26 +
 docs/api/doxygen/search/all_16.js                  |    88 +
 docs/api/doxygen/search/all_17.html                |    26 +
 docs/api/doxygen/search/all_17.js                  |    21 +
 docs/api/doxygen/search/all_18.html                |    26 +
 docs/api/doxygen/search/all_18.js                  |     4 +
 docs/api/doxygen/search/all_19.html                |    26 +
 docs/api/doxygen/search/all_19.js                  |     5 +
 docs/api/doxygen/search/all_1a.html                |    26 +
 docs/api/doxygen/search/all_1a.js                  |    26 +
 docs/api/doxygen/search/all_2.html                 |    26 +
 docs/api/doxygen/search/all_2.js                   |   105 +
 docs/api/doxygen/search/all_3.html                 |    26 +
 docs/api/doxygen/search/all_3.js                   |   199 +
 docs/api/doxygen/search/all_4.html                 |    26 +
 docs/api/doxygen/search/all_4.js                   |   130 +
 docs/api/doxygen/search/all_5.html                 |    26 +
 docs/api/doxygen/search/all_5.js                   |    90 +
 docs/api/doxygen/search/all_6.html                 |    26 +
 docs/api/doxygen/search/all_6.js                   |   155 +
 docs/api/doxygen/search/all_7.html                 |    26 +
 docs/api/doxygen/search/all_7.js                   |    75 +
 docs/api/doxygen/search/all_8.html                 |    26 +
 docs/api/doxygen/search/all_8.js                   |    20 +
 docs/api/doxygen/search/all_9.html                 |    26 +
 docs/api/doxygen/search/all_9.js                   |   184 +
 docs/api/doxygen/search/all_a.html                 |    26 +
 docs/api/doxygen/search/all_a.js                   |     5 +
 docs/api/doxygen/search/all_b.html                 |    26 +
 docs/api/doxygen/search/all_b.js                   |   143 +
 docs/api/doxygen/search/all_c.html                 |    26 +
 docs/api/doxygen/search/all_c.js                   |    75 +
 docs/api/doxygen/search/all_d.html                 |    26 +
 docs/api/doxygen/search/all_d.js                   |   106 +
 docs/api/doxygen/search/all_e.html                 |    26 +
 docs/api/doxygen/search/all_e.js                   |    51 +
 docs/api/doxygen/search/all_f.html                 |    26 +
 docs/api/doxygen/search/all_f.js                   |   118 +
 docs/api/doxygen/search/classes_0.html             |    26 +
 docs/api/doxygen/search/classes_0.js               |   143 +
 docs/api/doxygen/search/classes_1.html             |    26 +
 docs/api/doxygen/search/classes_1.js               |    42 +
 docs/api/doxygen/search/classes_10.html            |    26 +
 docs/api/doxygen/search/classes_10.js              |    64 +
 docs/api/doxygen/search/classes_11.html            |    26 +
 docs/api/doxygen/search/classes_11.js              |    81 +
 docs/api/doxygen/search/classes_12.html            |    26 +
 docs/api/doxygen/search/classes_12.js              |     5 +
 docs/api/doxygen/search/classes_13.html            |    26 +
 docs/api/doxygen/search/classes_13.js              |    16 +
 docs/api/doxygen/search/classes_14.html            |    26 +
 docs/api/doxygen/search/classes_14.js              |     6 +
 docs/api/doxygen/search/classes_15.html            |    26 +
 docs/api/doxygen/search/classes_15.js              |     4 +
 docs/api/doxygen/search/classes_2.html             |    26 +
 docs/api/doxygen/search/classes_2.js               |    52 +
 docs/api/doxygen/search/classes_3.html             |    26 +
 docs/api/doxygen/search/classes_3.js               |    25 +
 docs/api/doxygen/search/classes_4.html             |    26 +
 docs/api/doxygen/search/classes_4.js               |    29 +
 docs/api/doxygen/search/classes_5.html             |    26 +
 docs/api/doxygen/search/classes_5.js               |    20 +
 docs/api/doxygen/search/classes_6.html             |    26 +
 docs/api/doxygen/search/classes_6.js               |    15 +
 docs/api/doxygen/search/classes_7.html             |    26 +
 docs/api/doxygen/search/classes_7.js               |     9 +
 docs/api/doxygen/search/classes_8.html             |    26 +
 docs/api/doxygen/search/classes_8.js               |    46 +
 docs/api/doxygen/search/classes_9.html             |    26 +
 docs/api/doxygen/search/classes_9.js               |    18 +
 docs/api/doxygen/search/classes_a.html             |    26 +
 docs/api/doxygen/search/classes_a.js               |    37 +
 docs/api/doxygen/search/classes_b.html             |    26 +
 docs/api/doxygen/search/classes_b.js               |    11 +
 docs/api/doxygen/search/classes_c.html             |    26 +
 docs/api/doxygen/search/classes_c.js               |    30 +
 docs/api/doxygen/search/classes_d.html             |    26 +
 docs/api/doxygen/search/classes_d.js               |    46 +
 docs/api/doxygen/search/classes_e.html             |    26 +
 docs/api/doxygen/search/classes_e.js               |     4 +
 docs/api/doxygen/search/classes_f.html             |    26 +
 docs/api/doxygen/search/classes_f.js               |    40 +
 docs/api/doxygen/search/close.png                  |   Bin 0 -> 273 bytes
 docs/api/doxygen/search/defines_0.html             |    26 +
 docs/api/doxygen/search/defines_0.js               |     6 +
 docs/api/doxygen/search/defines_1.html             |    26 +
 docs/api/doxygen/search/defines_1.js               |     5 +
 docs/api/doxygen/search/defines_2.html             |    26 +
 docs/api/doxygen/search/defines_2.js               |     5 +
 docs/api/doxygen/search/defines_3.html             |    26 +
 docs/api/doxygen/search/defines_3.js               |     4 +
 docs/api/doxygen/search/defines_4.html             |    26 +
 docs/api/doxygen/search/defines_4.js               |    10 +
 docs/api/doxygen/search/defines_5.html             |    26 +
 docs/api/doxygen/search/defines_5.js               |     4 +
 docs/api/doxygen/search/defines_6.html             |    26 +
 docs/api/doxygen/search/defines_6.js               |    55 +
 docs/api/doxygen/search/enums_0.html               |    26 +
 docs/api/doxygen/search/enums_0.js                 |     6 +
 docs/api/doxygen/search/enums_1.html               |    26 +
 docs/api/doxygen/search/enums_1.js                 |     4 +
 docs/api/doxygen/search/enums_2.html               |    26 +
 docs/api/doxygen/search/enums_2.js                 |     5 +
 docs/api/doxygen/search/enums_3.html               |    26 +
 docs/api/doxygen/search/enums_3.js                 |     5 +
 docs/api/doxygen/search/enums_4.html               |    26 +
 docs/api/doxygen/search/enums_4.js                 |     5 +
 docs/api/doxygen/search/enums_5.html               |    26 +
 docs/api/doxygen/search/enums_5.js                 |     4 +
 docs/api/doxygen/search/enums_6.html               |    26 +
 docs/api/doxygen/search/enums_6.js                 |     5 +
 docs/api/doxygen/search/enums_7.html               |    26 +
 docs/api/doxygen/search/enums_7.js                 |     4 +
 docs/api/doxygen/search/enums_8.html               |    26 +
 docs/api/doxygen/search/enums_8.js                 |     4 +
 docs/api/doxygen/search/enums_9.html               |    26 +
 docs/api/doxygen/search/enums_9.js                 |     8 +
 docs/api/doxygen/search/enumvalues_0.html          |    26 +
 docs/api/doxygen/search/enumvalues_0.js            |     8 +
 docs/api/doxygen/search/enumvalues_1.html          |    26 +
 docs/api/doxygen/search/enumvalues_1.js            |     5 +
 docs/api/doxygen/search/enumvalues_2.html          |    26 +
 docs/api/doxygen/search/enumvalues_2.js            |    21 +
 docs/api/doxygen/search/enumvalues_3.html          |    26 +
 docs/api/doxygen/search/enumvalues_3.js            |     6 +
 docs/api/doxygen/search/enumvalues_4.html          |    26 +
 docs/api/doxygen/search/enumvalues_4.js            |     4 +
 docs/api/doxygen/search/enumvalues_5.html          |    26 +
 docs/api/doxygen/search/enumvalues_5.js            |     8 +
 docs/api/doxygen/search/enumvalues_6.html          |    26 +
 docs/api/doxygen/search/enumvalues_6.js            |   102 +
 docs/api/doxygen/search/enumvalues_7.html          |    26 +
 docs/api/doxygen/search/enumvalues_7.js            |     5 +
 docs/api/doxygen/search/enumvalues_8.html          |    26 +
 docs/api/doxygen/search/enumvalues_8.js            |     4 +
 docs/api/doxygen/search/enumvalues_9.html          |    26 +
 docs/api/doxygen/search/enumvalues_9.js            |     4 +
 docs/api/doxygen/search/enumvalues_a.html          |    26 +
 docs/api/doxygen/search/enumvalues_a.js            |     6 +
 docs/api/doxygen/search/enumvalues_b.html          |    26 +
 docs/api/doxygen/search/enumvalues_b.js            |     4 +
 docs/api/doxygen/search/enumvalues_c.html          |    26 +
 docs/api/doxygen/search/enumvalues_c.js            |     4 +
 docs/api/doxygen/search/enumvalues_d.html          |    26 +
 docs/api/doxygen/search/enumvalues_d.js            |     4 +
 docs/api/doxygen/search/enumvalues_e.html          |    26 +
 docs/api/doxygen/search/enumvalues_e.js            |     4 +
 docs/api/doxygen/search/files_0.html               |    26 +
 docs/api/doxygen/search/files_0.js                 |    15 +
 docs/api/doxygen/search/files_1.html               |    26 +
 docs/api/doxygen/search/files_1.js                 |    13 +
 docs/api/doxygen/search/files_10.html              |    26 +
 docs/api/doxygen/search/files_10.js                |     6 +
 docs/api/doxygen/search/files_11.html              |    26 +
 docs/api/doxygen/search/files_11.js                |     6 +
 docs/api/doxygen/search/files_12.html              |    26 +
 docs/api/doxygen/search/files_12.js                |     4 +
 docs/api/doxygen/search/files_2.html               |    26 +
 docs/api/doxygen/search/files_2.js                 |    10 +
 docs/api/doxygen/search/files_3.html               |    26 +
 docs/api/doxygen/search/files_3.js                 |    18 +
 docs/api/doxygen/search/files_4.html               |    26 +
 docs/api/doxygen/search/files_4.js                 |    13 +
 docs/api/doxygen/search/files_5.html               |    26 +
 docs/api/doxygen/search/files_5.js                 |    10 +
 docs/api/doxygen/search/files_6.html               |    26 +
 docs/api/doxygen/search/files_6.js                 |     4 +
 docs/api/doxygen/search/files_7.html               |    26 +
 docs/api/doxygen/search/files_7.js                 |    11 +
 docs/api/doxygen/search/files_8.html               |    26 +
 docs/api/doxygen/search/files_8.js                 |     4 +
 docs/api/doxygen/search/files_9.html               |    26 +
 docs/api/doxygen/search/files_9.js                 |     9 +
 docs/api/doxygen/search/files_a.html               |    26 +
 docs/api/doxygen/search/files_a.js                 |     9 +
 docs/api/doxygen/search/files_b.html               |    26 +
 docs/api/doxygen/search/files_b.js                 |    10 +
 docs/api/doxygen/search/files_c.html               |    26 +
 docs/api/doxygen/search/files_c.js                 |    10 +
 docs/api/doxygen/search/files_d.html               |    26 +
 docs/api/doxygen/search/files_d.js                 |    13 +
 docs/api/doxygen/search/files_e.html               |    26 +
 docs/api/doxygen/search/files_e.js                 |    15 +
 docs/api/doxygen/search/files_f.html               |    26 +
 docs/api/doxygen/search/files_f.js                 |    21 +
 docs/api/doxygen/search/functions_0.html           |    26 +
 docs/api/doxygen/search/functions_0.js             |     4 +
 docs/api/doxygen/search/functions_1.html           |    26 +
 docs/api/doxygen/search/functions_1.js             |    65 +
 docs/api/doxygen/search/functions_10.html          |    26 +
 docs/api/doxygen/search/functions_10.js            |    58 +
 docs/api/doxygen/search/functions_11.html          |    26 +
 docs/api/doxygen/search/functions_11.js            |    63 +
 docs/api/doxygen/search/functions_12.html          |    26 +
 docs/api/doxygen/search/functions_12.js            |   113 +
 docs/api/doxygen/search/functions_13.html          |    26 +
 docs/api/doxygen/search/functions_13.js            |   119 +
 docs/api/doxygen/search/functions_14.html          |    26 +
 docs/api/doxygen/search/functions_14.js            |    23 +
 docs/api/doxygen/search/functions_15.html          |    26 +
 docs/api/doxygen/search/functions_15.js            |    49 +
 docs/api/doxygen/search/functions_16.html          |    26 +
 docs/api/doxygen/search/functions_16.js            |    11 +
 docs/api/doxygen/search/functions_17.html          |    26 +
 docs/api/doxygen/search/functions_17.js            |     4 +
 docs/api/doxygen/search/functions_18.html          |    26 +
 docs/api/doxygen/search/functions_18.js            |     4 +
 docs/api/doxygen/search/functions_19.html          |    26 +
 docs/api/doxygen/search/functions_19.js            |    26 +
 docs/api/doxygen/search/functions_2.html           |    26 +
 docs/api/doxygen/search/functions_2.js             |    35 +
 docs/api/doxygen/search/functions_3.html           |    26 +
 docs/api/doxygen/search/functions_3.js             |    97 +
 docs/api/doxygen/search/functions_4.html           |    26 +
 docs/api/doxygen/search/functions_4.js             |    45 +
 docs/api/doxygen/search/functions_5.html           |    26 +
 docs/api/doxygen/search/functions_5.js             |    33 +
 docs/api/doxygen/search/functions_6.html           |    26 +
 docs/api/doxygen/search/functions_6.js             |    60 +
 docs/api/doxygen/search/functions_7.html           |    26 +
 docs/api/doxygen/search/functions_7.js             |    55 +
 docs/api/doxygen/search/functions_8.html           |    26 +
 docs/api/doxygen/search/functions_8.js             |    10 +
 docs/api/doxygen/search/functions_9.html           |    26 +
 docs/api/doxygen/search/functions_9.js             |    94 +
 docs/api/doxygen/search/functions_a.html           |    26 +
 docs/api/doxygen/search/functions_a.js             |     5 +
 docs/api/doxygen/search/functions_b.html           |    26 +
 docs/api/doxygen/search/functions_b.js             |     5 +
 docs/api/doxygen/search/functions_c.html           |    26 +
 docs/api/doxygen/search/functions_c.js             |    50 +
 docs/api/doxygen/search/functions_d.html           |    26 +
 docs/api/doxygen/search/functions_d.js             |    50 +
 docs/api/doxygen/search/functions_e.html           |    26 +
 docs/api/doxygen/search/functions_e.js             |    22 +
 docs/api/doxygen/search/functions_f.html           |    26 +
 docs/api/doxygen/search/functions_f.js             |    62 +
 docs/api/doxygen/search/mag_sel.png                |   Bin 0 -> 563 bytes
 docs/api/doxygen/search/namespaces_0.html          |    26 +
 docs/api/doxygen/search/namespaces_0.js            |     5 +
 docs/api/doxygen/search/namespaces_1.html          |    26 +
 docs/api/doxygen/search/namespaces_1.js            |    32 +
 docs/api/doxygen/search/nomatches.html             |    12 +
 docs/api/doxygen/search/related_0.html             |    26 +
 docs/api/doxygen/search/related_0.js               |     8 +
 docs/api/doxygen/search/related_1.html             |    26 +
 docs/api/doxygen/search/related_1.js               |     5 +
 docs/api/doxygen/search/related_2.html             |    26 +
 docs/api/doxygen/search/related_2.js               |     4 +
 docs/api/doxygen/search/related_3.html             |    26 +
 docs/api/doxygen/search/related_3.js               |     4 +
 docs/api/doxygen/search/related_4.html             |    26 +
 docs/api/doxygen/search/related_4.js               |     5 +
 docs/api/doxygen/search/related_5.html             |    26 +
 docs/api/doxygen/search/related_5.js               |     6 +
 docs/api/doxygen/search/related_6.html             |    26 +
 docs/api/doxygen/search/related_6.js               |     8 +
 docs/api/doxygen/search/related_7.html             |    26 +
 docs/api/doxygen/search/related_7.js               |     4 +
 docs/api/doxygen/search/related_8.html             |    26 +
 docs/api/doxygen/search/related_8.js               |    12 +
 docs/api/doxygen/search/related_9.html             |    26 +
 docs/api/doxygen/search/related_9.js               |     5 +
 docs/api/doxygen/search/related_a.html             |    26 +
 docs/api/doxygen/search/related_a.js               |     4 +
 docs/api/doxygen/search/related_b.html             |    26 +
 docs/api/doxygen/search/related_b.js               |     8 +
 docs/api/doxygen/search/related_c.html             |    26 +
 docs/api/doxygen/search/related_c.js               |     8 +
 docs/api/doxygen/search/search.css                 |   271 +
 docs/api/doxygen/search/search.js                  |   791 ++
 docs/api/doxygen/search/search_l.png               |   Bin 0 -> 604 bytes
 docs/api/doxygen/search/search_m.png               |   Bin 0 -> 158 bytes
 docs/api/doxygen/search/search_r.png               |   Bin 0 -> 612 bytes
 docs/api/doxygen/search/searchdata.js              |    45 +
 docs/api/doxygen/search/typedefs_0.html            |    26 +
 docs/api/doxygen/search/typedefs_0.js              |     4 +
 docs/api/doxygen/search/typedefs_1.html            |    26 +
 docs/api/doxygen/search/typedefs_1.js              |     6 +
 docs/api/doxygen/search/typedefs_2.html            |    26 +
 docs/api/doxygen/search/typedefs_2.js              |     6 +
 docs/api/doxygen/search/typedefs_3.html            |    26 +
 docs/api/doxygen/search/typedefs_3.js              |     6 +
 docs/api/doxygen/search/typedefs_4.html            |    26 +
 docs/api/doxygen/search/typedefs_4.js              |     6 +
 docs/api/doxygen/search/typedefs_5.html            |    26 +
 docs/api/doxygen/search/typedefs_5.js              |    30 +
 docs/api/doxygen/search/typedefs_6.html            |    26 +
 docs/api/doxygen/search/typedefs_6.js              |     7 +
 docs/api/doxygen/search/typedefs_7.html            |    26 +
 docs/api/doxygen/search/typedefs_7.js              |    10 +
 docs/api/doxygen/search/typedefs_8.html            |    26 +
 docs/api/doxygen/search/typedefs_8.js              |     4 +
 docs/api/doxygen/search/typedefs_9.html            |    26 +
 docs/api/doxygen/search/typedefs_9.js              |     5 +
 docs/api/doxygen/search/typedefs_a.html            |    26 +
 docs/api/doxygen/search/typedefs_a.js              |    10 +
 docs/api/doxygen/search/typedefs_b.html            |    26 +
 docs/api/doxygen/search/typedefs_b.js              |    12 +
 docs/api/doxygen/search/typedefs_c.html            |    26 +
 docs/api/doxygen/search/typedefs_c.js              |     9 +
 docs/api/doxygen/search/typedefs_d.html            |    26 +
 docs/api/doxygen/search/typedefs_d.js              |    43 +
 docs/api/doxygen/search/typedefs_e.html            |    26 +
 docs/api/doxygen/search/typedefs_e.js              |     4 +
 docs/api/doxygen/search/variables_0.html           |    26 +
 docs/api/doxygen/search/variables_0.js             |    12 +
 docs/api/doxygen/search/variables_1.html           |    26 +
 docs/api/doxygen/search/variables_1.js             |    34 +
 docs/api/doxygen/search/variables_10.html          |    26 +
 docs/api/doxygen/search/variables_10.js            |    37 +
 docs/api/doxygen/search/variables_11.html          |    26 +
 docs/api/doxygen/search/variables_11.js            |    55 +
 docs/api/doxygen/search/variables_12.html          |    26 +
 docs/api/doxygen/search/variables_12.js            |    72 +
 docs/api/doxygen/search/variables_13.html          |    26 +
 docs/api/doxygen/search/variables_13.js            |     8 +
 docs/api/doxygen/search/variables_14.html          |    26 +
 docs/api/doxygen/search/variables_14.js            |    27 +
 docs/api/doxygen/search/variables_15.html          |    26 +
 docs/api/doxygen/search/variables_15.js            |     4 +
 docs/api/doxygen/search/variables_2.html           |    26 +
 docs/api/doxygen/search/variables_2.js             |    29 +
 docs/api/doxygen/search/variables_3.html           |    26 +
 docs/api/doxygen/search/variables_3.js             |    47 +
 docs/api/doxygen/search/variables_4.html           |    26 +
 docs/api/doxygen/search/variables_4.js             |    45 +
 docs/api/doxygen/search/variables_5.html           |    26 +
 docs/api/doxygen/search/variables_5.js             |    20 +
 docs/api/doxygen/search/variables_6.html           |    26 +
 docs/api/doxygen/search/variables_6.js             |    31 +
 docs/api/doxygen/search/variables_7.html           |    26 +
 docs/api/doxygen/search/variables_7.js             |     8 +
 docs/api/doxygen/search/variables_8.html           |    26 +
 docs/api/doxygen/search/variables_8.js             |     6 +
 docs/api/doxygen/search/variables_9.html           |    26 +
 docs/api/doxygen/search/variables_9.js             |    36 +
 docs/api/doxygen/search/variables_a.html           |    26 +
 docs/api/doxygen/search/variables_a.js             |    46 +
 docs/api/doxygen/search/variables_b.html           |    26 +
 docs/api/doxygen/search/variables_b.js             |    15 +
 docs/api/doxygen/search/variables_c.html           |    26 +
 docs/api/doxygen/search/variables_c.js             |    19 +
 docs/api/doxygen/search/variables_d.html           |    26 +
 docs/api/doxygen/search/variables_d.js             |    20 +
 docs/api/doxygen/search/variables_e.html           |    26 +
 docs/api/doxygen/search/variables_e.js             |    20 +
 docs/api/doxygen/search/variables_f.html           |    26 +
 docs/api/doxygen/search/variables_f.js             |    41 +
 docs/api/doxygen/serialization_8h.html             |   131 +
 docs/api/doxygen/serialization_8h__incl.svg        |   135 +
 docs/api/doxygen/serialization_8h_source.html      |   105 +
 docs/api/doxygen/serializer_8h.html                |   141 +
 docs/api/doxygen/serializer_8h__dep__incl.svg      |  1091 ++
 docs/api/doxygen/serializer_8h__incl.svg           |   227 +
 docs/api/doxygen/serializer_8h_source.html         |   107 +
 docs/api/doxygen/span_8h.html                      |   145 +
 docs/api/doxygen/span_8h__dep__incl.svg            |  1046 ++
 docs/api/doxygen/span_8h__incl.svg                 |   835 ++
 docs/api/doxygen/span_8h_source.html               |   122 +
 docs/api/doxygen/splitbar.png                      |   Bin 0 -> 314 bytes
 docs/api/doxygen/stmt_8h.html                      |   345 +
 docs/api/doxygen/stmt_8h__dep__incl.svg            |   976 ++
 docs/api/doxygen/stmt_8h__incl.svg                 |  1093 ++
 docs/api/doxygen/stmt_8h_source.html               |   303 +
 docs/api/doxygen/stmt__functor_8h.html             |   212 +
 docs/api/doxygen/stmt__functor_8h__incl.svg        |  1160 ++
 docs/api/doxygen/stmt__functor_8h_source.html      |   157 +
 docs/api/doxygen/structTVMByteArray-members.html   |   103 +
 docs/api/doxygen/structTVMByteArray.html           |   150 +
 .../doxygen/structTVMByteArray__coll__graph.svg    |    23 +
 .../doxygen/structTVMParallelGroupEnv-members.html |   103 +
 docs/api/doxygen/structTVMParallelGroupEnv.html    |   156 +
 .../structTVMParallelGroupEnv__coll__graph.svg     |    23 +
 ...izer_1_1Handler_3_01DLContext_01_4-members.html |   107 +
 ..._1serializer_1_1Handler_3_01DLContext_01_4.html |   193 +
 ..._1_1Handler_3_01DLContext_01_4__coll__graph.svg |    24 +
 ...zer_1_1Handler_3_01DLDataType_01_4-members.html |   107 +
 ...1serializer_1_1Handler_3_01DLDataType_01_4.html |   193 +
 ...1_1Handler_3_01DLDataType_01_4__coll__graph.svg |    24 +
 .../doxygen/structtvm_1_1AttrError-members.html    |   106 +
 docs/api/doxygen/structtvm_1_1AttrError.html       |   167 +
 .../structtvm_1_1AttrError__coll__graph.svg        |    36 +
 .../structtvm_1_1AttrError__inherit__graph.svg     |    36 +
 .../doxygen/structtvm_1_1ErrorBuilder-members.html |   107 +
 docs/api/doxygen/structtvm_1_1ErrorBuilder.html    |   183 +
 .../structtvm_1_1ErrorBuilder__coll__graph.svg     |    22 +
 ...structtvm_1_1Map_1_1ValueConverter-members.html |   107 +
 .../structtvm_1_1Map_1_1ValueConverter.html        |   170 +
 ...cttvm_1_1Map_1_1ValueConverter__coll__graph.svg |    23 +
 ...ructtvm_1_1detail_1_1AttrInitEntry-members.html |   115 +
 .../structtvm_1_1detail_1_1AttrInitEntry.html      |   351 +
 ...tvm_1_1detail_1_1AttrInitEntry__coll__graph.svg |    29 +
 ...tructtvm_1_1detail_1_1AttrNopEntry-members.html |   110 +
 .../structtvm_1_1detail_1_1AttrNopEntry.html       |   253 +
 ...ttvm_1_1detail_1_1AttrNopEntry__coll__graph.svg |    25 +
 ...tail_1_1AttrTriggerNonDefaultEntry-members.html |   112 +
 ...vm_1_1detail_1_1AttrTriggerNonDefaultEntry.html |   326 +
 ..._1_1AttrTriggerNonDefaultEntry__coll__graph.svg |    28 +
 ...ttvm_1_1detail_1_1ImplSEqualReduce-members.html |   106 +
 .../structtvm_1_1detail_1_1ImplSEqualReduce.html   |   145 +
 ...lSEqualReduce_3_01T_00_01true_01_4-members.html |   106 +
 ...l_1_1ImplSEqualReduce_3_01T_00_01true_01_4.html |   165 +
 ...ualReduce_3_01T_00_01true_01_4__coll__graph.svg |    23 +
 ..._1_1detail_1_1ImplSEqualReduce__coll__graph.svg |    23 +
 ...cttvm_1_1detail_1_1ImplSHashReduce-members.html |   106 +
 .../structtvm_1_1detail_1_1ImplSHashReduce.html    |   145 +
 ...plSHashReduce_3_01T_00_01true_01_4-members.html |   106 +
 ...il_1_1ImplSHashReduce_3_01T_00_01true_01_4.html |   159 +
 ...ashReduce_3_01T_00_01true_01_4__coll__graph.svg |    23 +
 ...m_1_1detail_1_1ImplSHashReduce__coll__graph.svg |    23 +
 ...ucttvm_1_1detail_1_1ImplVisitAttrs-members.html |   106 +
 .../structtvm_1_1detail_1_1ImplVisitAttrs.html     |   145 +
 ...mplVisitAttrs_3_01T_00_01true_01_4-members.html |   106 +
 ...ail_1_1ImplVisitAttrs_3_01T_00_01true_01_4.html |   159 +
 ...isitAttrs_3_01T_00_01true_01_4__coll__graph.svg |    23 +
 ...vm_1_1detail_1_1ImplVisitAttrs__coll__graph.svg |    23 +
 ...cttvm_1_1detail_1_1ReflectionTrait-members.html |   108 +
 .../structtvm_1_1detail_1_1ReflectionTrait.html    |   134 +
 ...m_1_1detail_1_1ReflectionTrait__coll__graph.svg |    73 +
 ..._1detail_1_1ReflectionTrait__inherit__graph.svg |    73 +
 ...vm_1_1detail_1_1SelectSEqualReduce-members.html |   106 +
 .../structtvm_1_1detail_1_1SelectSEqualReduce.html |   145 +
 ...01T_00_01TraitName_00_01false_01_4-members.html |   106 +
 ...educe_3_01T_00_01TraitName_00_01false_01_4.html |   165 +
 ...00_01TraitName_00_01false_01_4__coll__graph.svg |    23 +
 ..._1detail_1_1SelectSEqualReduce__coll__graph.svg |    23 +
 ...tvm_1_1detail_1_1SelectSHashReduce-members.html |   106 +
 .../structtvm_1_1detail_1_1SelectSHashReduce.html  |   145 +
 ...01T_00_01TraitName_00_01false_01_4-members.html |   106 +
 ...educe_3_01T_00_01TraitName_00_01false_01_4.html |   159 +
 ...00_01TraitName_00_01false_01_4__coll__graph.svg |    24 +
 ...1_1detail_1_1SelectSHashReduce__coll__graph.svg |    24 +
 ...ttvm_1_1detail_1_1SelectVisitAttrs-members.html |   106 +
 .../structtvm_1_1detail_1_1SelectVisitAttrs.html   |   145 +
 ...01T_00_01TraitName_00_01false_01_4-members.html |   106 +
 ...Attrs_3_01T_00_01TraitName_00_01false_01_4.html |   159 +
 ...00_01TraitName_00_01false_01_4__coll__graph.svg |    23 +
 ..._1_1detail_1_1SelectVisitAttrs__coll__graph.svg |    23 +
 .../structtvm_1_1detail_1_1TypeName-members.html   |   106 +
 .../doxygen/structtvm_1_1detail_1_1TypeName.html   |   159 +
 ...tail_1_1TypeName_3_01DataType_01_4-members.html |   106 +
 ...vm_1_1detail_1_1TypeName_3_01DataType_01_4.html |   143 +
 ..._1_1TypeName_3_01DataType_01_4__coll__graph.svg |    23 +
 ..._1detail_1_1TypeName_3_01bool_01_4-members.html |   106 +
 ...ucttvm_1_1detail_1_1TypeName_3_01bool_01_4.html |   143 +
 ...tail_1_1TypeName_3_01bool_01_4__coll__graph.svg |    23 +
 ...detail_1_1TypeName_3_01double_01_4-members.html |   106 +
 ...ttvm_1_1detail_1_1TypeName_3_01double_01_4.html |   143 +
 ...il_1_1TypeName_3_01double_01_4__coll__graph.svg |    23 +
 ...tail_1_1TypeName_3_01int64__t_01_4-members.html |   106 +
 ...vm_1_1detail_1_1TypeName_3_01int64__t_01_4.html |   143 +
 ..._1_1TypeName_3_01int64__t_01_4__coll__graph.svg |    23 +
 ...1_1detail_1_1TypeName_3_01int_01_4-members.html |   106 +
 ...ructtvm_1_1detail_1_1TypeName_3_01int_01_4.html |   143 +
 ...etail_1_1TypeName_3_01int_01_4__coll__graph.svg |    23 +
 ...ail_1_1TypeName_3_01uint64__t_01_4-members.html |   106 +
 ...m_1_1detail_1_1TypeName_3_01uint64__t_01_4.html |   143 +
 ...1_1TypeName_3_01uint64__t_01_4__coll__graph.svg |    23 +
 ...ail_1_1TypeName_3_01void_01_5_01_4-members.html |   106 +
 ...m_1_1detail_1_1TypeName_3_01void_01_5_01_4.html |   143 +
 ...1_1TypeName_3_01void_01_5_01_4__coll__graph.svg |    23 +
 ...tructtvm_1_1detail_1_1TypeName__coll__graph.svg |    22 +
 ...vm_1_1relay_1_1AdaptivePool2DAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1AdaptivePool2DAttrs.html |   245 +
 ..._1relay_1_1AdaptivePool2DAttrs__coll__graph.svg |   103 +
 ...elay_1_1AdaptivePool2DAttrs__inherit__graph.svg |    89 +
 ...vm_1_1relay_1_1AdaptivePool3DAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1AdaptivePool3DAttrs.html |   240 +
 ..._1relay_1_1AdaptivePool3DAttrs__coll__graph.svg |   103 +
 ...elay_1_1AdaptivePool3DAttrs__inherit__graph.svg |    89 +
 ...ucttvm_1_1relay_1_1AffineGridAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1AffineGridAttrs.html     |   231 +
 ...vm_1_1relay_1_1AffineGridAttrs__coll__graph.svg |   102 +
 ...1_1relay_1_1AffineGridAttrs__inherit__graph.svg |    87 +
 ...ttvm_1_1relay_1_1AllocStorageAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1AllocStorageAttrs.html   |   259 +
 ..._1_1relay_1_1AllocStorageAttrs__coll__graph.svg |   124 +
 ...1relay_1_1AllocStorageAttrs__inherit__graph.svg |    90 +
 ...cttvm_1_1relay_1_1AllocTensorAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1AllocTensorAttrs.html    |   259 +
 ...m_1_1relay_1_1AllocTensorAttrs__coll__graph.svg |   207 +
 ..._1relay_1_1AllocTensorAttrs__inherit__graph.svg |    89 +
 .../structtvm_1_1relay_1_1ArangeAttrs-members.html |   125 +
 .../doxygen/structtvm_1_1relay_1_1ArangeAttrs.html |   273 +
 ...ucttvm_1_1relay_1_1ArangeAttrs__coll__graph.svg |   174 +
 ...tvm_1_1relay_1_1ArangeAttrs__inherit__graph.svg |    89 +
 ...structtvm_1_1relay_1_1ArgsortAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1ArgsortAttrs.html        |   259 +
 ...cttvm_1_1relay_1_1ArgsortAttrs__coll__graph.svg |   122 +
 ...vm_1_1relay_1_1ArgsortAttrs__inherit__graph.svg |    88 +
 ...ructtvm_1_1relay_1_1AvgPool1DAttrs-members.html |   127 +
 .../structtvm_1_1relay_1_1AvgPool1DAttrs.html      |   301 +
 ...tvm_1_1relay_1_1AvgPool1DAttrs__coll__graph.svg |   106 +
 ..._1_1relay_1_1AvgPool1DAttrs__inherit__graph.svg |    92 +
 ...ructtvm_1_1relay_1_1AvgPool2DAttrs-members.html |   127 +
 .../structtvm_1_1relay_1_1AvgPool2DAttrs.html      |   301 +
 ...tvm_1_1relay_1_1AvgPool2DAttrs__coll__graph.svg |   106 +
 ..._1_1relay_1_1AvgPool2DAttrs__inherit__graph.svg |    92 +
 ...ructtvm_1_1relay_1_1AvgPool3DAttrs-members.html |   127 +
 .../structtvm_1_1relay_1_1AvgPool3DAttrs.html      |   301 +
 ...tvm_1_1relay_1_1AvgPool3DAttrs__coll__graph.svg |   106 +
 ..._1_1relay_1_1AvgPool3DAttrs__inherit__graph.svg |    92 +
 ...ructtvm_1_1relay_1_1BatchNormAttrs-members.html |   125 +
 .../structtvm_1_1relay_1_1BatchNormAttrs.html      |   273 +
 ...tvm_1_1relay_1_1BatchNormAttrs__coll__graph.svg |    90 +
 ..._1_1relay_1_1BatchNormAttrs__inherit__graph.svg |    90 +
 ...structtvm_1_1relay_1_1BiasAddAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1BiasAddAttrs.html        |   232 +
 ...cttvm_1_1relay_1_1BiasAddAttrs__coll__graph.svg |    86 +
 ...vm_1_1relay_1_1BiasAddAttrs__inherit__graph.svg |    86 +
 ...ttvm_1_1relay_1_1BinaryConv2DAttrs-members.html |   132 +
 .../structtvm_1_1relay_1_1BinaryConv2DAttrs.html   |   371 +
 ..._1_1relay_1_1BinaryConv2DAttrs__coll__graph.svg |   198 +
 ...1relay_1_1BinaryConv2DAttrs__inherit__graph.svg |    97 +
 ...cttvm_1_1relay_1_1BinaryDenseAttrs-members.html |   127 +
 .../structtvm_1_1relay_1_1BinaryDenseAttrs.html    |   296 +
 ...m_1_1relay_1_1BinaryDenseAttrs__coll__graph.svg |   179 +
 ..._1relay_1_1BinaryDenseAttrs__inherit__graph.svg |    92 +
 ...structtvm_1_1relay_1_1BitPackAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1BitPackAttrs.html        |   287 +
 ...cttvm_1_1relay_1_1BitPackAttrs__coll__graph.svg |   124 +
 ...vm_1_1relay_1_1BitPackAttrs__inherit__graph.svg |    90 +
 .../structtvm_1_1relay_1_1CastAttrs-members.html   |   122 +
 .../doxygen/structtvm_1_1relay_1_1CastAttrs.html   |   231 +
 ...tructtvm_1_1relay_1_1CastAttrs__coll__graph.svg |   121 +
 ...cttvm_1_1relay_1_1CastAttrs__inherit__graph.svg |    86 +
 ...tructtvm_1_1relay_1_1CastHintAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1CastHintAttrs.html       |   231 +
 ...ttvm_1_1relay_1_1CastHintAttrs__coll__graph.svg |   122 +
 ...m_1_1relay_1_1CastHintAttrs__inherit__graph.svg |    87 +
 .../structtvm_1_1relay_1_1ClipAttrs-members.html   |   123 +
 .../doxygen/structtvm_1_1relay_1_1ClipAttrs.html   |   245 +
 ...tructtvm_1_1relay_1_1ClipAttrs__coll__graph.svg |    87 +
 ...cttvm_1_1relay_1_1ClipAttrs__inherit__graph.svg |    87 +
 ...tructtvm_1_1relay_1_1CompilerAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1CompilerAttrs.html       |   234 +
 ...ttvm_1_1relay_1_1CompilerAttrs__coll__graph.svg |    87 +
 ...m_1_1relay_1_1CompilerAttrs__inherit__graph.svg |    87 +
 ...cttvm_1_1relay_1_1ConcatenateAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1ConcatenateAttrs.html    |   231 +
 ...m_1_1relay_1_1ConcatenateAttrs__coll__graph.svg |    87 +
 ..._1relay_1_1ConcatenateAttrs__inherit__graph.svg |    87 +
 ...vm_1_1relay_1_1ConstructorValueObj-members.html |   111 +
 .../structtvm_1_1relay_1_1ConstructorValueObj.html |   257 +
 ..._1relay_1_1ConstructorValueObj__coll__graph.svg |   109 +
 ...elay_1_1ConstructorValueObj__inherit__graph.svg |    40 +
 .../structtvm_1_1relay_1_1Conv1DAttrs-members.html |   131 +
 .../doxygen/structtvm_1_1relay_1_1Conv1DAttrs.html |   357 +
 ...ucttvm_1_1relay_1_1Conv1DAttrs__coll__graph.svg |   196 +
 ...tvm_1_1relay_1_1Conv1DAttrs__inherit__graph.svg |    95 +
 ...m_1_1relay_1_1Conv1DTransposeAttrs-members.html |   132 +
 ...structtvm_1_1relay_1_1Conv1DTransposeAttrs.html |   371 +
 ...1relay_1_1Conv1DTransposeAttrs__coll__graph.svg |   199 +
 ...lay_1_1Conv1DTransposeAttrs__inherit__graph.svg |    98 +
 .../structtvm_1_1relay_1_1Conv2DAttrs-members.html |   131 +
 .../doxygen/structtvm_1_1relay_1_1Conv2DAttrs.html |   357 +
 ...ucttvm_1_1relay_1_1Conv2DAttrs__coll__graph.svg |   196 +
 ...tvm_1_1relay_1_1Conv2DAttrs__inherit__graph.svg |    95 +
 ...m_1_1relay_1_1Conv2DTransposeAttrs-members.html |   132 +
 ...structtvm_1_1relay_1_1Conv2DTransposeAttrs.html |   371 +
 ...1relay_1_1Conv2DTransposeAttrs__coll__graph.svg |   199 +
 ...lay_1_1Conv2DTransposeAttrs__inherit__graph.svg |    98 +
 ...vm_1_1relay_1_1Conv2DWinogradAttrs-members.html |   132 +
 .../structtvm_1_1relay_1_1Conv2DWinogradAttrs.html |   371 +
 ..._1relay_1_1Conv2DWinogradAttrs__coll__graph.svg |   199 +
 ...elay_1_1Conv2DWinogradAttrs__inherit__graph.svg |    98 +
 ...WinogradNNPACKWeightTransformAttrs-members.html |   123 +
 ..._1Conv2DWinogradNNPACKWeightTransformAttrs.html |   245 +
 ...gradNNPACKWeightTransformAttrs__coll__graph.svg |   123 +
 ...dNNPACKWeightTransformAttrs__inherit__graph.svg |    89 +
 .../structtvm_1_1relay_1_1Conv3DAttrs-members.html |   131 +
 .../doxygen/structtvm_1_1relay_1_1Conv3DAttrs.html |   357 +
 ...ucttvm_1_1relay_1_1Conv3DAttrs__coll__graph.svg |   196 +
 ...tvm_1_1relay_1_1Conv3DAttrs__inherit__graph.svg |    95 +
 ...vm_1_1relay_1_1Conv3DWinogradAttrs-members.html |   132 +
 .../structtvm_1_1relay_1_1Conv3DWinogradAttrs.html |   371 +
 ..._1relay_1_1Conv3DWinogradAttrs__coll__graph.svg |   199 +
 ...elay_1_1Conv3DWinogradAttrs__inherit__graph.svg |    98 +
 ..._1ConvWinogradWeightTransformAttrs-members.html |   122 +
 ...1relay_1_1ConvWinogradWeightTransformAttrs.html |   231 +
 ...nvWinogradWeightTransformAttrs__coll__graph.svg |    88 +
 ...inogradWeightTransformAttrs__inherit__graph.svg |    88 +
 ...cttvm_1_1relay_1_1CorrelationAttrs-members.html |   128 +
 .../structtvm_1_1relay_1_1CorrelationAttrs.html    |   315 +
 ...m_1_1relay_1_1CorrelationAttrs__coll__graph.svg |   121 +
 ..._1relay_1_1CorrelationAttrs__inherit__graph.svg |    93 +
 ...tvm_1_1relay_1_1CropAndResizeAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1CropAndResizeAttrs.html  |   287 +
 ...1_1relay_1_1CropAndResizeAttrs__coll__graph.svg |   140 +
 ...relay_1_1CropAndResizeAttrs__inherit__graph.svg |    92 +
 .../structtvm_1_1relay_1_1DebugAttrs-members.html  |   122 +
 .../doxygen/structtvm_1_1relay_1_1DebugAttrs.html  |   231 +
 ...ructtvm_1_1relay_1_1DebugAttrs__coll__graph.svg |   122 +
 ...ttvm_1_1relay_1_1DebugAttrs__inherit__graph.svg |    86 +
 ..._1_1relay_1_1DeformableConv2DAttrs-members.html |   132 +
 ...tructtvm_1_1relay_1_1DeformableConv2DAttrs.html |   371 +
 ...relay_1_1DeformableConv2DAttrs__coll__graph.svg |   199 +
 ...ay_1_1DeformableConv2DAttrs__inherit__graph.svg |    98 +
 .../structtvm_1_1relay_1_1DenseAttrs-members.html  |   123 +
 .../doxygen/structtvm_1_1relay_1_1DenseAttrs.html  |   245 +
 ...ructtvm_1_1relay_1_1DenseAttrs__coll__graph.svg |   175 +
 ...ttvm_1_1relay_1_1DenseAttrs__inherit__graph.svg |    87 +
 ...ucttvm_1_1relay_1_1DeviceCopyAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1DeviceCopyAttrs.html     |   245 +
 ...vm_1_1relay_1_1DeviceCopyAttrs__coll__graph.svg |    88 +
 ...1_1relay_1_1DeviceCopyAttrs__inherit__graph.svg |    88 +
 .../structtvm_1_1relay_1_1DilateAttrs-members.html |   122 +
 .../doxygen/structtvm_1_1relay_1_1DilateAttrs.html |   231 +
 ...ucttvm_1_1relay_1_1DilateAttrs__coll__graph.svg |   101 +
 ...tvm_1_1relay_1_1DilateAttrs__inherit__graph.svg |    86 +
 ...ucttvm_1_1relay_1_1Dilation2DAttrs-members.html |   127 +
 .../structtvm_1_1relay_1_1Dilation2DAttrs.html     |   301 +
 ...vm_1_1relay_1_1Dilation2DAttrs__coll__graph.svg |   140 +
 ...1_1relay_1_1Dilation2DAttrs__inherit__graph.svg |    92 +
 ...structtvm_1_1relay_1_1DropoutAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1DropoutAttrs.html        |   231 +
 ...cttvm_1_1relay_1_1DropoutAttrs__coll__graph.svg |    86 +
 ...vm_1_1relay_1_1DropoutAttrs__inherit__graph.svg |    86 +
 ...ucttvm_1_1relay_1_1ExpandDimsAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1ExpandDimsAttrs.html     |   245 +
 ...vm_1_1relay_1_1ExpandDimsAttrs__coll__graph.svg |    88 +
 ...1_1relay_1_1ExpandDimsAttrs__inherit__graph.svg |    88 +
 ...ucttvm_1_1relay_1_1FIFOBufferAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1FIFOBufferAttrs.html     |   231 +
 ...vm_1_1relay_1_1FIFOBufferAttrs__coll__graph.svg |    87 +
 ...1_1relay_1_1FIFOBufferAttrs__inherit__graph.svg |    87 +
 ...vm_1_1relay_1_1GetValidCountsAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1GetValidCountsAttrs.html |   259 +
 ..._1relay_1_1GetValidCountsAttrs__coll__graph.svg |    90 +
 ...elay_1_1GetValidCountsAttrs__inherit__graph.svg |    90 +
 ...ttvm_1_1relay_1_1GlobalPool2DAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1GlobalPool2DAttrs.html   |   231 +
 ..._1_1relay_1_1GlobalPool2DAttrs__coll__graph.svg |    87 +
 ...1relay_1_1GlobalPool2DAttrs__inherit__graph.svg |    87 +
 ...ucttvm_1_1relay_1_1GridSampleAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1GridSampleAttrs.html     |   245 +
 ...vm_1_1relay_1_1GridSampleAttrs__coll__graph.svg |   103 +
 ...1_1relay_1_1GridSampleAttrs__inherit__graph.svg |    88 +
 ...ructtvm_1_1relay_1_1GroupNormAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1GroupNormAttrs.html      |   287 +
 ...tvm_1_1relay_1_1GroupNormAttrs__coll__graph.svg |    91 +
 ..._1_1relay_1_1GroupNormAttrs__inherit__graph.svg |    91 +
 .../structtvm_1_1relay_1_1InitOpAttrs-members.html |   123 +
 .../doxygen/structtvm_1_1relay_1_1InitOpAttrs.html |   245 +
 ...ucttvm_1_1relay_1_1InitOpAttrs__coll__graph.svg |   136 +
 ...tvm_1_1relay_1_1InitOpAttrs__inherit__graph.svg |    87 +
 ...ttvm_1_1relay_1_1InstanceNormAttrs-members.html |   125 +
 .../structtvm_1_1relay_1_1InstanceNormAttrs.html   |   273 +
 ..._1_1relay_1_1InstanceNormAttrs__coll__graph.svg |    91 +
 ...1relay_1_1InstanceNormAttrs__inherit__graph.svg |    91 +
 ...cttvm_1_1relay_1_1L2NormalizeAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1L2NormalizeAttrs.html    |   245 +
 ...m_1_1relay_1_1L2NormalizeAttrs__coll__graph.svg |   102 +
 ..._1relay_1_1L2NormalizeAttrs__inherit__graph.svg |    88 +
 .../structtvm_1_1relay_1_1LRNAttrs-members.html    |   126 +
 .../doxygen/structtvm_1_1relay_1_1LRNAttrs.html    |   287 +
 ...structtvm_1_1relay_1_1LRNAttrs__coll__graph.svg |    90 +
 ...ucttvm_1_1relay_1_1LRNAttrs__inherit__graph.svg |    90 +
 ...ructtvm_1_1relay_1_1LayerNormAttrs-members.html |   125 +
 .../structtvm_1_1relay_1_1LayerNormAttrs.html      |   273 +
 ...tvm_1_1relay_1_1LayerNormAttrs__coll__graph.svg |    90 +
 ..._1_1relay_1_1LayerNormAttrs__inherit__graph.svg |    90 +
 ...m_1_1relay_1_1LayoutTransformAttrs-members.html |   123 +
 ...structtvm_1_1relay_1_1LayoutTransformAttrs.html |   245 +
 ...1relay_1_1LayoutTransformAttrs__coll__graph.svg |    89 +
 ...lay_1_1LayoutTransformAttrs__inherit__graph.svg |    89 +
 ...ructtvm_1_1relay_1_1LeakyReluAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1LeakyReluAttrs.html      |   231 +
 ...tvm_1_1relay_1_1LeakyReluAttrs__coll__graph.svg |    87 +
 ..._1_1relay_1_1LeakyReluAttrs__inherit__graph.svg |    87 +
 ...ructtvm_1_1relay_1_1MaxPool1DAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1MaxPool1DAttrs.html      |   287 +
 ...tvm_1_1relay_1_1MaxPool1DAttrs__coll__graph.svg |   105 +
 ..._1_1relay_1_1MaxPool1DAttrs__inherit__graph.svg |    91 +
 ...ructtvm_1_1relay_1_1MaxPool2DAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1MaxPool2DAttrs.html      |   287 +
 ...tvm_1_1relay_1_1MaxPool2DAttrs__coll__graph.svg |   105 +
 ..._1_1relay_1_1MaxPool2DAttrs__inherit__graph.svg |    91 +
 ...ructtvm_1_1relay_1_1MaxPool3DAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1MaxPool3DAttrs.html      |   287 +
 ...tvm_1_1relay_1_1MaxPool3DAttrs__coll__graph.svg |   105 +
 ..._1_1relay_1_1MaxPool3DAttrs__inherit__graph.svg |    91 +
 ...ructtvm_1_1relay_1_1MirrorPadAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1MirrorPadAttrs.html      |   245 +
 ...tvm_1_1relay_1_1MirrorPadAttrs__coll__graph.svg |   103 +
 ..._1_1relay_1_1MirrorPadAttrs__inherit__graph.svg |    88 +
 ...tvm_1_1relay_1_1MultiBoxPriorAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1MultiBoxPriorAttrs.html  |   287 +
 ...1_1relay_1_1MultiBoxPriorAttrs__coll__graph.svg |   106 +
 ...relay_1_1MultiBoxPriorAttrs__inherit__graph.svg |    92 +
 ...relay_1_1MultiBoxTransformLocAttrs-members.html |   124 +
 ...ttvm_1_1relay_1_1MultiBoxTransformLocAttrs.html |   254 +
 ...y_1_1MultiBoxTransformLocAttrs__coll__graph.svg |   104 +
 ..._1MultiBoxTransformLocAttrs__inherit__graph.svg |    90 +
 ...cttvm_1_1relay_1_1NdarraySizeAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1NdarraySizeAttrs.html    |   231 +
 ...m_1_1relay_1_1NdarraySizeAttrs__coll__graph.svg |   122 +
 ..._1relay_1_1NdarraySizeAttrs__inherit__graph.svg |    87 +
 ...elay_1_1NonMaximumSuppressionAttrs-members.html |   130 +
 ...tvm_1_1relay_1_1NonMaximumSuppressionAttrs.html |   343 +
 ..._1_1NonMaximumSuppressionAttrs__coll__graph.svg |    96 +
 ...1NonMaximumSuppressionAttrs__inherit__graph.svg |    96 +
 ...tructtvm_1_1relay_1_1OnDeviceAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1OnDeviceAttrs.html       |   231 +
 ...ttvm_1_1relay_1_1OnDeviceAttrs__coll__graph.svg |    87 +
 ...m_1_1relay_1_1OnDeviceAttrs__inherit__graph.svg |    87 +
 .../structtvm_1_1relay_1_1OneHotAttrs-members.html |   124 +
 .../doxygen/structtvm_1_1relay_1_1OneHotAttrs.html |   259 +
 ...ucttvm_1_1relay_1_1OneHotAttrs__coll__graph.svg |   122 +
 ...tvm_1_1relay_1_1OneHotAttrs__inherit__graph.svg |    88 +
 .../structtvm_1_1relay_1_1PReluAttrs-members.html  |   122 +
 .../doxygen/structtvm_1_1relay_1_1PReluAttrs.html  |   231 +
 ...ructtvm_1_1relay_1_1PReluAttrs__coll__graph.svg |    86 +
 ...ttvm_1_1relay_1_1PReluAttrs__inherit__graph.svg |    86 +
 .../structtvm_1_1relay_1_1PadAttrs-members.html    |   124 +
 .../doxygen/structtvm_1_1relay_1_1PadAttrs.html    |   259 +
 ...structtvm_1_1relay_1_1PadAttrs__coll__graph.svg |   103 +
 ...ucttvm_1_1relay_1_1PadAttrs__inherit__graph.svg |    88 +
 ...tructtvm_1_1relay_1_1ProposalAttrs-members.html |   129 +
 .../structtvm_1_1relay_1_1ProposalAttrs.html       |   329 +
 ...ttvm_1_1relay_1_1ProposalAttrs__coll__graph.svg |   108 +
 ...m_1_1relay_1_1ProposalAttrs__inherit__graph.svg |    94 +
 ...tructtvm_1_1relay_1_1ROIAlignAttrs-members.html |   125 +
 .../structtvm_1_1relay_1_1ROIAlignAttrs.html       |   273 +
 ...ttvm_1_1relay_1_1ROIAlignAttrs__coll__graph.svg |   104 +
 ...m_1_1relay_1_1ROIAlignAttrs__inherit__graph.svg |    90 +
 ...structtvm_1_1relay_1_1ROIPoolAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1ROIPoolAttrs.html        |   259 +
 ...cttvm_1_1relay_1_1ROIPoolAttrs__coll__graph.svg |   102 +
 ...vm_1_1relay_1_1ROIPoolAttrs__inherit__graph.svg |    88 +
 .../structtvm_1_1relay_1_1ReduceAttrs-members.html |   124 +
 .../doxygen/structtvm_1_1relay_1_1ReduceAttrs.html |   259 +
 ...ucttvm_1_1relay_1_1ReduceAttrs__coll__graph.svg |   102 +
 ...tvm_1_1relay_1_1ReduceAttrs__inherit__graph.svg |    88 +
 .../structtvm_1_1relay_1_1RefValueObj-members.html |   110 +
 .../doxygen/structtvm_1_1relay_1_1RefValueObj.html |   260 +
 ...ucttvm_1_1relay_1_1RefValueObj__coll__graph.svg |    53 +
 ...tvm_1_1relay_1_1RefValueObj__inherit__graph.svg |    39 +
 .../structtvm_1_1relay_1_1RepeatAttrs-members.html |   123 +
 .../doxygen/structtvm_1_1relay_1_1RepeatAttrs.html |   245 +
 ...ucttvm_1_1relay_1_1RepeatAttrs__coll__graph.svg |   187 +
 ...tvm_1_1relay_1_1RepeatAttrs__inherit__graph.svg |    87 +
 ...structtvm_1_1relay_1_1ReshapeAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1ReshapeAttrs.html        |   245 +
 ...cttvm_1_1relay_1_1ReshapeAttrs__coll__graph.svg |   102 +
 ...vm_1_1relay_1_1ReshapeAttrs__inherit__graph.svg |    87 +
 ...tructtvm_1_1relay_1_1Resize3dAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1Resize3dAttrs.html       |   287 +
 ...ttvm_1_1relay_1_1Resize3dAttrs__coll__graph.svg |   155 +
 ...m_1_1relay_1_1Resize3dAttrs__inherit__graph.svg |    91 +
 .../structtvm_1_1relay_1_1ResizeAttrs-members.html |   126 +
 .../doxygen/structtvm_1_1relay_1_1ResizeAttrs.html |   287 +
 ...ucttvm_1_1relay_1_1ResizeAttrs__coll__graph.svg |   138 +
 ...tvm_1_1relay_1_1ResizeAttrs__inherit__graph.svg |    90 +
 ...structtvm_1_1relay_1_1ReverseAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1ReverseAttrs.html        |   231 +
 ...cttvm_1_1relay_1_1ReverseAttrs__coll__graph.svg |   186 +
 ...vm_1_1relay_1_1ReverseAttrs__inherit__graph.svg |    86 +
 ...ttvm_1_1relay_1_1SequenceMaskAttrs-members.html |   123 +
 .../structtvm_1_1relay_1_1SequenceMaskAttrs.html   |   240 +
 ..._1_1relay_1_1SequenceMaskAttrs__coll__graph.svg |    89 +
 ...1relay_1_1SequenceMaskAttrs__inherit__graph.svg |    89 +
 ...ructtvm_1_1relay_1_1ShapeFuncAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1ShapeFuncAttrs.html      |   231 +
 ...tvm_1_1relay_1_1ShapeFuncAttrs__coll__graph.svg |   102 +
 ..._1_1relay_1_1ShapeFuncAttrs__inherit__graph.svg |    87 +
 ...structtvm_1_1relay_1_1ShapeOfAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1ShapeOfAttrs.html        |   231 +
 ...cttvm_1_1relay_1_1ShapeOfAttrs__coll__graph.svg |   121 +
 ...vm_1_1relay_1_1ShapeOfAttrs__inherit__graph.svg |    86 +
 ...ructtvm_1_1relay_1_1SliceLikeAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1SliceLikeAttrs.html      |   226 +
 ...tvm_1_1relay_1_1SliceLikeAttrs__coll__graph.svg |   102 +
 ..._1_1relay_1_1SliceLikeAttrs__inherit__graph.svg |    87 +
 ...structtvm_1_1relay_1_1SoftmaxAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1SoftmaxAttrs.html        |   231 +
 ...cttvm_1_1relay_1_1SoftmaxAttrs__coll__graph.svg |    86 +
 ...vm_1_1relay_1_1SoftmaxAttrs__inherit__graph.svg |    86 +
 ...cttvm_1_1relay_1_1SparseDenseAttrs-members.html |   121 +
 .../structtvm_1_1relay_1_1SparseDenseAttrs.html    |   212 +
 ...m_1_1relay_1_1SparseDenseAttrs__coll__graph.svg |    87 +
 ..._1relay_1_1SparseDenseAttrs__inherit__graph.svg |    87 +
 ...m_1_1relay_1_1SparseTransposeAttrs-members.html |   121 +
 ...structtvm_1_1relay_1_1SparseTransposeAttrs.html |   212 +
 ...1relay_1_1SparseTransposeAttrs__coll__graph.svg |    88 +
 ...lay_1_1SparseTransposeAttrs__inherit__graph.svg |    88 +
 .../structtvm_1_1relay_1_1SplitAttrs-members.html  |   123 +
 .../doxygen/structtvm_1_1relay_1_1SplitAttrs.html  |   240 +
 ...ructtvm_1_1relay_1_1SplitAttrs__coll__graph.svg |   101 +
 ...ttvm_1_1relay_1_1SplitAttrs__inherit__graph.svg |    87 +
 ...structtvm_1_1relay_1_1SqueezeAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1SqueezeAttrs.html        |   231 +
 ...cttvm_1_1relay_1_1SqueezeAttrs__coll__graph.svg |   101 +
 ...vm_1_1relay_1_1SqueezeAttrs__inherit__graph.svg |    86 +
 .../structtvm_1_1relay_1_1StackAttrs-members.html  |   122 +
 .../doxygen/structtvm_1_1relay_1_1StackAttrs.html  |   231 +
 ...ructtvm_1_1relay_1_1StackAttrs__coll__graph.svg |   186 +
 ...ttvm_1_1relay_1_1StackAttrs__inherit__graph.svg |    86 +
 ...ttvm_1_1relay_1_1StridedSliceAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1StridedSliceAttrs.html   |   259 +
 ..._1_1relay_1_1StridedSliceAttrs__coll__graph.svg |   105 +
 ...1relay_1_1StridedSliceAttrs__inherit__graph.svg |    90 +
 ...tructtvm_1_1relay_1_1SubPixelAttrs-members.html |   124 +
 .../structtvm_1_1relay_1_1SubPixelAttrs.html       |   259 +
 ...ttvm_1_1relay_1_1SubPixelAttrs__coll__graph.svg |    89 +
 ...m_1_1relay_1_1SubPixelAttrs__inherit__graph.svg |    89 +
 .../structtvm_1_1relay_1_1TakeAttrs-members.html   |   123 +
 .../doxygen/structtvm_1_1relay_1_1TakeAttrs.html   |   240 +
 ...tructtvm_1_1relay_1_1TakeAttrs__coll__graph.svg |   186 +
 ...cttvm_1_1relay_1_1TakeAttrs__inherit__graph.svg |    87 +
 .../structtvm_1_1relay_1_1TileAttrs-members.html   |   122 +
 .../doxygen/structtvm_1_1relay_1_1TileAttrs.html   |   231 +
 ...tructtvm_1_1relay_1_1TileAttrs__coll__graph.svg |   101 +
 ...cttvm_1_1relay_1_1TileAttrs__inherit__graph.svg |    86 +
 .../structtvm_1_1relay_1_1TopKAttrs-members.html   |   126 +
 .../doxygen/structtvm_1_1relay_1_1TopKAttrs.html   |   282 +
 ...tructtvm_1_1relay_1_1TopKAttrs__coll__graph.svg |   124 +
 ...cttvm_1_1relay_1_1TopKAttrs__inherit__graph.svg |    90 +
 ...ructtvm_1_1relay_1_1TransposeAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1TransposeAttrs.html      |   231 +
 ...tvm_1_1relay_1_1TransposeAttrs__coll__graph.svg |   102 +
 ..._1_1relay_1_1TransposeAttrs__inherit__graph.svg |    87 +
 ...ttvm_1_1relay_1_1UpSampling3DAttrs-members.html |   127 +
 .../structtvm_1_1relay_1_1UpSampling3DAttrs.html   |   301 +
 ..._1_1relay_1_1UpSampling3DAttrs__coll__graph.svg |    92 +
 ...1relay_1_1UpSampling3DAttrs__inherit__graph.svg |    92 +
 ...ucttvm_1_1relay_1_1UpSamplingAttrs-members.html |   126 +
 .../structtvm_1_1relay_1_1UpSamplingAttrs.html     |   287 +
 ...vm_1_1relay_1_1UpSamplingAttrs__coll__graph.svg |    91 +
 ...1_1relay_1_1UpSamplingAttrs__inherit__graph.svg |    91 +
 ...ructtvm_1_1relay_1_1YoloReorgAttrs-members.html |   122 +
 .../structtvm_1_1relay_1_1YoloReorgAttrs.html      |   231 +
 ...tvm_1_1relay_1_1YoloReorgAttrs__coll__graph.svg |   187 +
 ..._1_1relay_1_1YoloReorgAttrs__inherit__graph.svg |    87 +
 ...m_1_1relay_1_1qnn_1_1QuantizeAttrs-members.html |   123 +
 ...structtvm_1_1relay_1_1qnn_1_1QuantizeAttrs.html |   245 +
 ...1relay_1_1qnn_1_1QuantizeAttrs__coll__graph.svg |   123 +
 ...lay_1_1qnn_1_1QuantizeAttrs__inherit__graph.svg |    89 +
 ...1_1relay_1_1qnn_1_1RequantizeAttrs-members.html |   124 +
 ...ructtvm_1_1relay_1_1qnn_1_1RequantizeAttrs.html |   259 +
 ...elay_1_1qnn_1_1RequantizeAttrs__coll__graph.svg |   124 +
 ...y_1_1qnn_1_1RequantizeAttrs__inherit__graph.svg |    90 +
 ...runtime_1_1Array_1_1ValueConverter-members.html |   107 +
 ...ttvm_1_1runtime_1_1Array_1_1ValueConverter.html |   170 +
 ...ime_1_1Array_1_1ValueConverter__coll__graph.svg |    23 +
 .../structtvm_1_1runtime_1_1NullOptType.html       |   118 +
 ...ttvm_1_1runtime_1_1NullOptType__coll__graph.svg |    22 +
 ...tructtvm_1_1runtime_1_1ObjectEqual-members.html |   107 +
 .../structtvm_1_1runtime_1_1ObjectEqual.html       |   201 +
 ...ttvm_1_1runtime_1_1ObjectEqual__coll__graph.svg |    23 +
 ...structtvm_1_1runtime_1_1ObjectHash-members.html |   107 +
 .../structtvm_1_1runtime_1_1ObjectHash.html        |   181 +
 ...cttvm_1_1runtime_1_1ObjectHash__coll__graph.svg |    23 +
 ...vm_1_1runtime_1_1ObjectTypeChecker-members.html |   107 +
 .../structtvm_1_1runtime_1_1ObjectTypeChecker.html |   190 +
 ...eChecker_3_01Array_3_01T_01_4_01_4-members.html |   107 +
 ...bjectTypeChecker_3_01Array_3_01T_01_4_01_4.html |   176 +
 ...cker_3_01Array_3_01T_01_4_01_4__coll__graph.svg |    24 +
 ...ker_3_01Map_3_01K_00_01V_01_4_01_4-members.html |   107 +
 ...TypeChecker_3_01Map_3_01K_00_01V_01_4_01_4.html |   176 +
 ...3_01Map_3_01K_00_01V_01_4_01_4__coll__graph.svg |    24 +
 ..._1runtime_1_1ObjectTypeChecker__coll__graph.svg |    24 +
 ...untime_1_1PackedFuncValueConverter-members.html |   107 +
 ...tvm_1_1runtime_1_1PackedFuncValueConverter.html |   212 +
 ...erter_3_01Optional_3_01T_01_4_01_4-members.html |   107 +
 ...alueConverter_3_01Optional_3_01T_01_4_01_4.html |   177 +
 ...r_3_01Optional_3_01T_01_4_01_4__coll__graph.svg |    25 +
 ...ncValueConverter_3_01PrimExpr_01_4-members.html |   106 +
 ...PackedFuncValueConverter_3_01PrimExpr_01_4.html |   147 +
 ...lueConverter_3_01PrimExpr_01_4__coll__graph.svg |    23 +
 ...eConverter_3_01tvm_1_1Integer_01_4-members.html |   106 +
 ...FuncValueConverter_3_01tvm_1_1Integer_01_4.html |   147 +
 ...verter_3_01tvm_1_1Integer_01_4__coll__graph.svg |    23 +
 ...3_1_1tvm_1_1runtime_1_1String_01_4-members.html |   107 +
 ...nverter_3_1_1tvm_1_1runtime_1_1String_01_4.html |   173 +
 ...1tvm_1_1runtime_1_1String_01_4__coll__graph.svg |    25 +
 ...me_1_1PackedFuncValueConverter__coll__graph.svg |    24 +
 .../structtvm_1_1runtime_1_1TypeIndex-members.html |   114 +
 .../doxygen/structtvm_1_1runtime_1_1TypeIndex.html |   180 +
 ...ucttvm_1_1runtime_1_1TypeIndex__coll__graph.svg |    22 +
 ...vm_1_1runtime_1_1vm_1_1Instruction-members.html |   171 +
 .../structtvm_1_1runtime_1_1vm_1_1Instruction.html |  1928 +++
 ..._1runtime_1_1vm_1_1Instruction__coll__graph.svg |    46 +
 ...ucttvm_1_1runtime_1_1vm_1_1VMFrame-members.html |   112 +
 .../structtvm_1_1runtime_1_1vm_1_1VMFrame.html     |   288 +
 ...vm_1_1runtime_1_1vm_1_1VMFrame__coll__graph.svg |    68 +
 ...tvm_1_1runtime_1_1vm_1_1VMFunction-members.html |   112 +
 .../structtvm_1_1runtime_1_1vm_1_1VMFunction.html  |   314 +
 ...1_1runtime_1_1vm_1_1VMFunction__coll__graph.svg |    26 +
 .../structtvm_1_1te_1_1TensorDom-members.html      |   107 +
 docs/api/doxygen/structtvm_1_1te_1_1TensorDom.html |   174 +
 .../structtvm_1_1te_1_1TensorDom__coll__graph.svg  |    22 +
 .../structtvm_1_1tir_1_1ExprDeepEqual-members.html |   106 +
 .../doxygen/structtvm_1_1tir_1_1ExprDeepEqual.html |   158 +
 ...ucttvm_1_1tir_1_1ExprDeepEqual__coll__graph.svg |    22 +
 .../structtvm_1_1tir_1_1LENode-members.html        |   119 +
 docs/api/doxygen/structtvm_1_1tir_1_1LENode.html   |   200 +
 .../structtvm_1_1tir_1_1LENode__coll__graph.svg    |   188 +
 .../structtvm_1_1tir_1_1LENode__inherit__graph.svg |   100 +
 .../structtvm_1_1tir_1_1TensorKey-members.html     |   109 +
 .../api/doxygen/structtvm_1_1tir_1_1TensorKey.html |   210 +
 .../structtvm_1_1tir_1_1TensorKey__coll__graph.svg |    56 +
 docs/api/doxygen/structural__equal_8h.html         |   148 +
 .../doxygen/structural__equal_8h__dep__incl.svg    |  1058 ++
 docs/api/doxygen/structural__equal_8h__incl.svg    |   619 +
 docs/api/doxygen/structural__equal_8h_source.html  |   124 +
 docs/api/doxygen/structural__hash_8h.html          |   143 +
 .../api/doxygen/structural__hash_8h__dep__incl.svg |  1058 ++
 docs/api/doxygen/structural__hash_8h__incl.svg     |   624 +
 docs/api/doxygen/structural__hash_8h_source.html   |   128 +
 docs/api/doxygen/sync_off.png                      |   Bin 0 -> 853 bytes
 docs/api/doxygen/sync_on.png                       |   Bin 0 -> 845 bytes
 docs/api/doxygen/tab_a.png                         |   Bin 0 -> 142 bytes
 docs/api/doxygen/tab_b.png                         |   Bin 0 -> 169 bytes
 docs/api/doxygen/tab_h.png                         |   Bin 0 -> 177 bytes
 docs/api/doxygen/tab_s.png                         |   Bin 0 -> 184 bytes
 docs/api/doxygen/tabs.css                          |    60 +
 docs/api/doxygen/tags_8h.html                      |   167 +
 docs/api/doxygen/tags_8h__dep__incl.svg            |   594 +
 docs/api/doxygen/tags_8h__incl.svg                 |    28 +
 docs/api/doxygen/tags_8h_source.html               |   116 +
 docs/api/doxygen/target_8h.html                    |   180 +
 docs/api/doxygen/target_8h__dep__incl.svg          |   431 +
 docs/api/doxygen/target_8h__incl.svg               |  1266 ++
 docs/api/doxygen/target_8h_source.html             |   146 +
 docs/api/doxygen/target__info_8h.html              |   140 +
 docs/api/doxygen/target__info_8h__incl.svg         |   945 ++
 docs/api/doxygen/target__info_8h_source.html       |   115 +
 docs/api/doxygen/tensor_8h.html                    |   308 +
 docs/api/doxygen/tensor_8h__dep__incl.svg          |  1007 ++
 docs/api/doxygen/tensor_8h__incl.svg               |  1240 ++
 docs/api/doxygen/tensor_8h_source.html             |   139 +
 docs/api/doxygen/tensor__intrin_8h.html            |   148 +
 docs/api/doxygen/tensor__intrin_8h__dep__incl.svg  |   989 ++
 docs/api/doxygen/tensor__intrin_8h__incl.svg       |  1264 ++
 docs/api/doxygen/tensor__intrin_8h_source.html     |   133 +
 docs/api/doxygen/tensor__type_8h.html              |   145 +
 docs/api/doxygen/tensor__type_8h__dep__incl.svg    |   385 +
 docs/api/doxygen/tensor__type_8h__incl.svg         |   945 ++
 docs/api/doxygen/tensor__type_8h_source.html       |   128 +
 docs/api/doxygen/tensor__utils_8h.html             |   128 +
 docs/api/doxygen/tensor__utils_8h__dep__incl.svg   |   106 +
 docs/api/doxygen/tensor__utils_8h__incl.svg        |  1371 +++
 docs/api/doxygen/tensor__utils_8h_source.html      |   112 +
 docs/api/doxygen/threading__backend_8h.html        |   144 +
 docs/api/doxygen/threading__backend_8h__incl.svg   |    49 +
 docs/api/doxygen/threading__backend_8h_source.html |   111 +
 docs/api/doxygen/tir_2analysis_8h.html             |   178 +
 docs/api/doxygen/tir_2analysis_8h__dep__incl.svg   |   235 +
 docs/api/doxygen/tir_2analysis_8h__incl.svg        |  1306 +++
 docs/api/doxygen/tir_2analysis_8h_source.html      |   125 +
 docs/api/doxygen/tir_2expr_8h.html                 |   400 +
 docs/api/doxygen/tir_2expr_8h__dep__incl.svg       |   933 ++
 docs/api/doxygen/tir_2expr_8h__incl.svg            |  1060 ++
 docs/api/doxygen/tir_2expr_8h_source.html          |   351 +
 docs/api/doxygen/tir_2expr__functor_8h.html        |   184 +
 .../doxygen/tir_2expr__functor_8h__dep__incl.svg   |    33 +
 docs/api/doxygen/tir_2expr__functor_8h__incl.svg   |  1084 ++
 docs/api/doxygen/tir_2expr__functor_8h_source.html |   150 +
 docs/api/doxygen/tir_2function_8h.html             |   160 +
 docs/api/doxygen/tir_2function_8h__dep__incl.svg   |   514 +
 docs/api/doxygen/tir_2function_8h__incl.svg        |  1227 ++
 docs/api/doxygen/tir_2function_8h_source.html      |   140 +
 docs/api/doxygen/tir_2op_8h.html                   |   667 ++
 docs/api/doxygen/tir_2op_8h__dep__incl.svg         |   982 ++
 docs/api/doxygen/tir_2op_8h__incl.svg              |  1131 ++
 docs/api/doxygen/tir_2op_8h_source.html            |   223 +
 docs/api/doxygen/topi_2include_2topi_2nn_8h.html   |   166 +
 .../topi_2include_2topi_2nn_8h__dep__incl.svg      |    32 +
 .../doxygen/topi_2include_2topi_2nn_8h__incl.svg   |  1453 +++
 .../doxygen/topi_2include_2topi_2nn_8h_source.html |   145 +
 .../doxygen/topi_2include_2topi_2transform_8h.html |   220 +
 ...opi_2include_2topi_2transform_8h__dep__incl.svg |    92 +
 .../topi_2include_2topi_2transform_8h__incl.svg    |  1424 +++
 .../topi_2include_2topi_2transform_8h_source.html  |   178 +
 docs/api/doxygen/topi_2include_2topi_2util_8h.html |   130 +
 .../doxygen/topi_2include_2topi_2util_8h__incl.svg |   944 ++
 .../topi_2include_2topi_2util_8h_source.html       |   110 +
 docs/api/doxygen/type__functor_8h.html             |   185 +
 docs/api/doxygen/type__functor_8h__incl.svg        |  1430 +++
 docs/api/doxygen/type__functor_8h_source.html      |   132 +
 docs/api/doxygen/type__relation_8h.html            |   160 +
 docs/api/doxygen/type__relation_8h__dep__incl.svg  |   408 +
 docs/api/doxygen/type__relation_8h__incl.svg       |  1175 ++
 docs/api/doxygen/type__relation_8h_source.html     |   147 +
 docs/api/doxygen/unionTVMValue-members.html        |   107 +
 docs/api/doxygen/unionTVMValue.html                |   206 +
 docs/api/doxygen/unionTVMValue__coll__graph.svg    |    27 +
 docs/api/doxygen/utvm__runtime_8h.html             |   320 +
 docs/api/doxygen/utvm__runtime_8h__incl.svg        |    40 +
 docs/api/doxygen/utvm__runtime_8h_source.html      |   108 +
 docs/api/doxygen/var_8h.html                       |   189 +
 docs/api/doxygen/var_8h__dep__incl.svg             |   927 ++
 docs/api/doxygen/var_8h__incl.svg                  |   954 ++
 docs/api/doxygen/var_8h_source.html                |   163 +
 docs/api/doxygen/vision_8h.html                    |   154 +
 docs/api/doxygen/vision_8h__incl.svg               |  1185 ++
 docs/api/doxygen/vision_8h_source.html             |   158 +
 docs/api/doxygen/vm_8h.html                        |   218 +
 docs/api/doxygen/vm_8h__dep__incl.svg              |    31 +
 docs/api/doxygen/vm_8h__incl.svg                   |   497 +
 docs/api/doxygen/vm_8h_source.html                 |   225 +
 docs/api/doxygen/with_8h.html                      |   136 +
 docs/api/doxygen/with_8h__dep__incl.svg            |  1086 ++
 docs/api/doxygen/with_8h__incl.svg                 |    39 +
 docs/api/doxygen/with_8h_source.html               |   105 +
 docs/api/doxygen/x86_2bnn_8h.html                  |   137 +
 docs/api/doxygen/x86_2bnn_8h__incl.svg             |  1285 ++
 docs/api/doxygen/x86_2bnn_8h_source.html           |   123 +
 docs/api/doxygen/x86_2default_8h.html              |   141 +
 docs/api/doxygen/x86_2default_8h__incl.svg         |  1283 ++
 docs/api/doxygen/x86_2default_8h_source.html       |   118 +
 docs/api/doxygen/x86_2injective_8h.html            |   137 +
 docs/api/doxygen/x86_2injective_8h__incl.svg       |  1285 ++
 docs/api/doxygen/x86_2injective_8h_source.html     |   117 +
 docs/api/javadoc/allclasses-frame.html             |    49 +
 docs/api/javadoc/allclasses-noframe.html           |    49 +
 docs/api/javadoc/constant-values.html              |   311 +
 docs/api/javadoc/deprecated-list.html              |   125 +
 docs/api/javadoc/help-doc.html                     |   230 +
 docs/api/javadoc/index-all.html                    |   985 ++
 docs/api/javadoc/index.html                        |    76 +
 docs/api/javadoc/org/apache/tvm/API.html           |   248 +
 docs/api/javadoc/org/apache/tvm/APIInternal.html   |   248 +
 .../javadoc/org/apache/tvm/Function.Callback.html  |   226 +
 docs/api/javadoc/org/apache/tvm/Function.html      |   698 ++
 docs/api/javadoc/org/apache/tvm/Module.html        |   508 +
 docs/api/javadoc/org/apache/tvm/NDArray.html       |   786 ++
 docs/api/javadoc/org/apache/tvm/NDArrayBase.html   |   381 +
 docs/api/javadoc/org/apache/tvm/TVMContext.html    |   700 ++
 docs/api/javadoc/org/apache/tvm/TVMType.html       |   475 +
 docs/api/javadoc/org/apache/tvm/TVMValue.html      |   403 +
 docs/api/javadoc/org/apache/tvm/TVMValueBytes.html |   331 +
 .../api/javadoc/org/apache/tvm/TVMValueDouble.html |   331 +
 .../api/javadoc/org/apache/tvm/TVMValueHandle.html |   328 +
 docs/api/javadoc/org/apache/tvm/TVMValueLong.html  |   331 +
 docs/api/javadoc/org/apache/tvm/TVMValueNull.html  |   265 +
 .../api/javadoc/org/apache/tvm/TVMValueString.html |   331 +
 docs/api/javadoc/org/apache/tvm/TypeCode.html      |   539 +
 docs/api/javadoc/org/apache/tvm/class-use/API.html |   125 +
 .../org/apache/tvm/class-use/APIInternal.html      |   125 +
 .../apache/tvm/class-use/Function.Callback.html    |   182 +
 .../javadoc/org/apache/tvm/class-use/Function.html |   351 +
 .../javadoc/org/apache/tvm/class-use/Module.html   |   253 +
 .../javadoc/org/apache/tvm/class-use/NDArray.html  |   286 +
 .../org/apache/tvm/class-use/NDArrayBase.html      |   211 +
 .../org/apache/tvm/class-use/TVMContext.html       |   404 +
 .../javadoc/org/apache/tvm/class-use/TVMType.html  |   176 +
 .../javadoc/org/apache/tvm/class-use/TVMValue.html |   245 +
 .../org/apache/tvm/class-use/TVMValueBytes.html    |   125 +
 .../org/apache/tvm/class-use/TVMValueDouble.html   |   125 +
 .../org/apache/tvm/class-use/TVMValueHandle.html   |   125 +
 .../org/apache/tvm/class-use/TVMValueLong.html     |   125 +
 .../org/apache/tvm/class-use/TVMValueNull.html     |   125 +
 .../org/apache/tvm/class-use/TVMValueString.html   |   125 +
 .../javadoc/org/apache/tvm/class-use/TypeCode.html |   198 +
 .../org/apache/tvm/contrib/GraphModule.html        |   464 +
 .../org/apache/tvm/contrib/GraphRuntime.html       |   287 +
 .../apache/tvm/contrib/class-use/GraphModule.html  |   195 +
 .../apache/tvm/contrib/class-use/GraphRuntime.html |   125 +
 .../org/apache/tvm/contrib/package-frame.html      |    21 +
 .../org/apache/tvm/contrib/package-summary.html    |   149 +
 .../org/apache/tvm/contrib/package-tree.html       |   139 +
 .../org/apache/tvm/contrib/package-use.html        |   160 +
 docs/api/javadoc/org/apache/tvm/package-frame.html |    42 +
 .../javadoc/org/apache/tvm/package-summary.html    |   243 +
 docs/api/javadoc/org/apache/tvm/package-tree.html  |   174 +
 docs/api/javadoc/org/apache/tvm/package-use.html   |   253 +
 docs/api/javadoc/org/apache/tvm/rpc/Client.html    |   312 +
 .../tvm/rpc/ConnectProxyServerProcessor.html       |   337 +
 .../tvm/rpc/ConnectTrackerServerProcessor.html     |   441 +
 .../org/apache/tvm/rpc/NativeServerLoop.html       |   292 +
 .../org/apache/tvm/rpc/RPC.TrackerCode.html        |   333 +
 docs/api/javadoc/org/apache/tvm/rpc/RPC.html       |   365 +
 .../api/javadoc/org/apache/tvm/rpc/RPCSession.html |   669 ++
 .../javadoc/org/apache/tvm/rpc/RPCWatchdog.html    |   364 +
 docs/api/javadoc/org/apache/tvm/rpc/Server.html    |   329 +
 .../org/apache/tvm/rpc/ServerProcessor.html        |   239 +
 .../javadoc/org/apache/tvm/rpc/SocketChannel.html  |   251 +
 .../apache/tvm/rpc/StandaloneServerProcessor.html  |   304 +
 .../org/apache/tvm/rpc/TVMRemoteContext.html       |   259 +
 .../org/apache/tvm/rpc/class-use/Client.html       |   125 +
 .../rpc/class-use/ConnectProxyServerProcessor.html |   125 +
 .../class-use/ConnectTrackerServerProcessor.html   |   125 +
 .../apache/tvm/rpc/class-use/NativeServerLoop.html |   125 +
 .../apache/tvm/rpc/class-use/RPC.TrackerCode.html  |   125 +
 .../javadoc/org/apache/tvm/rpc/class-use/RPC.html  |   125 +
 .../org/apache/tvm/rpc/class-use/RPCSession.html   |   189 +
 .../org/apache/tvm/rpc/class-use/RPCWatchdog.html  |   168 +
 .../org/apache/tvm/rpc/class-use/Server.html       |   125 +
 .../apache/tvm/rpc/class-use/ServerProcessor.html  |   179 +
 .../apache/tvm/rpc/class-use/SocketChannel.html    |   125 +
 .../rpc/class-use/StandaloneServerProcessor.html   |   125 +
 .../apache/tvm/rpc/class-use/TVMRemoteContext.html |   125 +
 .../javadoc/org/apache/tvm/rpc/package-frame.html  |    34 +
 .../org/apache/tvm/rpc/package-summary.html        |   214 +
 .../javadoc/org/apache/tvm/rpc/package-tree.html   |   165 +
 .../javadoc/org/apache/tvm/rpc/package-use.html    |   170 +
 docs/api/javadoc/overview-frame.html               |    23 +
 docs/api/javadoc/overview-summary.html             |   147 +
 docs/api/javadoc/overview-tree.html                |   202 +
 docs/api/javadoc/package-list                      |     3 +
 docs/api/javadoc/script.js                         |    30 +
 docs/api/javadoc/stylesheet.css                    |   574 +
 docs/api/links.html                                |   251 +
 docs/api/python/autotvm.html                       |  2458 ++++
 docs/api/python/contrib.html                       |  1455 +++
 docs/api/python/driver.html                        |   369 +
 docs/api/python/error.html                         |   442 +
 docs/api/python/graph_runtime.html                 |   459 +
 docs/api/python/index.html                         |   349 +
 docs/api/python/ir.html                            |  1741 +++
 docs/api/python/ndarray.html                       |   428 +
 docs/api/python/relay/analysis.html                |   875 ++
 docs/api/python/relay/backend.html                 |   705 ++
 docs/api/python/relay/frontend.html                |   532 +
 docs/api/python/relay/image.html                   |   500 +
 docs/api/python/relay/index.html                   |  4142 +++++++
 docs/api/python/relay/nn.html                      |  2458 ++++
 docs/api/python/relay/testing.html                 |   896 ++
 docs/api/python/relay/transform.html               |  1210 ++
 docs/api/python/relay/vision.html                  |   535 +
 docs/api/python/rpc.html                           |   792 ++
 docs/api/python/runtime.html                       |  1163 ++
 docs/api/python/target.html                        |   857 ++
 docs/api/python/te.html                            |  2799 +++++
 docs/api/python/tir.html                           |  4080 +++++++
 docs/api/python/topi.html                          |  2623 +++++
 docs/api/python/vta/index.html                     |   414 +
 docs/api/typedoc/assets/css/main.css               |  2679 +++++
 docs/api/typedoc/assets/images/icons.png           |   Bin 0 -> 9615 bytes
 docs/api/typedoc/assets/images/icons@2x.png        |   Bin 0 -> 28144 bytes
 docs/api/typedoc/assets/images/widgets.png         |   Bin 0 -> 480 bytes
 docs/api/typedoc/assets/images/widgets@2x.png      |   Bin 0 -> 855 bytes
 docs/api/typedoc/assets/js/main.js                 |     1 +
 docs/api/typedoc/assets/js/search.json             |     1 +
 docs/api/typedoc/classes/bytestreamreader.html     |   278 +
 docs/api/typedoc/classes/cachedcallstack.html      |   718 ++
 docs/api/typedoc/classes/dlcontext.html            |   278 +
 docs/api/typedoc/classes/dldatatype.html           |   292 +
 docs/api/typedoc/classes/environment.html          |   337 +
 docs/api/typedoc/classes/ffilibrary.html           |   371 +
 docs/api/typedoc/classes/graphruntime.html         |   434 +
 docs/api/typedoc/classes/instance.html             |   918 ++
 docs/api/typedoc/classes/memory.html               |   631 +
 docs/api/typedoc/classes/module.html               |   323 +
 docs/api/typedoc/classes/ndarray.html              |   443 +
 docs/api/typedoc/classes/packedfunccell.html       |   231 +
 docs/api/typedoc/classes/rpcserver.html            |   338 +
 docs/api/typedoc/classes/scalar.html               |   221 +
 docs/api/typedoc/classes/webgpucontext.html        |   319 +
 docs/api/typedoc/enums/aynccallbackcode.html       |   164 +
 docs/api/typedoc/enums/rpcserverstate.html         |   213 +
 docs/api/typedoc/enums/sizeof.html                 |   262 +
 docs/api/typedoc/enums/typecode.html               |   346 +
 docs/api/typedoc/index.html                        |  1951 ++++
 docs/api/typedoc/interfaces/disposable.html        |   193 +
 docs/api/typedoc/interfaces/functioninfo.html      |   179 +
 docs/api/typedoc/interfaces/libraryprovider.html   |   219 +
 docs/contribute/code_guide.html                    |   329 +
 docs/contribute/code_review.html                   |   348 +
 docs/contribute/committer_guide.html               |   342 +
 docs/contribute/community.html                     |   284 +
 docs/contribute/document.html                      |   351 +
 docs/contribute/error_handling.html                |   356 +
 docs/contribute/git_howto.html                     |   364 +
 docs/contribute/index.html                         |   348 +
 docs/contribute/pull_request.html                  |   369 +
 docs/contribute/release_process.html               |   395 +
 docs/deploy/android.html                           |   275 +
 docs/deploy/cpp_deploy.html                        |   285 +
 docs/deploy/hls.html                               |   415 +
 docs/deploy/index.html                             |   311 +
 docs/deploy/integrate.html                         |   297 +
 docs/dev/benchmark.html                            |   451 +
 docs/dev/codebase_walkthrough.html                 |   424 +
 docs/dev/convert_layout.html                       |   489 +
 docs/dev/debugger.html                             |   417 +
 docs/dev/hybrid_script.html                        |   338 +
 docs/dev/index.html                                |   366 +
 docs/dev/inferbound.html                           |   882 ++
 docs/dev/introduction_to_module_serialization.html |   449 +
 docs/dev/relay_add_op.html                         |   492 +
 docs/dev/relay_add_pass.html                       |   606 +
 docs/dev/relay_bring_your_own_codegen.html         |  1092 ++
 docs/dev/relay_intro.html                          |   428 +
 docs/dev/relay_op_strategy.html                    |   491 +
 docs/dev/relay_pass_infra.html                     |   827 ++
 docs/dev/runtime.html                              |   490 +
 docs/dev/security.html                             |   286 +
 docs/dev/virtual_machine.html                      |   604 +
 docs/faq.html                                      |   296 +
 docs/frontend/tensorflow.html                      |   479 +
 docs/genindex.html                                 |  3789 ++++++
 docs/index.html                                    |   341 +
 docs/install/docker.html                           |   294 +
 docs/install/from_source.html                      |   470 +
 docs/install/index.html                            |   270 +
 docs/install/nnpack.html                           |   340 +
 docs/langref/hybrid_script.html                    |   433 +
 docs/langref/index.html                            |   343 +
 docs/langref/relay_adt.html                        |   715 ++
 docs/langref/relay_expr.html                       |   829 ++
 docs/langref/relay_op.html                         |   737 ++
 docs/langref/relay_pattern.html                    |   368 +
 docs/langref/relay_type.html                       |   567 +
 docs/objects.inv                                   |   Bin 0 -> 14238 bytes
 docs/py-modindex.html                              |   613 +
 docs/search.html                                   |   249 +
 docs/searchindex.js                                |     1 +
 docs/tutorials/autotvm/sg_execution_times.html     |   243 +
 docs/tutorials/autotvm/tune_conv2d_cuda.html       |   530 +
 docs/tutorials/autotvm/tune_relay_arm.html         |   635 +
 docs/tutorials/autotvm/tune_relay_cuda.html        |   612 +
 docs/tutorials/autotvm/tune_relay_mobile_gpu.html  |   637 +
 docs/tutorials/autotvm/tune_relay_x86.html         |   495 +
 docs/tutorials/autotvm/tune_simple_template.html   |   591 +
 docs/tutorials/cross_compilation_and_rpc.html      |   509 +
 docs/tutorials/dev/low_level_custom_pass.html      |   451 +
 docs/tutorials/dev/relay_pass_infra.html           |   636 +
 docs/tutorials/dev/sg_execution_times.html         |   239 +
 docs/tutorials/frontend/build_gcn.html             |   671 ++
 .../frontend/deploy_model_on_android.html          |   622 +
 docs/tutorials/frontend/deploy_model_on_rasp.html  |   498 +
 docs/tutorials/frontend/deploy_prequantized.html   |   543 +
 .../frontend/deploy_prequantized_tflite.html       |   537 +
 docs/tutorials/frontend/deploy_quantized.html      |   440 +
 docs/tutorials/frontend/deploy_ssd_gluoncv.html    |   493 +
 docs/tutorials/frontend/from_caffe2.html           |   420 +
 docs/tutorials/frontend/from_coreml.html           |   402 +
 docs/tutorials/frontend/from_darknet.html          |   511 +
 docs/tutorials/frontend/from_keras.html            |   403 +
 docs/tutorials/frontend/from_mxnet.html            |   423 +
 docs/tutorials/frontend/from_onnx.html             |   403 +
 docs/tutorials/frontend/from_pytorch.html          |   459 +
 docs/tutorials/frontend/from_tensorflow.html       |   560 +
 docs/tutorials/frontend/from_tflite.html           |   474 +
 docs/tutorials/frontend/sg_execution_times.html    |   254 +
 docs/tutorials/frontend/using_external_lib.html    |   842 ++
 docs/tutorials/index.html                          |   572 +
 docs/tutorials/language/extern_op.html             |   395 +
 docs/tutorials/language/intrin_math.html           |   490 +
 docs/tutorials/language/reduction.html             |   612 +
 docs/tutorials/language/scan.html                  |   496 +
 docs/tutorials/language/schedule_primitives.html   |   686 ++
 docs/tutorials/language/sg_execution_times.html    |   245 +
 docs/tutorials/language/tedd.html                  |   401 +
 docs/tutorials/language/tensorize.html             |   729 ++
 docs/tutorials/language/tuple_inputs.html          |   449 +
 docs/tutorials/optimize/opt_conv_cuda.html         |   483 +
 docs/tutorials/optimize/opt_conv_tensorcore.html   |   773 ++
 docs/tutorials/optimize/opt_gemm.html              |   873 ++
 .../optimize/opt_matmul_auto_tensorcore.html       |   784 ++
 docs/tutorials/optimize/sg_execution_times.html    |   241 +
 docs/tutorials/relay_quick_start.html              |   576 +
 docs/tutorials/sg_execution_times.html             |   240 +
 docs/tutorials/tensor_expr_get_started.html        |   578 +
 docs/tutorials/topi/intro_topi.html                |   791 ++
 docs/tutorials/topi/sg_execution_times.html        |   238 +
 docs/vta/dev/config.html                           |   350 +
 docs/vta/dev/hardware.html                         |   526 +
 docs/vta/dev/index.html                            |   274 +
 docs/vta/index.html                                |   276 +
 docs/vta/install.html                              |   658 ++
 docs/vta/tutorials/autotvm/sg_execution_times.html |   238 +
 docs/vta/tutorials/autotvm/tune_relay_vta.html     |   842 ++
 .../tutorials/frontend/deploy_classification.html  |   580 +
 docs/vta/tutorials/frontend/deploy_detection.html  |   615 +
 .../vta/tutorials/frontend/sg_execution_times.html |   239 +
 docs/vta/tutorials/index.html                      |   324 +
 docs/vta/tutorials/matrix_multiply.html            |   861 ++
 docs/vta/tutorials/optimize/convolution_opt.html   |  1019 ++
 .../tutorials/optimize/matrix_multiply_opt.html    |   856 ++
 .../vta/tutorials/optimize/sg_execution_times.html |   239 +
 docs/vta/tutorials/sg_execution_times.html         |   239 +
 docs/vta/tutorials/vta_get_started.html            |   716 ++
 download.html                                      |   252 +
 images/android_rpc/app.png                         |   Bin 0 -> 254593 bytes
 images/android_rpc/app_error.png                   |   Bin 0 -> 278170 bytes
 images/android_rpc/arch.png                        |   Bin 0 -> 47147 bytes
 images/android_rpc/flow1.png                       |   Bin 0 -> 22077 bytes
 images/android_rpc/flow2.png                       |   Bin 0 -> 16710 bytes
 images/autotune-all/amd.png                        |   Bin 0 -> 51573 bytes
 images/autotune-all/arm.png                        |   Bin 0 -> 52362 bytes
 images/autotune-all/autotvm.png                    |   Bin 0 -> 96078 bytes
 images/autotune-all/mali.png                       |   Bin 0 -> 40033 bytes
 images/autotune-all/nvidia.png                     |   Bin 0 -> 63880 bytes
 images/autotune-all/overview.png                   |   Bin 0 -> 100527 bytes
 images/bring-your-own-datatypes/lowering.png       |   Bin 0 -> 155592 bytes
 images/community/alicloud.png                      |   Bin 0 -> 20301 bytes
 images/community/amd.png                           |   Bin 0 -> 8823 bytes
 images/community/arm.png                           |   Bin 0 -> 2050 bytes
 images/community/aws.png                           |   Bin 0 -> 32934 bytes
 images/community/cornell.svg                       |   232 +
 images/community/edgecortix.png                    |   Bin 0 -> 94207 bytes
 images/community/fb.png                            |   Bin 0 -> 25039 bytes
 images/community/huawei.png                        |   Bin 0 -> 7913 bytes
 images/community/intel.png                         |   Bin 0 -> 4489 bytes
 images/community/microsoft.png                     |   Bin 0 -> 24164 bytes
 images/community/nvidia.png                        |   Bin 0 -> 48816 bytes
 images/community/oasislabs.png                     |   Bin 0 -> 37771 bytes
 images/community/octoml.svg                        |     1 +
 images/community/ucberkeley.png                    |   Bin 0 -> 32071 bytes
 images/community/ucla.png                          |   Bin 0 -> 45279 bytes
 images/community/uwcse.png                         |   Bin 0 -> 19344 bytes
 images/community/xilinx.png                        |   Bin 0 -> 12702 bytes
 images/cuda-quantized/benchmark.svg                |   678 ++
 images/cuda-quantized/conv2d.png                   |   Bin 0 -> 166087 bytes
 images/cuda-quantized/workflow.png                 |   Bin 0 -> 76962 bytes
 images/depthconv_tutorial/GPU_memory_hierarchy.png |   Bin 0 -> 218921 bytes
 images/depthconv_tutorial/bank_conflicts.png       |   Bin 0 -> 55248 bytes
 images/depthconv_tutorial/conv_and_depthconv.png   |   Bin 0 -> 189241 bytes
 images/depthconv_tutorial/no_tiling.png            |   Bin 0 -> 117108 bytes
 images/depthconv_tutorial/tf_compare.png           |   Bin 0 -> 44260 bytes
 images/depthconv_tutorial/tiling.png               |   Bin 0 -> 83580 bytes
 .../vthread_and_strided_pattern.png                |   Bin 0 -> 45323 bytes
 images/docs/inferbound/gatherbound.png             |   Bin 0 -> 25803 bytes
 images/docs/inferbound/gatherbound_problem.png     |   Bin 0 -> 7684 bytes
 images/docs/inferbound/inferbound_phases.png       |   Bin 0 -> 33197 bytes
 images/docs/inferbound/inferbound_traversal.png    |   Bin 0 -> 14670 bytes
 images/docs/inferbound/passupdomain_div.png        |   Bin 0 -> 9869 bytes
 images/docs/inferbound/passupdomain_min.png        |   Bin 0 -> 12572 bytes
 images/docs/inferbound/passupdomain_nodiv.png      |   Bin 0 -> 12907 bytes
 images/docs/inferbound/passupdomain_problem.png    |   Bin 0 -> 17530 bytes
 images/docs/inferbound/relations.png               |   Bin 0 -> 23321 bytes
 images/docs/inferbound/stage_graph.png             |   Bin 0 -> 13909 bytes
 images/docs/inferbound/union.png                   |   Bin 0 -> 3135 bytes
 images/golang/TVM-Golang-Blog.png                  |   Bin 0 -> 25895 bytes
 images/golang/TVM-Golang-Flow.png                  |   Bin 0 -> 95181 bytes
 images/logo/tvm-banner-left-objs-white.svg         |   380 +
 images/logo/tvm-banner-right-objs-white.svg        |   205 +
 images/logo/tvm-logo-small-black.png               |   Bin 0 -> 13941 bytes
 images/logo/tvm-logo-small.png                     |   Bin 0 -> 13281 bytes
 images/logo/tvm-logo-square.png                    |   Bin 0 -> 3453 bytes
 images/logo/tvm-logo.eps                           |   Bin 0 -> 16890811 bytes
 images/logo/tvm-logo.png                           |   Bin 0 -> 135763 bytes
 images/low-precision/binary-dotproduct.png         |   Bin 0 -> 9661 bytes
 images/low-precision/bitpack.png                   |   Bin 0 -> 28898 bytes
 images/low-precision/bitserial-dotproduct.png      |   Bin 0 -> 21066 bytes
 images/low-precision/rasp-conv-2.png               |   Bin 0 -> 31496 bytes
 images/low-precision/rasp-conv.png                 |   Bin 0 -> 56752 bytes
 images/low-precision/workflow.png                  |   Bin 0 -> 52660 bytes
 images/low-precision/x86-conv.png                  |   Bin 0 -> 58302 bytes
 images/main/stack_tvmlang.png                      |   Bin 0 -> 191187 bytes
 images/main/tvm-stack.png                          |   Bin 0 -> 201190 bytes
 images/nmt-transformer/batch-matmul-bar-charts.png |   Bin 0 -> 16477 bytes
 images/nmt-transformer/batchmatmul.png             |   Bin 0 -> 126410 bytes
 images/nmt-transformer/model_arch.png              |   Bin 0 -> 150011 bytes
 images/nnvm/nnvm_compiler_code.png                 |   Bin 0 -> 150107 bytes
 images/nnvm/nnvm_compiler_stack.png                |   Bin 0 -> 145657 bytes
 images/nnvm/nnvm_deploy.png                        |   Bin 0 -> 174628 bytes
 images/nnvm/nnvm_k80_result.png                    |   Bin 0 -> 40529 bytes
 images/nnvm/nnvm_rasp_result.png                   |   Bin 0 -> 45314 bytes
 images/opengl/comparison.png                       |   Bin 0 -> 48992 bytes
 images/opengl/opengl-benchmark.png                 |   Bin 0 -> 14876 bytes
 images/opengl/webgl-flow.png                       |   Bin 0 -> 37250 bytes
 images/opt-mali/end2end.png                        |   Bin 0 -> 108291 bytes
 images/opt-mali/mali-arch.png                      |   Bin 0 -> 27153 bytes
 images/pytorch-dlpack/dlpack.png                   |   Bin 0 -> 590212 bytes
 images/relay/dataflow.png                          |   Bin 0 -> 23618 bytes
 images/relay/dataflow_vs_func.png                  |   Bin 0 -> 72025 bytes
 images/relay/let_scope.png                         |   Bin 0 -> 20807 bytes
 images/release/code_highlevel.png                  |   Bin 0 -> 144900 bytes
 images/release/computational_graph.png             |   Bin 0 -> 39760 bytes
 images/release/end_to_end_stack.png                |   Bin 0 -> 125810 bytes
 images/release/gap.png                             |   Bin 0 -> 364712 bytes
 images/release/gpu_mobilenet.png                   |   Bin 0 -> 63162 bytes
 images/release/nnvm_gap.png                        |   Bin 0 -> 321147 bytes
 images/release/resnet_rasp.png                     |   Bin 0 -> 128945 bytes
 images/release/tvm_backends.png                    |   Bin 0 -> 91358 bytes
 images/release/tvm_dsl.png                         |   Bin 0 -> 117338 bytes
 images/release/tvm_flexible.png                    |   Bin 0 -> 192781 bytes
 images/release/tvm_rpc.png                         |   Bin 0 -> 172825 bytes
 images/rocm/butterfly.png                          |   Bin 0 -> 270847 bytes
 images/rocm/cat.png                                |   Bin 0 -> 140740 bytes
 images/rocm/rocm_workflow.png                      |   Bin 0 -> 182323 bytes
 images/rocm/tvm_rocm_overview.png                  |   Bin 0 -> 182111 bytes
 images/sgx/dp.png                                  |   Bin 0 -> 47041 bytes
 images/sgx/dpnn.png                                |   Bin 0 -> 41091 bytes
 images/sgx/sgx.png                                 |   Bin 0 -> 87507 bytes
 images/sgx/tvmfits.png                             |   Bin 0 -> 79224 bytes
 images/webgpu/ml-compiler-flow.png                 |   Bin 0 -> 197380 bytes
 images/webgpu/tvm-wasm-stack.png                   |   Bin 0 -> 412428 bytes
 images/webgpu/webgpu-mobilenet-perf.png            |   Bin 0 -> 90966 bytes
 index.html                                         |   201 +
 index.md                                           |    37 -
 rss.xml                                            |  3987 ++++++-
 schedule.md                                        |    35 -
 serve_local.sh                                     |     3 -
 sitemap.txt                                        |    41 +-
 tags.html                                          |   217 +-
 vta.html                                           |   217 +
 4156 files changed, 900246 insertions(+), 3656 deletions(-)

diff --git a/.gitignore b/.gitignore
index b25c15b..7aaaff4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,7 @@
 *~
+_site
+.DS_Store
+website.tgz
+*.bak
+.jekyll-cache
+docs.tgz
diff --git a/2017/08/17/tvm-release-announcement.html b/2017/08/17/tvm-release-announcement.html
new file mode 100644
index 0000000..2271f91
--- /dev/null
+++ b/2017/08/17/tvm-release-announcement.html
@@ -0,0 +1,320 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>TVM: An End to End IR Stack for Deploying Deep Learning Workloads on Hardware Platforms</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>TVM: An End to End IR Stack for Deploying Deep Learning Workloads on Hardware Platforms </h1>
+      <p class="post-meta">
+        <time datetime="2017-08-17T12:00:00-07:00" itemprop="datePublished">
+          Aug 17, 2017
+        </time>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p style="text-align: center">Tianqi Chen(project lead), Thierry Moreau(hardware stack), Ziheng Jiang†(graph compilation), Haichen Shen(gpu optimization)</p>
+<p style="text-align: center">Advisors: Luis Ceze, Carlos Guestrin, Arvind Krishnamurthy</p>
+<p style="text-align: center">Paul G. Allen School of Computer Science &amp; Engineering, University of Washington</p>
+<p style="text-align: center">DMLC open-source community</p>
+<p style="text-align: center">†Amazon Web Service</p>
+
+<p>Deep learning has become ubiquitous and indispensable.  Part of this revolution has been fueled by scalable deep learning systems, such as TensorFlow, MXNet, Caffe and PyTorch. Most existing systems are optimized for a narrow range of server-class GPUs, and require significant effort be deployed on other platforms such as mobile phones, IoT devices and specialized accelerators (FPGAs, ASICs). As the number of deep learning frameworks and hardware backends increase, we propose a unifie [...]
+
+<p style="text-align: center"><img src="/images/release/gap.png" alt="image" width="512px" /></p>
+<p>We are excited to announce the launch of TVM as solution to this problem. TVM is  a novel framework that can:</p>
+
+<ul>
+  <li>Represent and optimize the common deep learning computation workloads for CPUs, GPUs and other specialized hardware</li>
+  <li>Automatically transform the computation graph to minimize memory utilization, optimize data layout and fuse computation patterns</li>
+  <li>Provide an end-to-end compilation from existing front-end frameworks down to bare-metal hardware, all the way up to browser executable javascripts.</li>
+</ul>
+
+<p>With the help of TVM, we can easily run deep learning workloads on mobile phones, embedded devices and even the browser with little additional effort. TVM also provides a unified optimization framework for deep learning workloads on a multitude of hardware platforms, including specialized accelerators that rely on novel computational primitives.</p>
+
+<p style="text-align: center"><img src="/images/release/end_to_end_stack.png" alt="image" width="512px" /></p>
+
+<p>We adopt a common philosophy from the compiler community and provide two intermediate representation layers to efficiently lower high-level deep learning algorithms down to a multitude of hardware back-ends.</p>
+
+<p>In today’s release, we open-source TVM package that contains optimization primitives for x86, ARM, OpenCL, Metal, CUDA and Javascript. We are actively working on adding support for specialized hardware acceleration and Nvidia’s GEMM-optimized Volta architecture.</p>
+
+<h2 id="technical-details">Technical Details</h2>
+
+<p>The goal of TVM stack is to provide a reusable toolchain to compile high-level neural network descriptions from deep learning framework frontends down to low-level machine code for multiple hardware backends. Take Apache MXNet as a front-end example, the following code snippet demonstrates how can TVM be used to compile a high-level description of a deep learning model to an optimized executable module tailored to the target hardware.</p>
+
+<p style="text-align: center"><img src="/images/release/code_highlevel.png" alt="image" width="800px" /></p>
+
+<p>The challenge lies in enabling support for multiple hardware back-ends while keeping compute, memory and energy footprints at their lowest. We borrow wisdom from the compiler community in order to bridge the gap between the multitude of deep learning frameworks and hardware back-ends: we build a two-level intermediate layer composed of NNVM, a high-level intermediate representation (IR) for task scheduling and memory management, and TVM, an expressive low-level IR for optimizing compu [...]
+
+<p>The first level of the stack is a computational graph based representation. A computation graph is a directed acyclic graph that represent computation as nodes and dataflow dependency as edges. This representation is very powerful: it allows us to bake operation attributes into the computation graph and specify transformation rules to iteratively optimize a computation graph. This is a common approach taken by most of the existing deep learning frameworks, including the NNVM graph rep [...]
+
+<p style="text-align: center"><img src="/images/release/computational_graph.png" alt="image" width="300px" /></p>
+
+<p>A lot of powerful optimizations can be supported by the graph optimization framework. For example, we provided a sublinear memory optimization functionality that allows user to train 1000 layers of ImageNet ResNet on a single GPU.</p>
+
+<p style="text-align: center"><img src="/images/release/nnvm_gap.png" alt="image" width="512px" /></p>
+
+<p>However, we find that the computational graph based IR alone is not enough to solve the challenge of supporting different hardware backends. The reason being that a single graph operator like convolution or matrix multiplication may be mapped and optimized in very different ways for each hardware back-end. These hardware-specific optimizations can vary drastically in terms of memory layout, parallelization threading patterns, caching access patterns and choice of hardware primitives.  [...]
+
+<p>We build a low level representation to solve this problem. This representation is based on index formula, with additional support for recurrence computation.</p>
+
+<p style="text-align: center"><img src="/images/release/tvm_dsl.png" alt="image" width="700px" /></p>
+
+<p>The low level IR adopt principles from existing image processing languages like Halide or darkroom to formulate an expressive deep learning DSL. TVM builds low level optimizations inspired by loop transformation tools like loopy and polyhedra-based analysis. We also draw inspiration from the dataflow description languages used in deep learning frameworks like MXNet, TensorFlow, Theano. The algorithms described in TVM are then processed in a scheduling phase to apply transformations th [...]
+
+<p style="text-align: center"><img src="/images/release/tvm_backends.png" alt="image" width="600px" /></p>
+
+<p>TVM includes standard transformation primitives commonly found in CPU optimization frameworks. More importantly, TVM incorporates novel optimization primitives targeted at GPUs, by exploiting thread cooperation patterns, data layout transformations and powerful new compute primitives. Using TVM in combination with NNVM provides an rich opportunity to optimize deep learning workloads across the software stack, enabling joint compute graph-level and operator-level optimizations.</p>
+
+<h3 id="multi-language-and-platform-support">Multi-language and Platform Support</h3>
+
+<p>One of the many strength of TVM lies in its rich support for multiple platforms and languages. We present two components of the framework: the compiler stack which contains complete optimization libraries to produce optimized machine code, and the runtime which is lightweight and offers the portability required to deploy the compiled modules on different platforms.</p>
+
+<p style="text-align: center"><img src="/images/release/tvm_flexible.png" alt="image" width="600px" /></p>
+
+<p>TVM currently support a python and C++ interface to the embedded compiler stack. We design the framework with maximum re-use in mind, so that the compiler stack improvements can be applied interchangeably between the Python and C++ components.</p>
+
+<p>We also provide a lightweight runtime that can directly run TVM compiled code in languages such as javascript, java, python, and c++ on platforms including android, iOS, raspberry pi and web browsers.</p>
+
+<h3 id="remote-deployment-and-execution">Remote Deployment and Execution</h3>
+
+<p style="text-align: center"><img src="/images/release/tvm_rpc.png" alt="image" width="500px" /></p>
+
+<p>TVM supports cross-compilation for and testing embedded devices with TVM RPC, a lightweight interface to deploy and execute TVM cross-compiled modules on a remote embedded device. This provides a familiar high-level Python interface to the TVM user to compile, optimize and test deep learning algorithms remotely on various low-level embedded devices.</p>
+
+<h2 id="performance">Performance</h2>
+
+<p>TVM is still in an early stage of development and we can expect more improvements to come, but we have started to see very promising results, which are discussed in this section.</p>
+
+<p>TVM gives us the flexibility to explore the rich optimization space of various deep learning kernels, for multiple hardware platforms. For instance, TVM allows us to tailor data layout and fused pattern requirements for the kernels and platforms that we most care about.  Please note that the baseline libraries are created for more general purpose problems, while TVM’s optimized kernels are heavily tuned for the workloads we evaluated via an auto-tuning process. TVM serves as a bridge  [...]
+
+<p>The results listed in this section are still work in progress, and there is room for improvement.</p>
+
+<h3 id="raspberry-pi">Raspberry Pi</h3>
+
+<p>In the first part of result we compared the TVM CPU schedule to nnpack on a raspberry Pi 3B executing a resnet workload. Due to limited time, we utilized TVM to implemented the direct convolution while nnpack was used to perform winograd conv for 3x3 kernels.</p>
+
+<p style="text-align: center"><img src="/images/release/resnet_rasp.png" alt="image" width="500px" /></p>
+
+<p>We can find that with TVM’s autotuned kernels, we can obtain performance similar to the hand-optimized kernels in nnpack for the raspberry pi experiments.</p>
+
+<h3 id="gpu-results">GPU Results</h3>
+<p><strong>Author Credit</strong> These benchmarks and corresponding schedule optimizations are created by our contributors:  <a href="http://www.ece.ucdavis.edu/~laurawly/">Leyuan Wang</a> (AWS / UCDavis), <a href="http://huyuwei.github.io">Yuwei Hu</a>(TuSimple) and Weitang Liu (AWS/ UCDavis). They deserve all the credits.</p>
+
+<p>As a proof of concept, we created an end to end compilation pipeline that can compile MxNet models down to TVM execution graphs. We apply optimization within and between graph nodes by automatically fusing operators together and letting TVM generate the fused kernels.
+We benchmarked the mobilenet ImageNet workload, and discuss the results below:</p>
+
+<p style="text-align: center"><img src="/images/release/gpu_mobilenet.png" alt="image" width="600px" /></p>
+
+<p>We can find that TVM can outperform our baseline method in terms of speed. More interestingly, the kernel fusion brings additional speedup. It is worth mentioning that TVM generates all the optimized GPU kernels on its own without relying on external libraries like CuDNN.</p>
+
+<p>We are working on more experiments and will release new results as they are obtained.</p>
+
+<h2 id="open-source-effort">Open Source Effort</h2>
+<p>TVM started as a research project of Paul G. Allen School Computer Science and Engineering at University of Washington. The TVM stack is designed to support <a href="https://github.com/dmlc/dlpack">DLPack</a>, a consensus on tensor data structure by multiple major deep learning frameworks. We have received early contributions from from UW, AWS, Qiho 360, Facebook, HKUST, TuSimple, UCDavis, SJTU as well members of DMLC open-source community and DLPack initiative. Going forward, the pro [...]
+
+<h2 id="acknowledgement">Acknowledgement</h2>
+<p>This project wouldn’t become possible without our early contributors. We would like to thank Yizhi Liu(Qihoo 360), Yuwei Hu(TuSimple),
+Xingjian Shi(HKUST), Leyuan Wang(AWS/UCDavis), Nicolas Vasilache(Facebook), Jian Weng(UCLA), Weitang Liu(AWS/UCDavis), Edward Z. Yang(Facebook),
+Lianmin Zheng(SJTU), Qiao Zhang(UW), William Moses(Facebook/MIT) and Hu Shiwen. The author would also like to thank Xianyi Zhang(PerfXLab) for helpful discussions.</p>
+
+<p>We also learnt a lot from the following projects when building TVM.</p>
+<ul>
+  <li><a href="https://github.com/halide/Halide">Halide</a>: TVM uses <a href="https://github.com/dmlc/HalideIR">HalideIR</a> as data structure for
+arithematic simplification and low level lowering. HalideIR is derived from Halide.
+We also learns from Halide when implementing the lowering pipeline in TVM.</li>
+  <li><a href="https://github.com/inducer/loopy">Loopy</a>: use of integer set analysis and its loop transformation primitives.</li>
+  <li><a href="https://github.com/Theano/Theano">Theano</a>: the design inspiration of symbolic scan operator for recurrence.</li>
+</ul>
+
+<h2 id="source-code">Source code</h2>
+<ul>
+  <li>Github page can be found here: <a href="https://github.com/dmlc/tvm">https://github.com/dmlc/tvm</a></li>
+  <li>TVM is <a href="https://github.com/dmlc/dlpack">DLPack</a> compatible, which makes it easy to support frameworks
+that adopts the standard, such as MXNet, PyTorch, Caffe2 and tiny-dnn.</li>
+</ul>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2017/08/22/Optimize-Deep-Learning-GPU-Operators-with-TVM-A-Depthwise-Convolution-Example.html b/2017/08/22/Optimize-Deep-Learning-GPU-Operators-with-TVM-A-Depthwise-Convolution-Example.html
new file mode 100644
index 0000000..0848819
--- /dev/null
+++ b/2017/08/22/Optimize-Deep-Learning-GPU-Operators-with-TVM-A-Depthwise-Convolution-Example.html
@@ -0,0 +1,775 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Optimize Deep Learning GPU Operators with TVM: A Depthwise Convolution Example</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Optimize Deep Learning GPU Operators with TVM: A Depthwise Convolution Example </h1>
+      <p class="post-meta">
+        <time datetime="2017-08-22T00:00:00-07:00" itemprop="datePublished">
+          Aug 22, 2017
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Yuwei Hu</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>Efficient deep learning operators are at the core of deep learning systems.
+Usually these operators are hard to optimize and require great efforts of HPC experts.
+<a href="https://github.com/dmlc/tvm">TVM</a>, an end to end tensor IR/DSL stack, makes this much easier.</p>
+
+<p>This blog teaches you how to write high-performance GPU operator kernels with the help of TVM.
+We use depthwise convolution (i.e. <a href="http://docs.tvmlang.org/api/python/topi.html#topi.nn.depthwise_conv2d_nchw">topi.nn.depthwise_conv2d_nchw</a>) as an example,
+and demonstrate how we can improve over the already hand optimized CUDA kernel in tensorflow.
+Our final version is 2x-4x faster than the optimized kernel in tf-1.2 under different workloads, and 3x-7x faster with operator fusion enabled.
+Below is the result tested on GTX1080, with filter size = [1, 256, 3, 3], stride = [1, 1], padding = ‘SAME’:</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/tf_compare.png" alt="image" width="95%" /></p>
+
+<h2 id="introduction-to-depthwise-convolution">Introduction to Depthwise Convolution</h2>
+
+<p>Depthwise convolution is an important building block of modern architectures, such as Xception [1] and MobileNet [2].
+It’s an effective method to reduce the computation complexity of deep neural networks.</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/conv_and_depthconv.png" alt="image" width="80%" /></p>
+
+<p style="text-align: center">source: <a href="http://machinethink.net/blog/googles-mobile-net-architecture-on-iphone/">http://machinethink.net/blog/googles-mobile-net-architecture-on-iphone/</a></p>
+
+<p>In TVM, depthwise convolution can be declared as:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># padding stage
+</span><span class="n">PaddedInput</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span>
+    <span class="p">(</span><span class="n">batch</span><span class="p">,</span> <span class="n">in_channel</span><span class="p">,</span> <span class="n">height_after_pad</span><span class="p">,</span> <span class="n">width_after_pad</span><span class="p">),</span>
+    <span class="k">lambda</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">:</span> <span class="n">tvm</span><span class="o">.</span><span class="n">select</span><span class="p">(</span>
+        <span class="n">tvm</span><span class="o">.</span><span class="nb">all</span><span class="p">(</span><span class="n">i</span> <span class="o">&gt;=</span> <span class="n">pad_top</span><span class="p">,</span> <span class="n">i</span> <span class="o">-</span> <span class="n">pad_top</span> <span class="o">&lt;</span> <span class="n">in_height</span><span class="p">,</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="n">pad_left</span><span class="p">,</span [...]
+        <span class="n">Input</span><span class="p">[</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">i</span> <span class="o">-</span> <span class="n">pad_top</span><span class="p">,</span> <span class="n">j</span> <span class="o">-</span> <span class="n">pad_left</span><span class="p">],</span> <span class="n">tvm</span><span class="o">.</span><span class="n">const</span><span class="p">(</span><span class="mf">0.0 [...]
+    <span class="n">name</span><span class="o">=</span><span class="s">"PaddedInput"</span><span class="p">)</span>
+<span class="c1"># depthconv stage
+</span><span class="n">di</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">filter_height</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'di'</span><span class="p">)</span>
+<span class="n">dj</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">filter_width</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'dj'</span><span class="p">)</span>
+<span class="n">Output</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span>
+    <span class="p">(</span><span class="n">batch</span><span class="p">,</span> <span class="n">out_channel</span><span class="p">,</span> <span class="n">out_height</span><span class="p">,</span> <span class="n">out_width</span><span class="p">),</span>
+    <span class="k">lambda</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">:</span> <span class="n">tvm</span><span class="o">.</span><span class="nb">sum</span><span class="p">(</span>
+        <span class="n">PaddedInput</span><span class="p">[</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="o">/</span><span class="n">channel_multiplier</span><span class="p">,</span> <span class="n">i</span><span class="o">*</span><span class="n">stride_h</span> <span class="o">+</span> <span class="n">di</span><span class="p">,</span> <span class="n">j</span><span class="o">*</span><span class="n">stride_w</span> <span class="o">+</span> <sp [...]
+        <span class="n">axis</span><span class="o">=</span><span class="p">[</span><span class="n">di</span><span class="p">,</span> <span class="n">dj</span><span class="p">]),</span>
+    <span class="n">name</span><span class="o">=</span><span class="s">'DepthwiseConv2d'</span><span class="p">)</span>
+</code></pre></div></div>
+
+<h2 id="general-gpu-optimization-guidelines">General GPU Optimization Guidelines</h2>
+
+<p>This part briefly talks about three concepts we should know when optimizing CUDA code: data reuse, shared memory and bank conflicts.
+It would be great if you already know them, then you may skip this part.</p>
+
+<h3 id="data-reuse">Data Reuse</h3>
+<p>In modern computing architectures, the cost of loading data from memory is much higher than doing a single floating point computation [3].
+Because of that, we always want to reuse the input data after they are loaded into registers or shared memory (cache).</p>
+
+<p>There are two forms of data reuse in depthwise convolution: filter reuse and input reuse. Filter reuse happens as the filter slides over the input channel and computes multiple times.
+Input reuse is realized through tiling, let’s take 3x3 depthwise conv as an example:</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/no_tiling.png" alt="image" width="70%" /></p>
+
+<p>Without tiling, each thread computes 1 output element and loads 3x3 input data. 16 threads together have 9x16 loads.</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/tiling.png" alt="image" width="70%" /></p>
+
+<p>With tiling, each thread computes 2x2 output elements and loads 4x4 input data. 4 threads together have 16x4 loads.</p>
+
+<h3 id="shared-memory-and-bank-conflicts">Shared Memory and Bank Conflicts</h3>
+<p>Shared memory can be seen as cache in GPU. It is on-chip and much faster than global memory.</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/GPU_memory_hierarchy.png" alt="image" width="256px" /></p>
+
+<p>Shared memory is allocated per block. It’s common practice to load data from global memory into shared memory, and then all threads in the block read data from shared memory.</p>
+
+<p>The size of shared memory is limited (usually 48K), so we must be cautious of shared memory overflow.
+Besides, too much shared memory allocated to one block limits the number of active blocks per multiprocessor.</p>
+
+<p>Another performance issue with shared memory is bank conflicts. Shared memory is divided into equally sized memory modules (banks) that can be accessed simultaneously,
+however, if multiple threads access the same memory bank (causing bank conflicts), the accesses will be serialized, thus decreasing the effective bandwidth.</p>
+
+<p>Shared memory banks are organized such that successive addresses are assigned to successive banks.
+To avoid bank conflicts, it’s better that successive threads access successive memory addresses, as illustrated below (each color represents one shared memory bank):</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/bank_conflicts.png" alt="image" width="95%" /></p>
+
+<p>For more details on shared memory and bank conflicts, please refer to <a href="https://devblogs.nvidia.com/parallelforall/using-shared-memory-cuda-cc/">this Nvidia’s blog</a>.</p>
+
+<p>Ok, now let’s start optimizing depthwise convolution in TVM.</p>
+
+<h2 id="schedule-optimization">Schedule Optimization</h2>
+
+<h3 id="compute-paddedinput-inline-to-save-memory-allocation">Compute PaddedInput Inline to Save Memory Allocation</h3>
+<p>As we see from part 1, padding is declared explicitly as a separate stage. We compute it inline to avoid redundant memory allocation:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">s</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">create_schedule</span><span class="p">(</span><span class="n">Output</span><span class="o">.</span><span class="n">op</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">PaddedInput</span><span class="p">]</span><span class="o">.</span><span class="n">compute_inline</span><span class="p">()</span>
+</code></pre></div></div>
+
+<h3 id="divide-one-large-channel-into-smaller-blocks">Divide One Large Channel into Smaller Blocks</h3>
+<p>One straightforward schedule for depthwise convolution is that one cuda block takes care of one input channel and corresponding filters, loading them into shared memory and then computing:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">IS</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">cache_read</span><span class="p">(</span><span class="n">PaddedInput</span><span class="p">,</span> <span class="s">"shared"</span><span class="p">,</span> <span class="p">[</span><span class="n">DepthwiseConv2d</span><span class="p">])</span>
+<span class="n">FS</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">cache_read</span><span class="p">(</span><span class="n">Filter</span><span class="p">,</span> <span class="s">"shared"</span><span class="p">,</span> <span class="p">[</span><span class="n">DepthwiseConv2d</span><span class="p">])</span>
+<span class="n">block_y</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.y"</span><span class="p">)</span>
+<span class="n">block_x</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.x"</span><span class="p">)</span>
+<span class="c1"># bind the dimension of batch (N in NCHW) with block_y
+</span><span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">Output</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">block_y</span><span class="p">)</span>
+<span class="c1"># bind the dimension of channel (C in NCHW) with block_x
+</span><span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">Output</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">block_x</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>We test the average time cost of 1000 runs on GTX 1080, and compare with <a href="https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/convolution#depthwise_conv2d">depthwise_conv2d in tensorflow</a>.
+Here is the result:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: center">Input</th>
+      <th style="text-align: center">Filter</th>
+      <th style="text-align: center">stride</th>
+      <th style="text-align: center">tf-1.2 SAME pad (us)</th>
+      <th style="text-align: center">TVM SAME pad (us)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: center">[1, 256, 21, 21]</td>
+      <td style="text-align: center">[256, 1, 3, 3]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">16.1</td>
+      <td style="text-align: center">9.1</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 32, 32]</td>
+      <td style="text-align: center">[256, 1, 3, 3]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">34.8</td>
+      <td style="text-align: center">14.5</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 64, 64]</td>
+      <td style="text-align: center">[256, 1, 3, 3]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">130.9</td>
+      <td style="text-align: center">98.9</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">[256, 1, 3, 3]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">251.6</td>
+      <td style="text-align: center">387.4</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>As we can see, this schedule performs well with small channel size like 21 x 21 or 32 x 32, however, its performance drops seriously as the channel size increases to larger than 64 x 64.
+One main reason is that too much shared memory allocated to one block limits the number of active blocks per multiprocessor.</p>
+
+<p>We modify the schedule to divide one large channel into smaller blocks. For example, one channel (64 x 64 or 96 x 96) is divided into blocks of 32 x 32,
+and one cuda block takes care of one 32 x 32 block:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">blocking_h</span> <span class="o">=</span> <span class="mi">32</span>
+<span class="n">blocking_w</span> <span class="o">=</span> <span class="mi">32</span>
+<span class="c1"># split the dimension of height (H in NCHW)
+</span><span class="n">bx1</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">Output</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <sp [...]
+<span class="c1"># split the dimension of width (W in NCHW)
+</span><span class="n">bx2</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">Output</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <sp [...]
+<span class="c1"># assign one 32 x 32 block to one cuda block
+</span><span class="n">by</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">fuse</span><span class="p">(</span><span class="n">Output</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">Output</span><span class="o">.</span>< [...]
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">by</span><span class="p">,</span> <span class="n">block_y</span><span class="p">)</span>
+<span class="n">bx</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">fuse</span><span class="p">(</span><span class="n">bx1</span><span class="p">,</span> <span class="n">bx2</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">bx</span><span class="p">,</span> <span class="n">block_x</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>Here is the new result:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: center">Input</th>
+      <th style="text-align: center">[blocking_h, blocking_w]</th>
+      <th style="text-align: center">tf-1.2 SAME pad (us)</th>
+      <th style="text-align: center">TVM SAME pad (us)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: center">[1, 256, 64, 64]</td>
+      <td style="text-align: center">[32, 32]</td>
+      <td style="text-align: center">130.9</td>
+      <td style="text-align: center">63.4</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">[32, 32]</td>
+      <td style="text-align: center">251.6</td>
+      <td style="text-align: center">132.5</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Our blocking strategy works! For 64 x 64 channel size, it brings 1.6x acceleration (98.9us -&gt; 63.4us); for 96 x 96 channel size, it brings 2.9x acceleration (387.4us -&gt; 132.5us).</p>
+
+<h3 id="tuning-parameters-of-thread-numbers">Tuning Parameters of Thread Numbers</h3>
+
+<p>How to schedule the workload, say, 32x32 among the threads of one cuda block? Intuitively, it should be like this:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">num_thread_y</span> <span class="o">=</span> <span class="mi">8</span>
+<span class="n">num_thread_x</span> <span class="o">=</span> <span class="mi">8</span>
+<span class="n">thread_y</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_thread_y</span><span class="p">),</span> <span class="s">"threadIdx.y"</span><span class="p">)</span>
+<span class="n">thread_x</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_thread_x</span><span class="p">),</span> <span class="s">"threadIdx.x"</span><span class="p">)</span>
+<span class="n">ty</span><span class="p">,</span> <span class="n">yi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">h_dim</span><span class="p">,</span> <span class="n">nparts</span><span class="o">=</span><span class="n">num_thread_y</span><span class="p">)</span>
+<span class="n">tx</span><span class="p">,</span> <span class="n">xi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">w_dim</span><span class="p">,</span> <span class="n">nparts</span><span class="o">=</span><span class="n">num_thread_x</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">reorder</span><span class="p">(</span><span class="n">ty</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">yi</span><span class="p">,</span> <span class="n">xi</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">ty</span><span class="p">,</span> <span class="n">thread_y</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">thread_x</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>There are two parameters in the schedule: <code class="highlighter-rouge">num_thread_y</code> and <code class="highlighter-rouge">num_thread_x</code>. How to determine the optimal combination of them? 
+Well, let’s first do some experiments. Below is the result with Filter = [256, 1, 3, 3] and stride = [1, 1]:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: center">Case</th>
+      <th style="text-align: center">Input</th>
+      <th style="text-align: center">num_thread_y</th>
+      <th style="text-align: center">num_thread_x</th>
+      <th style="text-align: center">TVM SAME pad (us)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: center">1</td>
+      <td style="text-align: center">[1, 256, 32, 32]</td>
+      <td style="text-align: center">8</td>
+      <td style="text-align: center">32</td>
+      <td style="text-align: center">9.7</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">2</td>
+      <td style="text-align: center">[1, 256, 32, 32]</td>
+      <td style="text-align: center">4</td>
+      <td style="text-align: center">32</td>
+      <td style="text-align: center">8.8</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">3</td>
+      <td style="text-align: center">[1, 256, 32, 32]</td>
+      <td style="text-align: center">1</td>
+      <td style="text-align: center">32</td>
+      <td style="text-align: center">17.7</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">4</td>
+      <td style="text-align: center">[1, 256, 32, 32]</td>
+      <td style="text-align: center">32</td>
+      <td style="text-align: center">1</td>
+      <td style="text-align: center">32.5</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Many interesting observations from above results:</p>
+
+<ul>
+  <li>
+    <p>Case 2 is faster than case 1. In case 2, each thread computes a 8x1 tile in output, which corresponds to a 10x3 tile in input.
+It has better data reuse than case 1’s 4x1 tile.</p>
+  </li>
+  <li>
+    <p>Case 3 is slower than case 2. It’s because in case 3, the workload per thread is too large and leads to much cost of local memory read.</p>
+  </li>
+  <li>
+    <p>Case 4 is slower than case 3. It’s because <code class="highlighter-rouge">num_thread_x = 32</code> ensures no bank conflicts, while <code class="highlighter-rouge">num_thread_y = 32</code> doesn’t.</p>
+  </li>
+</ul>
+
+<p>To summarize what we learn from above observations:</p>
+
+<ul>
+  <li>Large tile is good for data reuse, but not good for local memory read.</li>
+  <li>The influence of <code class="highlighter-rouge">num_thread_y</code> and <code class="highlighter-rouge">num_thread_x</code> on bank conflicts is asymmetric.</li>
+  <li>To find the optimal combination of <code class="highlighter-rouge">num_thread_y</code> and <code class="highlighter-rouge">num_thread_x</code> is to achieve a balance of efficient shared memory access (avoid bank conflicts), data reuse, and local memory read.</li>
+</ul>
+
+<p>Pretty tricky. So, what exactly should we do to find the optimal combination? The answer is brute force search. 
+We can pass <code class="highlighter-rouge">num_thread_y</code> and <code class="highlighter-rouge">num_thread_x</code> as arguments to the schedule function, and try all possible combinations to find the optimal one. This can be done easily in TVM:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">schedule_depthwise_conv2d</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">num_thread_y</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">num_thread_x</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
+    <span class="n">num_thread_y</span> <span class="o">=</span> <span class="n">num_thread_y</span>
+    <span class="n">num_thread_x</span> <span class="o">=</span> <span class="n">num_thread_x</span>
+    <span class="n">do_schedule_as_usual</span>
+    <span class="k">return</span> <span class="n">schedule</span>
+
+<span class="n">min_time_cost</span> <span class="o">=</span> <span class="n">inf</span>
+<span class="k">for</span> <span class="n">num_thread_y</span><span class="p">,</span> <span class="n">num_thread_x</span> <span class="ow">in</span> <span class="n">all_possible_combinations</span><span class="p">:</span>
+    <span class="n">schedule</span> <span class="o">=</span> <span class="n">schedule_depthwise_conv2d</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">num_thread_y</span><span class="o">=</span><span class="n">num_thread_y</span><span class="p">,</span> <span class="n">num_thread_x</span><span class="o">=</span><span class="n">num_thread_x</span><span class="p">)</span>
+    <span class="n">time_cost</span> <span class="o">=</span> <span class="n">test_depthwise_conv2d</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">schedule</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">time_cost</span> <span class="o">&lt;</span> <span class="n">min_time_cost</span><span class="p">:</span>
+        <span class="n">min_time_cost</span> <span class="o">=</span> <span class="n">time_cost</span>
+        <span class="n">optimal_combination</span> <span class="o">=</span> <span class="p">[</span><span class="n">num_thread_y</span><span class="p">,</span> <span class="n">num_thread_x</span><span class="p">]</span>
+</code></pre></div></div>
+
+<p>In fact, it can be seen as a simple auto scheduler.</p>
+
+<h3 id="vthread-and-strided-patterns">Vthread and Strided Patterns</h3>
+<p>Vthread (virtual thread) in TVM is introduced to support strided patterns. We can use it this way:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">num_vthread_y</span> <span class="o">=</span> <span class="mi">2</span>
+<span class="n">num_vthread_x</span> <span class="o">=</span> <span class="mi">2</span>
+<span class="n">num_thread_y</span> <span class="o">=</span> <span class="mi">8</span>
+<span class="n">num_thread_x</span> <span class="o">=</span> <span class="mi">8</span>
+<span class="n">thread_vy</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_vthread_y</span><span class="p">),</span> <span class="s">"vthread"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">"vy"</span><span class="p">)</span>
+<span class="n">thread_vx</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_vthread_x</span><span class="p">),</span> <span class="s">"vthread"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">"vx"</span><span class="p">)</span>
+<span class="n">thread_y</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_thread_y</span><span class="p">),</span> <span class="s">"threadIdx.y"</span><span class="p">)</span>
+<span class="n">thread_x</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">num_thread_x</span><span class="p">),</span> <span class="s">"threadIdx.x"</span><span class="p">)</span>
+<span class="c1"># split the dimension of height (H in NCHW) twice
+</span><span class="n">tvy</span><span class="p">,</span> <span class="n">vyi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">h_dim</span><span class="p">,</span> <span class="n">nparts</span><span class="o">=</span><span class="n">num_vthread_y</span><span class="p">)</span>
+<span class="n">ty</span><span class="p">,</span> <span class="n">yi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">vyi</span><span class="p">,</span> <span class="n">nparts</span><span class="o">=</span><span class="n">num_thread_y</span><span class="p">)</span>
+<span class="c1"># split the dimension of width (W in NCHW) twice
+</span><span class="n">tvx</span><span class="p">,</span> <span class="n">vxi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">w_dim</span><span class="p">,</span> <span class="n">nparts</span><span class="o">=</span><span class="n">num_vthread_x</span><span class="p">)</span>
+<span class="n">tx</span><span class="p">,</span> <span class="n">xi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">vxi</span><span class="p">,</span> <span class="n">nparts</span><span class="o">=</span><span class="n">num_thread_x</span><span class="p">)</span>
+<span class="c1"># bind thread and vthread respectively
+</span><span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">tvy</span><span class="p">,</span> <span class="n">thread_vy</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">tvx</span><span class="p">,</span> <span class="n">thread_vx</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">ty</span><span class="p">,</span> <span class="n">thread_y</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">thread_x</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">]</span><span class="o">.</span><span class="n">reorder</span><span class="p">(</span><span class="n">tvy</span><span class="p">,</span> <span class="n">tvx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">yi</span><span class="p">,</span> <span class="n">xi</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>Let’s print the IR to see what vthread does:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* Input = [1, 1, 32, 32], Filter = [1, 1, 3, 3], stride = [1, 1], padding = 'SAME' */</span>
+<span class="n">produce</span> <span class="n">DepthwiseConv2d</span> <span class="p">{</span>
+  <span class="c1">// attr [iter_var(blockIdx.y, , blockIdx.y)] thread_extent = 1</span>
+  <span class="c1">// attr [iter_var(blockIdx.x, , blockIdx.x)] thread_extent = 1</span>
+  <span class="c1">// attr [iter_var(threadIdx.y, Range(min=0, extent=8), threadIdx.y)] thread_extent = 8</span>
+  <span class="c1">// attr [iter_var(threadIdx.x, Range(min=0, extent=8), threadIdx.x)] thread_extent = 8</span>
+  <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">for</span> <span class="p">(</span><span class="n">j</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">DepthwiseConv2d</span><span class="p">[((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><spa [...]
+      <span class="n">DepthwiseConv2d</span><span class="p">[(((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><sp [...]
+      <span class="n">DepthwiseConv2d</span><span class="p">[(((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><sp [...]
+      <span class="n">DepthwiseConv2d</span><span class="p">[(((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><sp [...]
+      <span class="k">for</span> <span class="p">(</span><span class="n">di</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">for</span> <span class="p">(</span><span class="n">dj</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
+          <span class="n">DepthwiseConv2d</span><span class="p">[((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> [...]
+          <span class="n">DepthwiseConv2d</span><span class="p">[(((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span [...]
+          <span class="n">DepthwiseConv2d</span><span class="p">[(((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span [...]
+          <span class="n">DepthwiseConv2d</span><span class="p">[(((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span [...]
+        <span class="p">}</span>
+      <span class="p">}</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div></div>
+
+<p>Without vthread (just set to 1), the IR is:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* Input = [1, 1, 32, 32], Filter = [1, 1, 3, 3], stride = [1, 1], padding = 'SAME' */</span>
+<span class="n">produce</span> <span class="n">DepthwiseConv2d</span> <span class="p">{</span>
+  <span class="c1">// attr [iter_var(blockIdx.y, , blockIdx.y)] thread_extent = 1</span>
+  <span class="c1">// attr [iter_var(blockIdx.x, , blockIdx.x)] thread_extent = 1</span>
+  <span class="c1">// attr [iter_var(threadIdx.y, Range(min=0, extent=8), threadIdx.y)] thread_extent = 8</span>
+  <span class="c1">// attr [iter_var(threadIdx.x, Range(min=0, extent=8), threadIdx.x)] thread_extent = 8</span>
+  <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">for</span> <span class="p">(</span><span class="n">j</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">DepthwiseConv2d</span><span class="p">[((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><span [...]
+      <span class="k">for</span> <span class="p">(</span><span class="n">di</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">for</span> <span class="p">(</span><span class="n">dj</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
+          <span class="n">DepthwiseConv2d</span><span class="p">[((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span>< [...]
+        <span class="p">}</span>
+      <span class="p">}</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div></div>
+
+<p>As we can see, when <code class="highlighter-rouge">num_vthread_y = 2</code> and <code class="highlighter-rouge">num_vthread_x = 2</code>, the 32 x 32 channel is divided into four sub-channels of 16 x 16.
+Each thread computes four output elements at a time, one element in one sub-channel.</p>
+
+<p>Below is the result with Filter = [256, 1, 3, 3], stride = [1, 1], blocking_h = 32, blocking_w = 32:</p>
+
+<style>
+table th:nth-of-type(1) {
+    width: 120px;
+}
+table th:nth-of-type(2) {
+    width: 120px;
+}
+</style>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: center">Case</th>
+      <th style="text-align: center">Input</th>
+      <th style="text-align: center">num_thread_y, num_thread_x</th>
+      <th style="text-align: center">num_vthread_y, num_vthread_x</th>
+      <th style="text-align: center">TVM SAME pad (us)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: center">1</td>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">8, 8</td>
+      <td style="text-align: center">1, 1</td>
+      <td style="text-align: center">132.5</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">2</td>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">8, 8</td>
+      <td style="text-align: center">1, 4</td>
+      <td style="text-align: center">103.1</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">3</td>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">4, 32</td>
+      <td style="text-align: center">1, 1</td>
+      <td style="text-align: center">95.9</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">4</td>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">8, 16</td>
+      <td style="text-align: center">1, 2</td>
+      <td style="text-align: center">90.9</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Case 2 is faster than case 1. It’s because in case 2 <code class="highlighter-rouge">num_thread_x=8</code> and <code class="highlighter-rouge">num_vthread_x=4</code> together ensures that consecutive threads access consecutive memory addresses,
+thus avoiding bank conflicts, as illustrated below (each color represents one thread’s workload):</p>
+
+<p style="text-align: center"><img src="/images/depthconv_tutorial/vthread_and_strided_pattern.png" alt="image" width="90%" /></p>
+
+<p>In theory case 3 and 4 should be the same fast, since they have the same workload per thread, and both enjoy efficient shared memory access. Somehow case 4 is just a little faster.</p>
+
+<p>Still remember tensorflow’s speed? It’s 251.6us, and now TVM is 2.8x faster. 387.4 -&gt; 132.5 -&gt; 95.9 -&gt; 90.9, blocking helps the most; tuning thread numbers saves 37us;
+vthread saves additional 5us.</p>
+
+<p>In fact, TVM can be extremely faster than tensorflow with large kernel size or channel_multiplier (because of more filter reuse) :</p>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: center">Input</th>
+      <th style="text-align: center">Filter</th>
+      <th style="text-align: center">stride</th>
+      <th style="text-align: center">tf-1.2 SAME pad (us)</th>
+      <th style="text-align: center">TVM SAME pad (us)</th>
+      <th style="text-align: center">How faster is TVM</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">[256, 1, 3, 3]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">251.6</td>
+      <td style="text-align: center">90.9</td>
+      <td style="text-align: center">2.8x</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">[256, 1, 5, 5]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">597.6</td>
+      <td style="text-align: center">128.9</td>
+      <td style="text-align: center">4.6x</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">[256, 2, 3, 3]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">659.9</td>
+      <td style="text-align: center">143.7</td>
+      <td style="text-align: center">4.6x</td>
+    </tr>
+    <tr>
+      <td style="text-align: center">[1, 256, 96, 96]</td>
+      <td style="text-align: center">[256, 2, 5, 5]</td>
+      <td style="text-align: center">[1, 1]</td>
+      <td style="text-align: center">1203.9</td>
+      <td style="text-align: center">170.5</td>
+      <td style="text-align: center">7.1x</td>
+    </tr>
+  </tbody>
+</table>
+
+<h2 id="operator-fusion">Operator Fusion</h2>
+
+<p>One typical optimization we can do in deep learning is operator fusion, that computes multiple operators together in a single kernel without saving intermediate results back to global memory.
+TVM supports that out of the box.</p>
+
+<p>Consider a common pattern in neural networks: <code class="highlighter-rouge">depthwise_conv2d</code> + <code class="highlighter-rouge">scale_shift</code> + <code class="highlighter-rouge">relu</code>. We can fuse the three operators into one, by slightly modifying the original schedule:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">DepthwiseConv2d</span> <span class="o">=</span> <span class="n">topi</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">depthwise_conv2d</span><span class="p">(</span><span class="n">Input</span><span class="p">,</span> <span class="n">Filter</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span [...]
+<span class="n">ScaleShift</span> <span class="o">=</span> <span class="n">topi</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">scale_shift</span><span class="p">(</span><span class="n">DepthwiseConv2d</span><span class="p">,</span> <span class="n">Scale</span><span class="p">,</span> <span class="n">Shift</span><span class="p">)</span>
+<span class="n">Relu</span> <span class="o">=</span> <span class="n">topi</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="n">ScaleShift</span><span class="p">)</span>
+
+<span class="n">Output</span> <span class="o">=</span> <span class="n">Relu</span> <span class="c1"># is no longer DepthwiseConv2d
+</span><span class="n">s</span><span class="p">[</span><span class="n">ScaleShift</span><span class="p">]</span><span class="o">.</span><span class="n">compute_inline</span><span class="p">()</span> <span class="c1"># this line fuses ScaleShift, explicitly
+</span><span class="n">s</span><span class="p">[</span><span class="n">DepthwiseConv2d</span><span class="p">]</span><span class="o">.</span><span class="n">set_scope</span><span class="p">(</span><span class="s">"local"</span><span class="p">)</span> <span class="c1"># this line fuses DepthwiseConv2d, implicitly
+</span><span class="n">schedule</span><span class="p">(</span><span class="n">Output</span><span class="p">)</span> <span class="c1"># schedule for Output the same way we schedule for DepthwiseConv2d as discussed above
+</span><span class="n">s</span><span class="p">[</span><span class="n">DepthwiseConv2d</span><span class="p">]</span><span class="o">.</span><span class="n">compute_at</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">Output</span><span class="p">],</span> <span class="n">tx</span><span class="p">)</span> <span class="c1"># tx is the inner most axis, bound to threadIdx.x
+</span></code></pre></div></div>
+
+<p>It generates IR like this:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* Input = [1, 1, 32, 32], Filter = [1, 1, 3, 3], stride = [1, 1], padding = 'SAME' */</span>
+<span class="n">produce</span> <span class="n">Relu</span> <span class="p">{</span>
+  <span class="c1">// attr [iter_var(blockIdx.y, , blockIdx.y)] thread_extent = 1</span>
+  <span class="c1">// attr [DepthwiseConv2d] storage_scope = "local"</span>
+  <span class="n">allocate</span> <span class="n">DepthwiseConv2d</span><span class="p">[</span><span class="n">float32</span> <span class="o">*</span> <span class="mi">1</span> <span class="o">*</span> <span class="mi">1</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">*</span> <span class="mi">4</span><span class="p">]</span>
+  <span class="c1">// attr [iter_var(blockIdx.x, , blockIdx.x)] thread_extent = 1</span>
+  <span class="c1">// attr [iter_var(threadIdx.y, Range(min=0, extent=8), threadIdx.y)] thread_extent = 8</span>
+  <span class="c1">// attr [iter_var(threadIdx.x, Range(min=0, extent=8), threadIdx.x)] thread_extent = 8</span>
+  <span class="n">produce</span> <span class="n">DepthwiseConv2d</span> <span class="p">{</span>
+    <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">for</span> <span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
+        <span class="n">DepthwiseConv2d</span><span class="p">[((</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="n">j</span><span class="p">)]</span> <span class="o">=</span> <span class="mf">0.000000</span><span class="n">f</span>
+        <span class="k">for</span> <span class="p">(</span><span class="n">di</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
+          <span class="k">for</span> <span class="p">(</span><span class="n">dj</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
+            <span class="n">DepthwiseConv2d</span><span class="p">[((</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="n">j</span><span class="p">)]</span> <span class="o">=</span> <span class="p">(</span><span class="n">DepthwiseConv2d</span><span class="p">[((</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span c [...]
+          <span class="p">}</span>
+        <span class="p">}</span>
+      <span class="p">}</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+  <span class="k">for</span> <span class="p">(</span><span class="n">i2</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">for</span> <span class="p">(</span><span class="n">i3</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">.</span><span class="n">inner</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">Relu</span><span class="p">[((((((((</span><span class="n">blockIdx</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">blockIdx</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="n">threadIdx</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><span class="o"> [...]
+    <span class="p">}</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div></div>
+
+<p>As we can see, each thread computes <code class="highlighter-rouge">scale_shift</code> and <code class="highlighter-rouge">relu</code> before writing the result of <code class="highlighter-rouge">depthwise_conv2d</code> to global memory. The fused operator is as fast as single <code class="highlighter-rouge">depthwise_conv2d</code>.
+Below is the result with Input = [1, 256, 96, 96], Filter = [256, 1, 3, 3], stride = [1, 1], padding = ‘SAME’:</p>
+
+<ul>
+  <li>tf-1.2 <code class="highlighter-rouge">depthwise_conv2d</code>: 251.6 us</li>
+  <li>tf-1.2 <code class="highlighter-rouge">depthwise_conv2d</code> + <code class="highlighter-rouge">scale_shift</code> + <code class="highlighter-rouge">relu</code> (separate): 419.9 us</li>
+  <li>TVM <code class="highlighter-rouge">depthwise_conv2d</code>: 90.9 us</li>
+  <li>TVM <code class="highlighter-rouge">depthwise_conv2d + scale_shift + relu</code> (fused): 91.5 us</li>
+</ul>
+
+<p>The advantage of operator fusion is obvious.</p>
+
+<p>This is not the end, TVM can do operator fusion in a smarter way. You may refer to <a href="https://github.com/dmlc/tvm/issues/215">this</a> and read the source code provided below.</p>
+
+<h2 id="show-me-the-code">Show me the code</h2>
+<ul>
+  <li>Declare: <a href="https://github.com/dmlc/tvm/blob/master/topi/python/topi/nn/depthwise_conv2d.py">https://github.com/dmlc/tvm/blob/master/topi/python/topi/nn/depthwise_conv2d.py</a></li>
+  <li>Schedule: <a href="https://github.com/dmlc/tvm/blob/master/topi/python/topi/cuda/depthwise_conv2d.py">https://github.com/dmlc/tvm/blob/master/topi/python/topi/cuda/depthwise_conv2d.py</a></li>
+  <li>Test: <a href="https://github.com/dmlc/tvm/blob/master/topi/recipe/conv/depthwise_conv2d_test.py">https://github.com/dmlc/tvm/blob/master/topi/recipe/conv/depthwise_conv2d_test.py</a></li>
+</ul>
+
+<h2 id="acknowledgements">Acknowledgements</h2>
+<p>The author has many thanks to Tianqi Chen for his helpful advice and inspiring discussion.</p>
+
+<h2 id="bio">Bio</h2>
+<p><a href="https://Huyuwei.github.io">Yuwei Hu</a> is an intern in <a href="http://tusimple.ai/">Tusimple</a>’s HPC group.
+He is experiencing a gap year after obtaining a bachelor’s degree in electrical engineering from Beihang University.</p>
+
+<h2 id="references">References</h2>
+<p>[1] <a href="https://arxiv.org/abs/1610.02357">Xception: Deep Learning with Depthwise Separable Convolutions</a></p>
+
+<p>[2] <a href="https://arxiv.org/abs/1704.04861">MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications</a></p>
+
+<p>[3] <a href="http://norvig.com/21-days.html#answers">Approximate timing for various operations on a typical PC</a></p>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2017/10/06/nnvm-compiler-announcement.html b/2017/10/06/nnvm-compiler-announcement.html
new file mode 100644
index 0000000..792bc1b
--- /dev/null
+++ b/2017/10/06/nnvm-compiler-announcement.html
@@ -0,0 +1,275 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>NNVM Compiler: Open Compiler for AI Frameworks</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>NNVM Compiler: Open Compiler for AI Frameworks </h1>
+      <p class="post-meta">
+        <time datetime="2017-10-06T08:30:00-07:00" itemprop="datePublished">
+          Oct 6, 2017
+        </time>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p style="text-align: center">Paul G. Allen School of Computer Science &amp; Engineering, University of Washington</p>
+<p style="text-align: center">Amazon Web Service AI team</p>
+<p style="text-align: center">DMLC open-source community</p>
+
+<p>Deep learning has become ubiquitous and indispensable. We are seeing a rising need for deploying deep learning workloads on many kinds of platforms such as mobile phones, GPU, IoT devices and specialized accelerators.  Last month, we announced TVM stack to close the gap between deep learning frameworks, and the performance- or efficiency-oriented hardware backends.  TVM stack makes it easy to build an end to end compilation for a deep learning framework.  However, we think it would ev [...]
+
+<p>Today, UW Allen school and AWS AI team, together with other contributors, are excited to announce the release of NNVM compiler, an open deep learning compiler to compile front-end framework workloads directly to hardware backends. We build it using the two-level intermediate representation(IR) in the TVM stack.
+The reader is welcome to refer to the <a href="http://www.tvmlang.org/2017/08/17/tvm-release-announcement.html">original TVM announcement</a> for more technical details about TVM stack. With the help of TVM stack, NNVM compiler can:</p>
+
+<ul>
+  <li>Represent and optimize the common deep learning workloads in high level graph IR</li>
+  <li>Transform the computation graph to minimize memory utilization, optimize data layout and fuse computation patterns for different hardware backends.</li>
+  <li>Present an end to end compilation pipeline from front-end deep learning frameworks to bare metal hardwares.</li>
+</ul>
+
+<p style="text-align: center"><img src="/images/nnvm/nnvm_compiler_stack.png" alt="image" width="612px" /></p>
+
+<p>The NNVM compiler can directly take models from deep learning frameworks such as Apache MXNet.
+It also support model exchange formats such as ONNX and CoreML. ONNX support enables NNVM to compile deep learning models from PyTorch, Caffe2 and CNTK.
+The CoreML frontend enables deployment of CoreML models to non-iOS devices.</p>
+
+<p style="text-align: center"><img src="/images/nnvm/nnvm_compiler_code.png" alt="image" width="712px" /></p>
+
+<h2 id="separation-of-optimization-and-deployment">Separation of Optimization and Deployment</h2>
+
+<p style="text-align: center"><img src="/images/nnvm/nnvm_deploy.png" alt="image" width="512px" /></p>
+
+<p>NNVM compiler applies graph level and tensor level optimizations and jointly optimize them to get the best performance. We take a different approach from existing deep learning frameworks, which packages the graph optimization with the deployment runtime.  NNVM compiler adopts the conventional wisdom from compiler to separate the optimization from the actual deployment runtime. This approach offers substantial optimization but still keeps the runtime lightweight. The compiled module o [...]
+
+<h2 id="performance">Performance</h2>
+
+<p>NNVM compiler is still under active development, and we can expect more improvements to come, but we have started to see promising results.
+We benchmarked its performance and compared it against Apache MXNet on two typical hardware configurations: ARM CPU on Raspberry PI and Nvidia GPU on AWS. Despite the radical architecture difference between these two chips, we can use the same infrastructure and only need to change the schedule for each type of hardware.</p>
+
+<h3 id="nvidia-gpu">Nvidia GPU</h3>
+
+<p>GPU benchmarks and schedules are contributed by Leyuan Wang (AWS/UCDavis) and Yuwei Hu (TuSimple). We compared the NNVM compiler against Apache MXNet with CUDA8 and cuDNN7 as the backend on Nvidia K80. This is a very strong baseline, as Apache MXNet turns on auto-tuning to select the best kernel from CuDNN. We also used the optimized depthwise kernel in MXNet to optimize MobileNet workload.</p>
+
+<p style="text-align: center"><img src="/images/nnvm/nnvm_k80_result.png" alt="image" width="400px" /></p>
+
+<p>As can be seen, NNVM compiler generate code that outperforms Apache MXNet on K80. These improvements are due to the joint graph level and kernel level optimizations. It is worth noting that NNVM compiler generates all the optimized GPU kernels on its own without relying on external libraries like CuDNN.</p>
+
+<h3 id="raspberry-pi-3b">Raspberry Pi 3b</h3>
+
+<p>The Rasberry Pi compilation stack is contributed by Ziheng Jiang(AWS/FDU).
+We compared NNVM compiler against Apache MXNet with OpenBLAS and NNPack.
+We explored the setups to get the best performance out of MXNet: we turned on Winograd convolution in the NNPACK for 3x3 convolutions, enabled multi-threading and disabled the additional scheduler thread (so all threads are used by NNPack).</p>
+
+<p style="text-align: center"><img src="/images/nnvm/nnvm_rasp_result.png" alt="image" width="400px" /></p>
+
+<p>As can be seen, the code generated by NNVM compiler is two times faster on ResNet18.
+The gap on MobileNet is mainly due to lack of depthwise convolution in existing CPU DNN libraries. NNVM compiler takes benefit of direct generating efficient ARM code directly.</p>
+
+<h2 id="acknowledgement">Acknowledgement</h2>
+<p>This project wouldn’t become possible without our early contributors in the DMLC community.
+We would like to specially thank Yuwei Hu(TuSimple), Leyuan Wang(AWS/UCDavis), Joshua Z. Zhang(AWS)
+and Xingjian Shi(HKUST) for their early contributions to the project. We would also like to thank all the contributors
+to the TVM stack.</p>
+
+<p>We also learnt a lot from the following projects when building NNVM Compiler.</p>
+<ul>
+  <li><a href="https://github.com/Theano/Theano">Theano</a>: possibly the earliest compiler for deep learning</li>
+  <li><a href="https://github.com/halide/Halide">Halide</a>: TVM uses <a href="https://github.com/dmlc/HalideIR">HalideIR</a> as data structure for
+arithematic simplification and low level lowering. HalideIR is derived from Halide.
+We also learns from Halide when implementing the lowering pipeline in TVM.</li>
+  <li><a href="https://github.com/inducer/loopy">Loopy</a>: use of integer set analysis and its loop transformation primitives.</li>
+</ul>
+
+<h2 id="links">Links</h2>
+<ul>
+  <li>Github page of NNVM Compiler: <a href="https://github.com/dmlc/nnvm">https://github.com/dmlc/nnvm</a></li>
+  <li>Github page of TVM: <a href="https://github.com/dmlc/tvm">https://github.com/dmlc/tvm</a></li>
+  <li><a href="https://news.cs.washington.edu/2017/10/06/allen-school-and-aws-team-up-on-new-nnvm-compiler-for-deep-learning-frameworks/">UW Allen school blog about NNVM compiler</a></li>
+  <li><a href="https://aws.amazon.com/blogs/ai/introducing-nnvm-compiler-a-new-open-end-to-end-compiler-for-ai-frameworks/">AWS blogpost about NNVM compiler</a></li>
+</ul>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2017/10/30/Bringing-AMDGPUs-to-TVM-Stack-and-NNVM-Compiler-with-ROCm.html b/2017/10/30/Bringing-AMDGPUs-to-TVM-Stack-and-NNVM-Compiler-with-ROCm.html
new file mode 100644
index 0000000..07f0cb6
--- /dev/null
+++ b/2017/10/30/Bringing-AMDGPUs-to-TVM-Stack-and-NNVM-Compiler-with-ROCm.html
@@ -0,0 +1,418 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Bringing AMDGPUs to TVM Stack and NNVM Compiler with ROCm</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Bringing AMDGPUs to TVM Stack and NNVM Compiler with ROCm </h1>
+      <p class="post-meta">
+        <time datetime="2017-10-30T00:00:00-07:00" itemprop="datePublished">
+          Oct 30, 2017
+        </time>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p style="text-align: center">Aditya Atluri, Advanced Micro Devices, Inc.</p>
+<p style="text-align: center">Masahiro Masuda, Ziosoft, Inc.</p>
+
+<p>We are pleased to announce a new GPU backend for TVM stack - ROCm backend for AMD GPUs. If you are not familiar with TVM, you can refer to <a href="http://tvmlang.org/2017/08/17/tvm-release-announcement.html">the earlier announcement</a> first. In short, TVM stack is an end to end compilation stack to deploy deep learning workloads to all hardware backends. Today’s announcement focuses on the code generator support for AMD GPUs. Specifically, we developed a new GPU code generator for  [...]
+
+<p style="text-align: center"><img src="/images/rocm/tvm_rocm_overview.png" alt="image" width="90%" /></p>
+
+<p>TVM stack is developed by an open source community under Apache-2.0 License. ROCm backend support is done with the help from community. Aditya first implemented codegen and runtime. He was later joined by Masahiro. Masahiro’s full time job is not related to TVM or AMD GPUs. Nonetheless, TVM got him excited and he has been involved in fixing bugs, resolving all failing unittests, and adding math function support to codegen.</p>
+
+<h2 id="rocm-stack">ROCm stack</h2>
+
+<p>Radeon Open Compute is open-source initiative by AMD to leverage compute power of current and future generation GPUs. ROCm software stack is a great tool to express and run most commonly used GPU programming models and achieve peak performance. Not only ROCm is an open-source stack, it is an open stack, which means all the ISA and hardware features are well documented and programmable by developers. Developers can experiment with different programming models and try out multiple ways  [...]
+
+<p>TVM leverages the open-source feature of ROCm stack by using LLVM AMDGPU backend code generator. TVM translates from its intermediate representation (IR) to LLVM intermediate representation. This is the place where ROCm stack open-source feature takes control. TVM’s LLVM AMDGPU CodeGen pass converts LLVM IR into GPU assembly and object code, which is later called to run the whole network or group of layers or single layer.</p>
+
+<p>On ROCm stack, there is no virtual ISA, you get what you ask for not less not more. Hence, one can schedule operations in a kernel at a granularity of a single instruction, without worrying about instruction reordering and other optimizations you do not ask for.</p>
+
+<h2 id="using-nnvm-compiler-with-rocm-backend">Using NNVM Compiler with ROCm backend</h2>
+
+<p>Thanks to TVM stack, we can directly compile models from popular deep learning frameworks such as MXNet and PyTorch into AMD GPU assembly using NNVM compiler, today. With ROCm backend, the generic workflow becomes as follows.</p>
+
+<p style="text-align: center"><img src="/images/rocm/rocm_workflow.png" alt="image" width="90%" /></p>
+
+<p>We have put together working examples of compiling models from MXNet and PyTorch with NNVM, and running them on AMD GPUs with ROCm backend. More frameworks are supported via the NNVM compiler stack. The repository is available <a href="https://github.com/ROCmSoftwarePlatform/nnvm-rocm">here</a>.</p>
+
+<p>The script <a href="https://github.com/ROCmSoftwarePlatform/nnvm-rocm/blob/master/mxnet_imagenet_inference.py">mxnet_imagenet_inference.py</a> demonstrates Imagenet inference on AMD GPUs with recently introduced MXNet-Gluon model. It does the following:</p>
+
+<ul>
+  <li>Loads Resnet 50 model from <a href="https://mxnet.incubator.apache.org/versions/master/api/python/gluon/model_zoo.html">the Gluon model zoo</a></li>
+  <li>Converts Gluon Resnet 50 model to NNVM graph format, using <code class="highlighter-rouge">nnvm.frontend.from_mxnet (...)</code></li>
+  <li>Compiles and executes the graph with ROCm backend</li>
+</ul>
+
+<p>The example comes with an image of the following cat.</p>
+
+<p style="text-align: center"><img src="/images/rocm/cat.png" alt="image" /></p>
+
+<p>Running our network, it predicts this image as “tigar cat”, among 1000 categories.</p>
+
+<figure class="highlight"><pre><code class="language-plain" data-lang="plain">$ python mxnet_imagenet_inference.py
+Testing model resnet50_v1
+x (1, 3, 224, 224)
+TVM prediction top-1: 282 tiger cat</code></pre></figure>
+
+<p>The script <a href="https://github.com/ROCmSoftwarePlatform/nnvm-rocm/blob/master/advanced_superres_onnx.py">advanced_superres_onnx.py</a> gives an example of loading a model trained with PyTorch. The model is stored in the <a href="https://onnx.ai/">ONNX</a> format. In this example, our network takes an low resolution image as input, and outputs a 4x high resolution image. We refer the details of a problem setup and the network architecture to <a href="https://arxiv.org/abs/1609.0480 [...]
+
+<p>In order to use models in the ONNX format with NNVM, we first use <a href="https://github.com/onnx/onnx">the ONNX library</a> to load the ONNX model into the Protocol buffer object. We can then use <code class="highlighter-rouge">nnvm.frontend.from_onnx(...)</code> to obtain an equivalent NNVM graph. With a NNVM graph in hand, we can follow the generic workflow of compilation and graph execution outlined above.</p>
+
+<p style="text-align: center"><img src="/images/rocm/butterfly.png" alt="image" /></p>
+
+<p>The input to the network is a 64 x 64 image on the left, and it outputs a 256 x 256 image on the right. On the middle is a 256 x 256 image obtained simply by resizing the input image with bicubic interpolation. The network outputs an image of far better quality.</p>
+
+<p>The input images are taken from the original paper, and they are available <a href="https://twitter.app.box.com/s/lcue6vlrd01ljkdtdkhmfvk7vtjhetog">here</a>.</p>
+
+<h2 id="a-note-on-performance">A Note on performance</h2>
+
+<p>The current support on ROCm focuses on the functionality coverage. We have already seen promising performance results by simply adopting existing TVM schedules for CUDA backend. For example, you can try running <a href="https://github.com/dmlc/tvm/blob/master/topi/recipe/gemm/cuda_gemm_square.py">the gemm test script</a> in the TVM repository and see the result. For two types of cards we tested, the current gemm recipe for square matrix multiplication (not yet specifically optimized f [...]
+This is already a promising start, as it is very hard to optimize performance to get to peak and we
+did not yet apply AMD GPU specific optimizations.
+We are starting to look at performance optimization and we expect more improvement to come.</p>
+
+<h2 id="walkthrough-of-rocm-backend">Walkthrough of ROCm backend</h2>
+
+<p>In the following part of this article we focus on explaining how to use ROCm backend when working with TVM directly. All you need to do is to build your TVM function under the target “rocm” and create a runtime context for it. Here, we show an example of ROCm backend usage, following ‘Vector Add Example’ in TVM’s <a href="http://docs.tvmlang.org/tutorials/get_started.html#vector-add-example">getting started tutorial</a>.</p>
+
+<p>We start by setting up a compute operation and a schedule for the vector add kernel. This step is independent of a backend.</p>
+
+<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span><span class="p">,</span> <span class="n">print_function</span>
+<span class="kn">import</span> <span class="nn">tvm</span>
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
+
+<span class="n">n</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">var</span><span class="p">(</span><span class="s">"n"</span><span class="p">)</span>
+<span class="n">A</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">placeholder</span><span class="p">((</span><span class="n">n</span><span class="p">,),</span> <span class="n">name</span><span class="o">=</span><span class="s">'A'</span><span class="p">)</span>
+<span class="n">B</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">placeholder</span><span class="p">((</span><span class="n">n</span><span class="p">,),</span> <span class="n">name</span><span class="o">=</span><span class="s">'B'</span><span class="p">)</span>
+<span class="n">C</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span><span class="n">A</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">i</span><span class="p">:</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="n">B</span><span class= [...]
+<span class="n">s</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">create_schedule</span><span class="p">(</span><span class="n">C</span><span class="o">.</span><span class="n">op</span><span class="p">)</span>
+<span class="n">bx</span><span class="p">,</span> <span class="n">tx</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">C</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">fact [...]
+<span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">bx</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.x"</span><span class="p">))</span>
+<span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"threadIdx.x"</span><span class="p">))</span></code></pre></figure>
+
+<p>Next, to use ROCm backend we build our kernel under “rocm” target. This will cause TVM to use our new code generator. We also need a runtime context for ROCm backend.</p>
+
+<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">target</span> <span class="o">=</span> <span class="s">"rocm"</span>
+<span class="n">fadd_rocm</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">],</span> <span class="n">target</span><span class="p">,</span> <span class="n">target_host</span><span class="o">=</span [...]
+<span class="n">ctx</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">rocm</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></code></pre></figure>
+
+<p>After building the kernel and setting up a runtime context, we can launch our vector add kernel.</p>
+
+<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">n</span> <span class="o">=</span> <span class="mi">1024</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="n">n</span><span class="p">)</span><span class="o">.</span><span class= [...]
+<span class="n">b</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="n">n</span><span class="p">)</span><span class="o">.</span><span class= [...]
+<span class="n">c</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">C</span><span class="o">.</span><span class="n">dtype</span><span class=" [...]
+
+<span class="n">fadd_rocm</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
+<span class="n">np</span><span class="o">.</span><span class="n">testing</span><span class="o">.</span><span class="n">assert_allclose</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(),</span> <span class="n">a</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span> <span class="o">+</span> <span class="n">b</span><span class="o">.</span><span class="n">asnumpy</span><span class="p" [...]
+
+<p>We can view LLVM IR that TVM generates in the following way:</p>
+
+<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">dev_module</span> <span class="o">=</span> <span class="n">fadd_rocm</span><span class="o">.</span><span class="n">imported_modules</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+<span class="k">print</span><span class="p">(</span><span class="n">dev_module</span><span class="o">.</span><span class="n">get_source</span><span class="p">(</span><span class="s">"llvm"</span><span class="p">))</span></code></pre></figure>
+
+<p>You should see something like this:</p>
+
+<figure class="highlight"><pre><code class="language-llvm" data-lang="llvm"><span class="c1">; ModuleID = 'myadd__kernel0'</span>
+<span class="err">source_filename</span> <span class="p">=</span> <span class="s">"myadd__kernel0"</span>
+<span class="k">target</span> <span class="k">datalayout</span> <span class="p">=</span> <span class="s">"e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"</span>
+<span class="k">target</span> <span class="k">triple</span> <span class="p">=</span> <span class="s">"amdgcn-amd-amdhsa-hcc"</span>
+
+
+<span class="c1">; Function Attrs: nounwind</span>
+<span class="k">define</span> <span class="k">dllexport</span> <span class="err">amdgpu_kernel</span> <span class="kt">void</span> <span class="vg">@myadd__kernel0</span><span class="p">(</span><span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="k">noalias</span> <span class="k">nocapture</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class= [...]
+<span class="nl">entry:</span>
+  <span class="nv">%4</span> <span class="p">=</span> <span class="k">tail</span> <span class="k">call</span> <span class="kt">i32</span> <span class="vg">@llvm.amdgcn.workgroup.id.x</span><span class="p">()</span>
+  <span class="nv">%5</span> <span class="p">=</span> <span class="k">tail</span> <span class="k">call</span> <span class="kt">i32</span> <span class="vg">@llvm.amdgcn.workitem.id.x</span><span class="p">()</span>
+  <span class="nv">%6</span> <span class="p">=</span> <span class="k">add</span> <span class="k">nsw</span> <span class="kt">i32</span> <span class="nv">%3</span><span class="p">,</span> <span class="m">-127</span>
+  <span class="nv">%7</span> <span class="p">=</span> <span class="k">ashr</span> <span class="kt">i32</span> <span class="nv">%6</span><span class="p">,</span> <span class="m">6</span>
+  <span class="nv">%8</span> <span class="p">=</span> <span class="k">icmp</span> <span class="k">slt</span> <span class="kt">i32</span> <span class="nv">%4</span><span class="p">,</span> <span class="nv">%7</span>
+  <span class="k">br</span> <span class="kt">i1</span> <span class="nv">%8</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%if_then</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%if_else</span>
+
+
+<span class="nl">if_then:</span>                                          <span class="c1">; preds = %entry</span>
+  <span class="nv">%9</span> <span class="p">=</span> <span class="k">shl</span> <span class="k">nsw</span> <span class="kt">i32</span> <span class="nv">%4</span><span class="p">,</span> <span class="m">6</span>
+  <span class="k">br</span> <span class="kt">label</span> <span class="nv">%if_end.sink.split</span>
+
+
+<span class="nl">if_end.sink.split:</span>                                <span class="c1">; preds = %if_else, %if_then</span>
+  <span class="nv">%.pre-phi</span> <span class="p">=</span> <span class="k">phi</span> <span class="kt">i32</span> <span class="p">[</span> <span class="nv">%21</span><span class="p">,</span> <span class="nv">%if_else</span> <span class="p">],</span> <span class="p">[</span> <span class="nv">%9</span><span class="p">,</span> <span class="nv">%if_then</span> <span class="p">]</span>
+  <span class="nv">%10</span> <span class="p">=</span> <span class="k">add</span> <span class="k">nsw</span> <span class="kt">i32</span> <span class="nv">%.pre-phi</span><span class="p">,</span> <span class="nv">%5</span>
+  <span class="nv">%11</span> <span class="p">=</span> <span class="k">add</span> <span class="k">nsw</span> <span class="kt">i32</span> <span class="nv">%.pre-phi</span><span class="p">,</span> <span class="nv">%5</span>
+  <span class="nv">%12</span> <span class="p">=</span> <span class="k">sext</span> <span class="kt">i32</span> <span class="nv">%11</span> <span class="k">to</span> <span class="kt">i64</span>
+  <span class="nv">%13</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="k">inbounds</span> <span class="kt">float</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="nv">%2</span><span class="p">,</span> <span class="kt">i64</span> <span class="nv">%12</span>
+  <span class="nv">%14</span> <span class="p">=</span> <span class="k">load</span> <span class="kt">float</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="nv">%13</span><span class="p">,</span> <span class="k">align</span> <span class="m">4</span><span class="p">,</span> <span class="nv">!tbaa</span> <span class="nv">!2</span>
+  <span class="nv">%15</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="k">inbounds</span> <span class="kt">float</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="nv">%1</span><span class="p">,</span> <span class="kt">i64</span> <span class="nv">%12</span>
+  <span class="nv">%16</span> <span class="p">=</span> <span class="k">load</span> <span class="kt">float</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="nv">%15</span><span class="p">,</span> <span class="k">align</span> <span class="m">4</span><span class="p">,</span> <span class="nv">!tbaa</span> <span class="nv">!6</span>
+  <span class="nv">%17</span> <span class="p">=</span> <span class="k">fadd</span> <span class="kt">float</span> <span class="nv">%14</span><span class="p">,</span> <span class="nv">%16</span>
+  <span class="nv">%18</span> <span class="p">=</span> <span class="k">sext</span> <span class="kt">i32</span> <span class="nv">%10</span> <span class="k">to</span> <span class="kt">i64</span>
+  <span class="nv">%19</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="k">inbounds</span> <span class="kt">float</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="nv">%0</span><span class="p">,</span> <span class="kt">i64</span> <span class="nv">%18</span>
+  <span class="k">store</span> <span class="kt">float</span> <span class="nv">%17</span><span class="p">,</span> <span class="kt">float</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">1</span><span class="p">)*</span> <span class="nv">%19</span><span class="p">,</span> <span class="k">align</span> <span class="m">4</span><span class="p">,</span> <span class="nv">!tbaa</span> <span class="nv">!9</span>
+  <span class="k">br</span> <span class="kt">label</span> <span class="nv">%if_end</span>
+
+
+<span class="nl">if_end:</span>                                           <span class="c1">; preds = %if_end.sink.split, %if_else</span>
+  <span class="k">ret</span> <span class="kt">void</span>
+
+
+<span class="nl">if_else:</span>                                          <span class="c1">; preds = %entry</span>
+  <span class="nv">%20</span> <span class="p">=</span> <span class="k">sub</span> <span class="k">nsw</span> <span class="kt">i32</span> <span class="nv">%3</span><span class="p">,</span> <span class="nv">%5</span>
+  <span class="nv">%21</span> <span class="p">=</span> <span class="k">shl</span> <span class="k">nsw</span> <span class="kt">i32</span> <span class="nv">%4</span><span class="p">,</span> <span class="m">6</span>
+  <span class="nv">%22</span> <span class="p">=</span> <span class="k">icmp</span> <span class="k">slt</span> <span class="kt">i32</span> <span class="nv">%21</span><span class="p">,</span> <span class="nv">%20</span>
+  <span class="k">br</span> <span class="kt">i1</span> <span class="nv">%22</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%if_end.sink.split</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%if_end</span><span class="p">,</span> <span class="nv">!prof</span> <span class="nv">!12</span>
+<span class="p">}</span></code></pre></figure>
+
+<p>We can also view GPU assembly that ROCm backend generates. This is the real code that runs on your GPU.</p>
+
+<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="k">print</span><span class="p">(</span><span class="n">dev_module</span><span class="o">.</span><span class="n">get_source</span><span class="p">(</span><span class="s">"asm"</span><span class="p">))</span></code></pre></figure>
+
+<p>The assembly should look something like this, omitting unnecessary details:</p>
+
+<figure class="highlight"><pre><code class="language-plain" data-lang="plain">        s_load_dword s1, s[4:5], 0x18
+        v_mov_b32_e32 v2, -1
+        v_mov_b32_e32 v1, 0
+        s_waitcnt lgkmcnt(0)
+        s_add_i32 s0, s1, 0xffffff81
+        s_ashr_i32 s0, s0, 6
+        s_cmp_ge_i32 s6, s0
+        s_cbranch_scc0 BB0_2
+        v_sub_i32_e32 v1, vcc, s1, v0
+        s_lshl_b32 s0, s6, 6
+        v_cmp_lt_i32_e32 vcc, s0, v1
+        v_mov_b32_e32 v2, 0
+        v_cndmask_b32_e64 v1, 0, -1, vcc
+BB0_2:
+        v_cmp_ne_u32_e32 vcc, 0, v2
+        v_cndmask_b32_e64 v2, 0, 1, vcc
+        v_cmp_ne_u32_e32 vcc, 1, v2
+        s_and_b64 vcc, exec, vcc
+        s_cbranch_vccnz BB0_4
+        s_lshl_b32 s0, s6, 6
+        v_mov_b32_e32 v1, -1
+BB0_4:
+        v_cmp_ne_u32_e32 vcc, 0, v1
+        v_mov_b32_e32 v1, s0
+        s_and_saveexec_b64 s[0:1], vcc
+        s_xor_b64 s[0:1], exec, s[0:1]
+        s_cbranch_execz BB0_6
+BB0_5:
+        s_load_dwordx2 s[2:3], s[4:5], 0x0
+        s_load_dwordx2 s[6:7], s[4:5], 0x8
+        v_add_i32_e32 v0, vcc, v1, v0
+        s_load_dwordx2 s[4:5], s[4:5], 0x10
+        v_ashrrev_i32_e32 v1, 31, v0
+        v_lshlrev_b64 v[0:1], 2, v[0:1]
+        s_waitcnt lgkmcnt(0)
+        v_add_i32_e32 v2, vcc, s4, v0
+        v_mov_b32_e32 v3, s5
+        v_addc_u32_e32 v3, vcc, v3, v1, vcc
+        flat_load_dword v2, v[2:3]
+        v_add_i32_e32 v4, vcc, s6, v0
+        v_mov_b32_e32 v3, s7
+        v_addc_u32_e32 v5, vcc, v3, v1, vcc
+        flat_load_dword v4, v[4:5]
+        v_mov_b32_e32 v3, s3
+        v_add_i32_e32 v0, vcc, s2, v0
+        v_addc_u32_e32 v1, vcc, v3, v1, vcc
+        s_waitcnt vmcnt(0) lgkmcnt(0)
+        v_add_f32_e32 v2, v2, v4
+        flat_store_dword v[0:1], v2
+BB0_6:
+        s_or_b64 exec, exec, s[0:1]
+        s_endpgm</code></pre></figure>
+
+<p>Links</p>
+
+<ul>
+  <li>Github page of NNVM Compiler: <a href="https://github.com/dmlc/nnvm">https://github.com/dmlc/nnvm</a></li>
+  <li>Github page of TVM: <a href="https://github.com/dmlc/tvm">https://github.com/dmlc/tvm</a></li>
+  <li>Examples of ROCm backend with NNVM: <a href="https://github.com/ROCmSoftwarePlatform/nnvm-rocm">https://github.com/ROCmSoftwarePlatform/nnvm-rocm</a></li>
+</ul>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2017/11/08/android-rpc-introduction.html b/2017/11/08/android-rpc-introduction.html
new file mode 100644
index 0000000..f4b581f
--- /dev/null
+++ b/2017/11/08/android-rpc-introduction.html
@@ -0,0 +1,424 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Remote Profile and Test Deep Learning Cross Compilation on Mobile Phones with TVM RPC</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Remote Profile and Test Deep Learning Cross Compilation on Mobile Phones with TVM RPC </h1>
+      <p class="post-meta">
+        <time datetime="2017-11-08T00:00:00-08:00" itemprop="datePublished">
+          Nov 8, 2017
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Yizhi Liu</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>TVM stack is an end to end compilation stack to deploy deep learning workloads to all hardware backends.
+Thanks to the NNVM compiler support of TVM stack, we can now directly compile descriptions from deep learning frameworks and compile them to bare metal code.
+An impressive feature OF tvm is its ability to deploy computation workloads on different platforms, such as GPUs and mobile phones (will support more hardward backends).</p>
+
+<p>However, when we want to test and profile cross compilation, it is hard to test different computation workloads on a heterogeneous device such as raspberry pi or a mobile phone.
+In order to optimize a computation task, one has to edit the code on the development PC, compile, deploy to the device, test, then modify the codes again to see whether it accelerates. The workflow looks like,</p>
+
+<p style="text-align: center"><img src="/images/android_rpc/flow1.png" alt="image" width="50%" /></p>
+
+<p>Is there any way to speed up this process?</p>
+
+<p>Today we introduce an approach to deploy and test TVM workloads on Android Phones. We develop a TVM runtime for Java and build an Android APP upon it. The Android APP takes shared library as input and runs compiled functions on the mobile phone. Thus our workflow simplifies to,</p>
+
+<p style="text-align: center"><img src="/images/android_rpc/flow2.png" alt="image" width="50%" /></p>
+
+<p>With the help of the TVM RPC, one can build TVM functions and NDArrays on a remote device. The ability to cross-compile to different platforms makes it easy to develop on one platform and test on another.</p>
+
+<p>The process is illustrated as following:</p>
+
+<p style="text-align: center"><img src="/images/android_rpc/arch.png" alt="image" width="70%" /></p>
+
+<h2 id="run-tvm-app-on-android-phone">Run TVM APP on Android Phone</h2>
+
+<p>You can find Android RPC APP in <a href="https://github.com/dmlc/tvm/tree/master/apps/android_rpc">apps/android_rpc</a>. Please follow the instruction to build for your Android device. Once the APK is built, sign it using <code class="highlighter-rouge">apps/android_rpc/dev_tools</code> and install it on the phone. The APP looks like:</p>
+
+<p style="text-align: center"><img src="/images/android_rpc/app.png" alt="image" width="25%" />
+<img src="/images/android_rpc/app_error.png" alt="image" width="25%" /></p>
+
+<p>Usually we cannot start a standalone server on mobile phone, instead we start an proxy server and use our app to connect.</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python <span class="nt">-m</span> tvm.exec.rpc_proxy
+</code></pre></div></div>
+
+<h2 id="create-ndarray-on-the-phone">Create NDArray on the Phone</h2>
+
+<p>Now we can connect to the proxy server from the laptop:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">tvm.contrib</span> <span class="kn">import</span> <span class="n">rpc</span>
+<span class="n">remote</span> <span class="o">=</span> <span class="n">rpc</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">"0.0.0.0"</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s">"android"</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>This will give us a handler <code class="highlighter-rouge">remote</code> which we can use to communicate with the mobile phone. For instance, the following lines create a 1024x1024 matrix on phone’s GPU:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">A</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
+	<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="mi">1024</span><span class="p">,</span> <span class="mi">1024</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">dtype</span><span class="p">),</span>
+	<span class="n">ctx</span> <span class="o">=</span> <span class="n">remote</span><span class="o">.</span><span class="n">cl</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
+</code></pre></div></div>
+
+<p>When <code class="highlighter-rouge">A.asnumpy()</code> is called from the laptop, the matrix <code class="highlighter-rouge">A </code>will be copied to phone’s RAM and then transfer to the laptop through the proxy server. The TVM RPC interface is transparent to users.</p>
+
+<h2 id="gemm-matrix-multiplication-on-the-phone">GEMM (Matrix Multiplication) on the Phone</h2>
+
+<p>Now we are going to introduce how to test matrix multiplication on an Android phone. First let’s define the very simple GEMM schedule:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">tvm</span>
+<span class="k">def</span> <span class="nf">gemm</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">bn</span><span class="p">):</span>
+    <span class="n">A</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">placeholder</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'A'</span><span class="p">)</span>
+    <span class="n">B</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">placeholder</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'B'</span><span class="p">)</span>
+    <span class="n">k</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'k'</span><span class="p">)</span>
+
+    <span class="n">C</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span>
+        <span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span>
+        <span class="k">lambda</span> <span class="n">ii</span><span class="p">,</span> <span class="n">jj</span><span class="p">:</span> <span class="n">tvm</span><span class="o">.</span><span class="nb">sum</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">ii</span><span class="p">,</span> <span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">B</span><span class="p">[</span><span class="n">k</span><span cla [...]
+        <span class="n">name</span><span class="o">=</span><span class="s">'C'</span><span class="p">)</span>
+
+    <span class="n">s</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">create_schedule</span><span class="p">(</span><span class="n">C</span><span class="o">.</span><span class="n">op</span><span class="p">)</span>
+
+    <span class="n">block_x</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.x"</span><span class="p">)</span>
+    <span class="n">thread_x</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"threadIdx.x"</span><span class="p">)</span>
+
+    <span class="n">bo</span><span class="p">,</span> <span class="n">bi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">C</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n"> [...]
+    <span class="n">to</span><span class="p">,</span> <span class="n">ti</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">C</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n"> [...]
+    <span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">bi</span><span class="p">,</span> <span class="n">block_x</span><span class="p">)</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">C</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">ti</span><span class="p">,</span> <span class="n">thread_x</span><span class="p">)</span>
+
+    <span class="k">print</span><span class="p">(</span><span class="n">tvm</span><span class="o">.</span><span class="n">lower</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">],</span> <span class="n">simple_mode</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
+
+    <span class="k">return</span> <span class="n">tvm</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">],</span>
+    	<span class="s">"opencl"</span><span class="p">,</span>
+    	<span class="n">target_host</span><span class="o">=</span><span class="s">"llvm -target=arm64-linux-android"</span><span class="p">,</span>
+    	<span class="n">name</span><span class="o">=</span><span class="s">"gemm_gpu"</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>There’s nothing special except the last line. Here we set the target to ‘opencl’ since this is the computation language which our Mali GPU supports. Note that we set <code class="highlighter-rouge">target_host</code> to ‘<code class="highlighter-rouge">llvm -target=arm64-linux-android</code>’, it depends on what architecture your Android Phone is. We tested on Samsung Galaxy S6 Edge, which has a Mali-T760 GPU. Here is the CPU info for this phone,</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>adb shell
+shell@zenltechn:/ <span class="nv">$ </span><span class="nb">cat</span> /proc/cpuinfo
+Processor	: AArch64 Processor rev 2 <span class="o">(</span>aarch64<span class="o">)</span>
+processor	: 0
+processor	: 1
+processor	: 2
+processor	: 3
+processor	: 4
+processor	: 5
+processor	: 6
+processor	: 7
+Features	: fp asimd aes pmull sha1 sha2 crc32
+CPU implementer	: 0x41
+CPU architecture: AArch64
+CPU variant	: 0x0
+CPU part	: 0xd03
+CPU revision	: 2
+
+Hardware	: SAMSUNG Exynos7420
+</code></pre></div></div>
+
+<p>Please refer to <a href="https://clang.llvm.org/docs/CrossCompilation.html#target-triple">target triple</a> to learn the compile options for LLVM.</p>
+
+<p>We use <code class="highlighter-rouge">tvm.contrib.ndk</code> to build the shared library for the Android system,</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">tvm.contrib</span> <span class="kn">import</span> <span class="n">rpc</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">ndk</span>
+<span class="n">N</span> <span class="o">=</span> <span class="mi">1024</span>
+<span class="n">f</span> <span class="o">=</span> <span class="n">gemm</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">bn</span> <span class="o">=</span> <span class="mi">256</span><span class="p">)</span>
+<span class="n">temp</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">tempdir</span><span class="p">()</span>
+<span class="n">path_dso</span> <span class="o">=</span> <span class="n">temp</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="s">"gemm_gpu.so"</span><span class="p">)</span>
+<span class="n">f</span><span class="o">.</span><span class="n">export_library</span><span class="p">(</span><span class="n">path_dso</span><span class="p">,</span> <span class="n">ndk</span><span class="o">.</span><span class="n">create_shared</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p><code class="highlighter-rouge">ndk.create_shared</code> reads the environment variable <code class="highlighter-rouge">TVM_NDK_CC</code> to find the compiler &amp; linker for the Android device. We can easily use NDK to generate standalone toolchain for our device. For example, the following commands generate standalone compilers and linkers for ARM64 Android devices.</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /opt/android-ndk/build/tools/
+./make-standalone-toolchain.sh <span class="nt">--platform</span><span class="o">=</span>android-24 <span class="nt">--use-llvm</span> <span class="nt">--arch</span><span class="o">=</span>arm64 <span class="nt">--install-dir</span><span class="o">=</span>/opt/android-toolchain-arm64
+</code></pre></div></div>
+
+<p>If everything goes right, we’ve got a shared library ‘gemm_gpu.so’. Now let’s upload it to the mobile phone, make the phone load the module and get a remote handler,</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">remote</span> <span class="o">=</span> <span class="n">rpc</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">"0.0.0.0"</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s">"android"</span><span class="p">)</span>
+
+<span class="n">remote</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">path_dso</span><span class="p">)</span>
+<span class="n">f</span> <span class="o">=</span> <span class="n">remote</span><span class="o">.</span><span class="n">load_module</span><span class="p">(</span><span class="s">"gemm_gpu.so"</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>Create the remote arrays and print the running time,</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ctx</span> <span class="o">=</span> <span class="n">remote</span><span class="o">.</span><span class="n">cl</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
+<span class="n">a_np</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s">"float32"</span>< [...]
+<span class="n">b_np</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s">"float32"</span>< [...]
+
+<span class="n">a</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">a_np</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span>
+<span class="n">b</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">b_np</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span>
+<span class="n">c</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="s">"float32"</span><span  [...]
+
+<span class="n">time_f</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">time_evaluator</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">entry_name</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
+<span class="n">cost</span> <span class="o">=</span> <span class="n">time_f</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span><span class="o">.</span><span class="n">mean</span>
+<span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="si">%</span><span class="s">g secs/op, </span><span class="si">%</span><span class="s">g GFLOPS'</span> <span class="o">%</span> <span class="p">(</span><span class="n">cost</span><span class="p">,</span> <span class="n">ngflops</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> <span class="o">/</span> <span class="n">cost</span><span class="p">))</span>
+</code></pre></div></div>
+
+<p>Now we can verify the results on PC,</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">np</span><span class="o">.</span><span class="n">testing</span><span class="o">.</span><span class="n">assert_almost_equal</span><span class="p">(</span>
+	<span class="n">c</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(),</span>
+	<span class="n">a_np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">b_np</span><span class="p">),</span>
+	<span class="n">decimal</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>In the case above, we develop and cross-compile to a binary file for our mobile phone. Through the proxy server, the binary is uploaded to the phone and run in its JVM. This approach makes it easy to develop and test different computation workloads on Android.</p>
+
+<h2 id="java-runtime-for-tvm">Java Runtime for TVM</h2>
+
+<p>The Android APP is built on top of the Java runtime, which provides minimum supports for TVM Function and NDArray. Here’s an example for registering function in tvm4j,</p>
+
+<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Function</span> <span class="n">func</span> <span class="o">=</span> <span class="nc">Function</span><span class="o">.</span><span class="na">convertFunc</span><span class="o">(</span><span class="k">new</span> <span class="nc">Function</span><span class="o">.</span><span class="na">Callback</span><span class="o">()</span> <span class="o">{</span>
+      <span class="nd">@Override</span> <span class="kd">public</span> <span class="nc">Object</span> <span class="nf">invoke</span><span class="o">(</span><span class="nc">TVMValue</span><span class="o">...</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
+        <span class="nc">StringBuilder</span> <span class="n">res</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StringBuilder</span><span class="o">();</span>
+        <span class="k">for</span> <span class="o">(</span><span class="nc">TVMValue</span> <span class="n">arg</span> <span class="o">:</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
+          <span class="n">res</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">arg</span><span class="o">.</span><span class="na">asString</span><span class="o">());</span>
+        <span class="o">}</span>
+        <span class="k">return</span> <span class="n">res</span><span class="o">.</span><span class="na">toString</span><span class="o">();</span>
+      <span class="o">}</span>
+    <span class="o">});</span>
+<span class="nc">TVMValue</span> <span class="n">res</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="na">pushArg</span><span class="o">(</span><span class="s">"Hello"</span><span class="o">).</span><span class="na">pushArg</span><span class="o">(</span><span class="s">" "</span><span class="o">).</span><span class="na">pushArg</span><span class="o">(</span><span class="s">"World!"</span><span class="o">).</span><span class="na">invoke</span [...]
+<span class="n">assertEquals</span><span class="o">(</span><span class="s">"Hello World!"</span><span class="o">,</span> <span class="n">res</span><span class="o">.</span><span class="na">asString</span><span class="o">());</span>
+<span class="n">res</span><span class="o">.</span><span class="na">release</span><span class="o">();</span>
+<span class="n">func</span><span class="o">.</span><span class="na">release</span><span class="o">();</span>
+</code></pre></div></div>
+
+<p>As we have seen in the GEMM part, one can build shared library by Python and execute it by Java,</p>
+
+<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">ml.dmlc.tvm.Module</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">ml.dmlc.tvm.NDArray</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">ml.dmlc.tvm.TVMContext</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.util.Arrays</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">LoadAddFunc</span> <span class="o">{</span>
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
+    <span class="nc">String</span> <span class="n">loadingDir</span> <span class="o">=</span> <span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
+    <span class="nc">Module</span> <span class="n">fadd</span> <span class="o">=</span> <span class="nc">Module</span><span class="o">.</span><span class="na">load</span><span class="o">(</span><span class="n">loadingDir</span> <span class="o">+</span> <span class="nc">File</span><span class="o">.</span><span class="na">separator</span> <span class="o">+</span> <span class="s">"add_cpu.so"</span><span class="o">);</span>
+
+    <span class="nc">TVMContext</span> <span class="n">ctx</span> <span class="o">=</span> <span class="nc">TVMContext</span><span class="o">.</span><span class="na">cpu</span><span class="o">();</span>
+
+    <span class="kt">long</span><span class="o">[]</span> <span class="n">shape</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">long</span><span class="o">[]{</span><span class="mi">2</span><span class="o">};</span>
+    <span class="nc">NDArray</span> <span class="n">arr</span> <span class="o">=</span> <span class="nc">NDArray</span><span class="o">.</span><span class="na">empty</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">ctx</span><span class="o">);</span>
+    <span class="n">arr</span><span class="o">.</span><span class="na">copyFrom</span><span class="o">(</span><span class="k">new</span> <span class="kt">float</span><span class="o">[]{</span><span class="mi">3</span><span class="n">f</span><span class="o">,</span> <span class="mi">4</span><span class="n">f</span><span class="o">});</span>
+    <span class="nc">NDArray</span> <span class="n">res</span> <span class="o">=</span> <span class="nc">NDArray</span><span class="o">.</span><span class="na">empty</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">ctx</span><span class="o">);</span>
+
+    <span class="n">fadd</span><span class="o">.</span><span class="na">entryFunc</span><span class="o">().</span><span class="na">pushArg</span><span class="o">(</span><span class="n">arr</span><span class="o">).</span><span class="na">pushArg</span><span class="o">(</span><span class="n">arr</span><span class="o">).</span><span class="na">pushArg</span><span class="o">(</span><span class="n">res</span><span class="o">).</span><span class="na">invoke</span><span class="o">();</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="nc">Arrays</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">res</span><span class="o">.</span><span class="na">asFloatArray</span><span class="o">()));</span>
+
+    <span class="n">arr</span><span class="o">.</span><span class="na">release</span><span class="o">();</span>
+    <span class="n">res</span><span class="o">.</span><span class="na">release</span><span class="o">();</span>
+    <span class="n">fadd</span><span class="o">.</span><span class="na">release</span><span class="o">();</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</code></pre></div></div>
+
+<p>Once you have built TVM library following the <a href="http://docs.tvmlang.org/how_to/install.html">Installation Guide</a>, run</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make jvmpkg
+make jvminstall
+</code></pre></div></div>
+
+<p>This will compile, package and install tvm4j in your local maven repository. Please refer to <a href="https://github.com/dmlc/tvm/tree/master/jvm">tvm4j</a> for more information.</p>
+
+<h2 id="remote-profile-and-test-on-iphoneipad">Remote Profile and Test on iPhone/iPad</h2>
+
+<p>Besides the Android RPC application, we also provide an <a href="https://github.com/dmlc/tvm/tree/master/apps/ios_rpc">iOS RPC app</a>, through which we can easily profile and test TVM computation workloads on iPhone or iPad. It works almost the same as that on Android, while XCode and an iOS device are required.</p>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/01/16/opt-mali-gpu.html b/2018/01/16/opt-mali-gpu.html
new file mode 100644
index 0000000..795539f
--- /dev/null
+++ b/2018/01/16/opt-mali-gpu.html
@@ -0,0 +1,770 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Optimizing Mobile Deep Learning on ARM GPU with TVM</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Optimizing Mobile Deep Learning on ARM GPU with TVM </h1>
+      <p class="post-meta">
+        <time datetime="2018-01-16T00:00:00-08:00" itemprop="datePublished">
+          Jan 16, 2018
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Lianmin Zheng</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>With the great success of deep learning, the demand for
+deploying deep neural networks to mobile devices is growing rapidly.
+Similar to what we do in desktop platforms, utilizing GPU in mobile devices
+can benefit both inference speed and energy efficiency. However, most
+existing deep learning frameworks do not support mobile GPU very well.
+The difficulty lies at the difference between mobile GPU architecture and
+desktop GPU architecture. It means special effort is required for optimizing on
+mobile GPU. The non-trivial extra work eventually results in the poor support
+of mobile GPU in most deep learning frameworks.</p>
+
+<p>TVM addresses the difficulty of deploying for different hardwares by
+introducing an unified IR stack, with which the optimization for different
+hardwares can be done easily.  In this post, we show how we use
+<a href="http://tvmlang.org/2017/08/17/tvm-release-announcement.html">TVM</a>/<a href="http://tvmlang.org/2017/10/06/nnvm-compiler-announcement.html">NNVM</a> to
+generate efficient kernels for ARM Mali GPU and do end-to-end compilation.
+In our test on Mali-T860 MP4, compared with
+<a href="https://developer.arm.com/technologies/compute-library">Arm Compute Library</a>,
+our method is 1.4x faster on VGG-16 and 2.2x faster on MobileNet.
+Both graph-level and operator-level optimization contribute
+to this speed up.</p>
+
+<p style="text-align: center"><img src="/images/opt-mali/end2end.png" alt="image" width="95%" /></p>
+
+<center> Figure. Inference Speed of Different Backends on ImageNet</center>
+<p></p>
+
+<h1 id="mali-midgrad-gpu">Mali Midgrad GPU</h1>
+<p>We will use Firefly-RK3399 with Mali-T860 MP4 as our test environment,
+so we mainly focus on Mali T8xx below.</p>
+
+<h2 id="architecture">Architecture</h2>
+<p>Figure 1 is an overview of the Mali Architecture on T860 and T880.
+The GPUs are scalable up to 16 coherent shader cores. Inside each
+shader core, there are 2 or 3 arithmetic pipelines, 1 load/store pipeline
+and 1 texture pipeline (so-called TriPipe). The ALU in each arithmetic
+pipeline has four 128-bit vector units and one scalar units.</p>
+
+<p>We use OpenCL for GPU computing. When mapping to OpenCL model, each
+shader core executes one or several work groups. Each shader core supports
+up to 384 concurrently executing threads. Each work item in OpenCL
+typically maps to a single thread on a Mali GPU.
+The Mali GPUs use a VLIW (Very Long Instruction Word) architecture.
+Each instruction word contains multiple operations. The Mali GPUs
+also use SIMD, so that most arithmetic instructions operate on
+multiple data elements simultaneously. <sup>[1]</sup></p>
+
+<center> <img width="50%" src="/images/opt-mali/mali-arch.png" /> </center>
+<center> Figure 1. Mali T860 and T880 (source <sup>[2]</sup>) </center>
+
+<h2 id="difference-with-nvidias-gpus">Difference with NVIDIA’s GPUs</h2>
+<p>Here are some differences that we should concern when writing OpenCL
+code for Mali GPUs, compared with writing for NVIDIA’s GPUs.</p>
+<ul>
+  <li>Mali GPUs use an unified global memory. In NVIDIA’s GPUs, we usually
+copy data to shared memory, because NVIDIA’s GPUs have physically
+separate global memory, shared memory and register. In Mali, this copy
+does not improve performance and can be removed. Besides, Mali GPUs
+usually share the global memory with CPU, so there is no need for copying
+between CPU and GPU.</li>
+  <li>Mali Midgrad GPUs are based on SIMD (Single Instruction Multiple Data)
+and need explicit vectorization. In NVIDIA CUDA, parallelism is
+achieved by SIMT (Single Instruction Multiple Thread), which does
+not require explicit vectorization. But also notice that the newer
+Mali Bitfrost GPUs are based on quad-style vectorization and does not
+require explicit vectorization.</li>
+  <li>All threads in Mali GPUs have individual program counters. It means
+the <code class="highlighter-rouge">warp size</code> is 1, so that branch divergence is not a major problem.</li>
+</ul>
+
+<h1 id="optimization--convolution-as-example">Optimization : Convolution as Example</h1>
+<p>The convolution layer is the core of most deep neural networks and
+takes most of the computation time. So we take the convolution layer
+as example to demonstrate how common optimization techniques like
+packing, tiling, unrolling and vectorization are applied in TVM.</p>
+
+<h2 id="im2col-with-gemm">Im2Col with GEMM</h2>
+<p>A well-known algorithm for convolution layer is <a href="https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/">im2col</a>,
+which converts the little 3D input cubes to columns of a matrix and
+perform a GEMM. The advantage of this method is easy utilization of
+highly optimized BLAS library.  However, the memory redundancy
+(9x memory for 3x3 kernel) is awful.</p>
+
+<h2 id="spatial-packing">Spatial Packing</h2>
+<p>Instead, we adopt a method to calculate the convolution, and apply the
+optimization techniques step by step. A convolution layer in VGG-16
+is used as tuning case, whose configuration is listed below.
+We assume the batch size is 1 for inference.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Input Shape</th>
+      <th>Output Shape</th>
+      <th>Kernel Size</th>
+      <th>Stride</th>
+      <th>Padding</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>56x56x256</td>
+      <td>56x56x256</td>
+      <td>3x3</td>
+      <td>(1, 1)</td>
+      <td>(1, 1)</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>As a baseline, we also list the performance of this layer in
+Arm Compute Library.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Kernel</th>
+      <th>Cost (second)</th>
+      <th>GFLOPS</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>GEMM method in ARMComputeLib</td>
+      <td>0.1821</td>
+      <td>20.3111</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="declare-the-computation-tiling-and-packing">Declare the computation: tiling and packing</h3>
+<p>Tiling and packing are two methods intended for better memory access.
+Tiling separates the whole computation into small blocks for better
+datareuse.  Packing re-layouts the input matrices according to the
+tiling so that we can access the memory sequentially, which reduces
+cache miss rate.</p>
+
+<p>We do tiling on the width dimension of the input image and CO dimension
+of the filter matrix.  This is described by <code class="highlighter-rouge">tvm.compute</code>.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># set tiling factor
+</span><span class="n">VH</span> <span class="o">=</span> <span class="mi">1</span>
+<span class="n">VW</span> <span class="o">=</span> <span class="n">VC</span> <span class="o">=</span> <span class="mi">4</span>
+
+<span class="c1"># get input shape
+</span> <span class="n">_</span><span class="p">,</span> <span class="n">CI</span><span class="p">,</span> <span class="n">IH</span><span class="p">,</span> <span class="n">IW</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span>
+<span class="n">CO</span><span class="p">,</span> <span class="n">CI</span><span class="p">,</span> <span class="n">KH</span><span class="p">,</span> <span class="n">KW</span> <span class="o">=</span> <span class="n">kernel</span><span class="o">.</span><span class="n">shape</span>
+<span class="n">TH</span> <span class="o">=</span> <span class="n">IH</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">H_PAD</span>
+<span class="n">TW</span> <span class="o">=</span> <span class="n">IW</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">W_PAD</span>
+
+<span class="c1"># calc output shape
+</span><span class="n">OH</span> <span class="o">=</span> <span class="p">(</span><span class="n">IH</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">H_PAD</span> <span class="o">-</span> <span class="n">KH</span><span class="p">)</span> <span class="o">//</span> <span class="n">H_STR</span> <span class="o">+</span> <span class="mi">1</span>
+<span class="n">OW</span> <span class="o">=</span> <span class="p">(</span><span class="n">IW</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">W_PAD</span> <span class="o">-</span> <span class="n">KW</span><span class="p">)</span> <span class="o">//</span> <span class="n">W_STR</span> <span class="o">+</span> <span class="mi">1</span>
+
+<span class="c1"># data shape after packing
+</span><span class="n">dvshape</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">TH</span> <span class="o">//</span> <span class="p">(</span><span class="n">VH</span><span class="o">*</span><span class="n">H_STRIDE</span><span class="p">),</span> <span class="n">TW</span> <span class="o">//</span> <span class="p">(</span><span class="n">VW</span><span class="o">*</span><span class="n">W_STRIDE</span><span class="p">), [...]
+
+<span class="c1"># kernel shape after packing
+</span><span class="n">kvshape</span> <span class="o">=</span> <span class="p">(</span><span class="n">CO</span> <span class="o">//</span> <span class="n">VC</span><span class="p">,</span> <span class="n">CI</span><span class="p">,</span> <span class="n">KH</span><span class="p">,</span> <span class="n">KW</span><span class="p">,</span> <span class="n">VC</span><span class="p">)</span>
+
+<span class="n">ovshape</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">CO</span> <span class="o">//</span> <span class="n">VC</span><span class="p">,</span> <span class="n">OH</span> <span class="o">//</span> <span class="n">VH</span><span class="p">,</span> <span class="n">OW</span> <span class="o">//</span> <span class="n">VW</span><span class="p">,</span> <span class="n">VH</span><span class="p">,</span> <span c [...]
+<span class="n">oshape</span> <span class="o">=</span> <span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">CO</span><span class="p">,</span> <span class="n">OH</span><span class="p">,</span> <span class="n">OW</span><span class="p">)</span>
+
+<span class="c1"># define packing
+</span><span class="n">data_vec</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span><span class="n">dvshape</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">vh</span><span class="p">, [...]
+    <span class="n">data_pad</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">ci</span><span class="p">][</span><span class="n">h</span><span class="o">*</span><span class="n">VH</span><span class="o">*</span><span class="n">H_STRIDE</span><span class="o">+</span><span class="n">vh</span><span class="p">][</span><span class="n">w</span><span class="o">*</span><span class="n">VW</span><span class="o">*</span><span class="n">W_STRIDE</span><spa [...]
+
+<span class="n">kernel_vec</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span><span class="n">kvshape</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span><span class="p">,</span> <span class="n">vc</span><span class="p">:</span>
+    <span class="n">kernel</span><span class="p">[</span><span class="n">co</span><span class="o">*</span><span class="n">VC</span><span class="o">+</span><span class="n">vc</span><span class="p">][</span><span class="n">ci</span><span class="p">][</span><span class="n">kh</span><span class="p">][</span><span class="n">kw</span><span class="p">],</span> <span class="n">name</span><span class="o">=</span><span class="s">'kernel_vec'</span><span class="p">)</span>
+
+<span class="c1"># define convolution
+</span><span class="n">ci</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">CI</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'ci'</span><span class="p">)</span>
+<span class="n">kh</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">KH</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'kh'</span><span class="p">)</span>
+<span class="n">kw</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">KW</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'kw'</span><span class="p">)</span>
+
+<span class="n">conv</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span><span class="n">ovshape</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <sp [...]
+    <span class="n">tvm</span><span class="o">.</span><span class="nb">sum</span><span class="p">(</span><span class="n">data_vec</span><span class="p">[</span><span class="n">n</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">vh</span><span class="o">*</span><span class="n">H_STRIDE</span><span class="o">+</span><span class="n">kh</span><span  [...]
+            <span class="n">kernel_vec</span><span class="p">[</span><span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span><span class="p">,</span> <span class="n">vc</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">out_dtype</span><span class="p">),</span>
+            <span class="n">axis</span><span class="o">=</span><span class="p">[</span><span class="n">ci</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span><span class="p">]),</span> <span class="n">name</span><span class="o">=</span><span class="s">'conv'</span><span class="p">)</span>
+
+<span class="c1"># unpack to correct layout
+</span><span class="n">output</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">(</span><span class="n">oshape</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">:</span>
+                     <span class="n">conv</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">co</span><span class="o">//</span><span class="n">VC</span><span class="p">][</span><span class="n">h</span><span class="o">/</span><span class="n">VH</span><span class="p">][</span><span class="n">w</span><span class="o">//</span><span class="n">VW</span><span class="p">][</span><span class="n">h</span><span class="o">%</span><span class="n">VH</span>< [...]
+                     <span class="n">name</span><span class="o">=</span><span class="s">'output_unpack'</span><span class="p">,</span> <span class="n">tag</span><span class="o">=</span><span class="s">'direct_conv_output'</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>We can inspect the defined IR by</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">tvm</span><span class="o">.</span><span class="n">lower</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="n">data</span><span class="p">,</span> <span class="n">kernel</span><span class="p">,</span> <span class="n">output</span><span class="p">],</span> <span [...]
+</code></pre></div></div>
+<p>I pick the convolution part here.</p>
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>produce conv {
+  for (co, 0, 64) {
+    for (h, 0, 56) {
+      for (w, 0, 14) {
+        for (vw.init, 0, 4) {
+          for (vc.init, 0, 4) {
+            conv[((((((((co*56) + h)*14) + w)*4) + vw.init)*4) + vc.init)] = 0.000000f
+          }
+        }
+        for (ci, 0, 256) {
+          for (kh, 0, 3) {
+            for (kw, 0, 3) {
+              for (vw, 0, 4) {
+                for (vc, 0, 4) {
+                  conv[((((((((co*56) + h)*14) + w)*4) + vw)*4) + vc)] = (conv[((((((((co*56) + h)*14) + w)*4) + vw)*4) + vc)] + (data_vec[(((((((((h*14) + w)*256) + ci)*3) + kh)*6) + kw) + vw)]*kernel_vec[((((((((co*256) + ci)*3) + kh)*3) + kw)*4) + vc)]))
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</code></pre></div></div>
+
+<h3 id="kernel-1-bind-thread">Kernel 1: bind thread</h3>
+<p>In TVM, we declare the computation at first and then <em>schedule</em> it.
+This mechanism decouples the algorithm and implementation detail. (This idea
+is from <a href="http://halide-lang.org/">Halide</a>).</p>
+
+<p>The following schedule simply binds axes to GPU threads, so that
+our code can run on Mali GPU.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># helper function for binding thread
+</span><span class="k">def</span> <span class="nf">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">tensor</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">z_factor</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">y_factor</span><span cla [...]
+    <span class="s">""" tile and bind 3d """</span>
+    <span class="n">y_factor</span> <span class="o">=</span> <span class="n">y_factor</span> <span class="ow">or</span> <span class="n">z_factor</span>
+    <span class="n">x_factor</span> <span class="o">=</span> <span class="n">x_factor</span> <span class="ow">or</span> <span class="n">y_factor</span>
+    <span class="n">zo</span><span class="p">,</span> <span class="n">zi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">z_factor</span><span class="p">)</span>
+    <span class="n">yo</span><span class="p">,</span> <span class="n">yi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_factor</span><span class="p">)</span>
+    <span class="n">xo</span><span class="p">,</span> <span class="n">xi</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x_factor</span><span class="p">)</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">zo</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.z"</span><span class="p">))</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">zi</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"threadIdx.z"</span><span class="p">))</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">yo</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.y"</span><span class="p">))</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">yi</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"threadIdx.y"</span><span class="p">))</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">xo</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"blockIdx.x"</span><span class="p">))</span>
+    <span class="n">s</span><span class="p">[</span><span class="n">tensor</span><span class="p">]</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">thread_axis</span><span class="p">(</span><span class="s">"threadIdx.x"</span><span class="p">))</span>
+
+<span class="c1"># set tunable parameter
+</span><span class="n">num_thread</span> <span class="o">=</span> <span class="mi">8</span>
+
+<span class="c1"># schedule data packing
+</span><span class="n">_</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">vw</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">data_vec</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class [...]
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">data_vec</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># schedule kernel packing
+</span><span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span><span class="p">,</span> <span class="n">vc</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span>
+<span class="n">tile_and_bind</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">kernel_vec</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># schedule conv
+</span><span class="n">_</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">vw</span><span class="p">,</span> <span class="n">vc</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n" [...]
+<span class="n">kc</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">reduce_axis</span>
+
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">reorder</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">kc</span><span class="p">,</span> <span class="n">kh< [...]
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">conv</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num_thread</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="n">_</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">oh</span><span class="p">,</span> <span class="n">ow</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">output</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span>
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">oh</span><span class="p">,</span> <span class="n">ow</span><span class="p">,</span> <span class="n">num_thread</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>With this schedule, our code can run now, but the performance is terrible.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Kernel</th>
+      <th>Cost (second)</th>
+      <th>GFLOPS</th>
+      <th>speedup</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>GEMM method in ARMComputeLib</td>
+      <td>0.1821</td>
+      <td>20.3111</td>
+      <td>1x</td>
+    </tr>
+    <tr>
+      <td>Kernel 1: simple bind</td>
+      <td>5.6154</td>
+      <td>0.6588</td>
+      <td>0.03x</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="kernel-2-unrolling">Kernel 2: unrolling</h3>
+<p>Loop unrolling can reduce the instructions for loop control, reduce
+branch penalties and hide latency in reading memory.
+In TVM, this can be done easily by calling <code class="highlighter-rouge">s.unroll(axis)</code></p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># set tunable parameter
+</span><span class="n">num_thread</span> <span class="o">=</span> <span class="mi">8</span>
+
+<span class="c1"># schedule data packing
+</span><span class="n">_</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">vw</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">data_vec</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class [...]
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">data_vec</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="s">"""!! ADD UNROLL HERE !!"""</span>
+<span class="n">s</span><span class="p">[</span><span class="n">data_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">vw</span><span class="p">)</span>
+
+<span class="c1"># schedule kernel packing
+</span><span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span><span class="p">,</span> <span class="n">vc</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span>
+<span class="n">tile_and_bind</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">kernel_vec</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="s">"""!! ADD UNROLL HERE !!"""</span>
+<span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kh</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">vc</span><span class="p">)</span>
+
+<span class="c1"># schedule conv
+</span><span class="n">_</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">vw</span><span class="p">,</span> <span class="n">vc</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n" [...]
+<span class="n">kc</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">reduce_axis</span>
+
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">reorder</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">kc</span><span class="p">,</span> <span class="n">kh< [...]
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">conv</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num_thread</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="s">"""!! ADD UNROLL HERE !!"""</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kh</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">vw</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">vc</span><span class="p">)</span>
+
+<span class="n">_</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">oh</span><span class="p">,</span> <span class="n">ow</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">output</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span>
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">oh</span><span class="p">,</span> <span class="n">ow</span><span class="p">,</span> <span class="n">num_thread</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</code></pre></div></div>
+
+<table>
+  <thead>
+    <tr>
+      <th>Kernel</th>
+      <th>Cost (second)</th>
+      <th>GFLOPS</th>
+      <th>speedup</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>GEMM method in ARMComputeLib</td>
+      <td>0.1821</td>
+      <td>20.3111</td>
+      <td>1x</td>
+    </tr>
+    <tr>
+      <td>Kernel 1: simple bind</td>
+      <td>5.6154</td>
+      <td>0.6588</td>
+      <td>0.03x</td>
+    </tr>
+    <tr>
+      <td>Kernel 2: + unrolling</td>
+      <td>0.3707</td>
+      <td>9.9796</td>
+      <td>0.49x</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="kernel3-vectorization">Kernel3: vectorization</h3>
+<p>As mentioned before, we need to do vectorization explictly
+ in order to achieve the best performance on Mali GPU.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># set tunable parameter
+</span><span class="n">num_thread</span> <span class="o">=</span> <span class="mi">8</span>
+
+<span class="c1"># schedule data packing
+</span><span class="n">_</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">vw</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">data_vec</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class [...]
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">data_vec</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># unroll
+</span><span class="n">s</span><span class="p">[</span><span class="n">data_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">vw</span><span class="p">)</span>
+
+<span class="c1"># schedule kernel packing
+</span><span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span><span class="p">,</span> <span class="n">vc</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span>
+<span class="n">tile_and_bind</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">kernel_vec</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">ci</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># unroll
+</span><span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kh</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+<span class="s">"""!! VECTORIZE HERE !!"""</span>
+<span class="n">s</span><span class="p">[</span><span class="n">kernel_vec</span><span class="p">]</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="n">vc</span><span class="p">)</span>
+
+<span class="c1"># schedule conv
+</span><span class="n">_</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">vw</span><span class="p">,</span> <span class="n">vc</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n" [...]
+<span class="n">kc</span><span class="p">,</span> <span class="n">kh</span><span class="p">,</span> <span class="n">kw</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">reduce_axis</span>
+
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">reorder</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">vh</span><span class="p">,</span> <span class="n">kc</span><span class="p">,</span> <span class="n">kh< [...]
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">conv</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num_thread</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># unroll
+</span><span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kh</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">unroll</span><span class="p">(</span><span class="n">vw</span><span class="p">)</span>
+<span class="s">"""!! VECTORIZE HERE !!"""</span>
+<span class="n">s</span><span class="p">[</span><span class="n">conv</span><span class="p">]</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="n">vc</span><span class="p">)</span>
+
+<span class="n">_</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">oh</span><span class="p">,</span> <span class="n">ow</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">output</span><span class="p">]</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">axis</span>
+<span class="n">tile_and_bind3d</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">co</span><span class="p">,</span> <span class="n">oh</span><span class="p">,</span> <span class="n">ow</span><span class="p">,</span> <span class="n">num_thread</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</code></pre></div></div>
+
+<table>
+  <thead>
+    <tr>
+      <th>Kernel</th>
+      <th>Cost (second)</th>
+      <th>GFLOPS</th>
+      <th>speedup</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>GEMM method in ARMComputeLib</td>
+      <td>0.1821</td>
+      <td>20.3111</td>
+      <td>1x</td>
+    </tr>
+    <tr>
+      <td>Kernel 1: simple bind</td>
+      <td>5.6154</td>
+      <td>0.6588</td>
+      <td>0.03x</td>
+    </tr>
+    <tr>
+      <td>Kernel 2: + unrolling</td>
+      <td>0.3707</td>
+      <td>9.9796</td>
+      <td>0.49x</td>
+    </tr>
+    <tr>
+      <td>Kernel 3: + vectorization</td>
+      <td>0.1304</td>
+      <td>28.3679</td>
+      <td>1.40x</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="how-to-set-the-tunable-parameter">How to set the tunable parameter</h3>
+<p>As for the tunable parameters above, some can be calculated.
+For the vectorized dimension <code class="highlighter-rouge">VC</code>, we should fill the 128-bit register,
+so it can be set as 128/32=4 for float32 and 128/16=8 for float16.</p>
+
+<p>But more often we cannot determine the optimal value, due to the
+complicated runtime. We use grid search in TVM. It can be
+done extremely effective since we write python code in TVM’s high-level
+IR rather than direct OpenCL code.</p>
+
+<h3 id="the-generated-opencl-code">The generated OpenCL code</h3>
+<p>We can view the generated OpenCL code by</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">func</span><span class="o">.</span><span class="n">imported_modules</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_source</span><span class="p">())</span>
+</code></pre></div></div>
+<p>The OpenCL code is too long to be pasted here, and it is hard to read due
+to heavy unrolling. If interested, you can view it
+<a href="https://github.com/merrymercy/tvm-mali/blob/master/data/kernels.cl">here</a>.</p>
+
+<h1 id="end-to-end-benchmarking">End-to-End Benchmarking</h1>
+<p>In this section, we compare the comprehensive performance between
+different backends on some popular deep neural networks.
+Our test environment is</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Firefly-RK3399 4G
+CPU: dual-core Cortex-A72 + quad-core Cortex-A53
+GPU: Mali-T860MP4
+
+Arm Compute Library : v17.12
+MXNet: v1.0.1
+Openblas: v0.2.18
+</code></pre></div></div>
+
+<p>We use NNVM and TVM to do end-to-end compilation.</p>
+
+<h2 id="performance">Performance</h2>
+
+<p style="text-align: center"><img src="/images/opt-mali/end2end.png" alt="image" width="95%" /></p>
+
+<center> Figure 2. Inference Speed of Different Backends on ImageNet</center>
+<p></p>
+
+<p>As shown in Figure 2, we test the inference speed on ImageNet.
+On Firefly-RK3399, Mali GPU can be 2x ~ 4x faster than 6-core big.LITTLE CPU.
+Our end-to-end pipeline is 1.4x ~ 2.2x faster than Arm Compute Library.
+We try both GEMM and direct method of convolution layer in
+Arm Compute Library, GEMM method is always faster than direct method
+in these test cases, so we only plot the result of GEMM method.</p>
+
+<p>Some results, like resnet18 on Arm Compute Library, are missing in the Figure 2.
+It is because the graph runtime of Arm Compute Library does not support
+skip connection currently and has a poor neon implementation of
+depthwise convolution.  This also reflects the advantage of NNVM
+software stack.</p>
+
+<h2 id="half-precision-performance">Half-Precision Performance</h2>
+<p>Precision in deep neural networks is not very important, especially
+for the inference on mobile devices. Using low-precision arithmetic
+can make the inference much faster. We also test the half-precision
+floating number on Mali GPU.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>model</th>
+      <th>backend</th>
+      <th>Time Cost per Image (second)</th>
+      <th>speed up to FP32</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>vgg16</td>
+      <td>ACM-mali</td>
+      <td>0.9694</td>
+      <td>1.69</td>
+    </tr>
+    <tr>
+      <td>vgg16</td>
+      <td>TVM-mali</td>
+      <td>0.6896</td>
+      <td><strong>1.87x</strong></td>
+    </tr>
+    <tr>
+      <td>MobileNet 1.0</td>
+      <td>TVM-mali</td>
+      <td>0.0479</td>
+      <td>1.60x</td>
+    </tr>
+    <tr>
+      <td>ResNet18</td>
+      <td>TVM-mali</td>
+      <td>0.1183</td>
+      <td>1.73x</td>
+    </tr>
+  </tbody>
+</table>
+
+<center> Table 1. Inference Speed of FP16 on ImageNet</center>
+<p></p>
+
+<p>In theory, FP16 can both double peak compute and halve memory consumption,
+so that doubling the speed. But it needs good input shape for
+longer vectorization and fine-tuning some parameters.</p>
+
+<h2 id="further-work-on-mobile-devices">Further Work on Mobile Devices</h2>
+<p>We should admit that there is still some room for improvement,
+mainly at the graph level, such as model compression and weight prelayout.
+Further improvement in NNVM will try to solve these problems.</p>
+
+<h1 id="show-me-the-code">Show me the code</h1>
+
+<ul>
+  <li><a href="https://github.com/merrymercy/tvm-mali">End-to-End benchmark</a></li>
+  <li><a href="https://github.com/dmlc/tvm/tree/master/topi/python/topi/mali">Convolution and Depthwise Convolution Schedule</a></li>
+</ul>
+
+<h1 id="bio--acknowledgement">Bio &amp; Acknowledgement</h1>
+<p><a href="https://lmzheng.net">Lianmin Zheng</a> is an undergraduate
+student at SJTU Apex lab.  He is interested in machine learning
+and building computer system.</p>
+
+<p>The author has many thanks to
+<a href="https://homes.cs.washington.edu/~tqchen/">Tianqi Chen</a> for his helpful
+advice and <a href="https://github.com/yzhliu">Yizhi Liu</a> for his earlier work.</p>
+
+<h1 id="reference">Reference</h1>
+<p>[1] <a href="https://developer.arm.com/docs/100614/0302">ARM Mali GPU OpenCL Developer Guide</a>
+[2] <a href="https://developer.arm.com/">ARM Developer</a></p>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/03/12/webgl.html b/2018/03/12/webgl.html
new file mode 100644
index 0000000..988707c
--- /dev/null
+++ b/2018/03/12/webgl.html
@@ -0,0 +1,312 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Compiling Deep Learning Models to WebGL with TVM</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Compiling Deep Learning Models to WebGL with TVM </h1>
+      <p class="post-meta">
+        <time datetime="2018-03-12T00:00:00-07:00" itemprop="datePublished">
+          Mar 12, 2018
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Zhixun Tan</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>Now TVM comes with a brand-new OpenGL/WebGL backend!
+This blog post explains what it is, and what you can achieve with it.</p>
+
+<h1 id="the-openglwebgl-backend">The OpenGL/WebGL Backend</h1>
+
+<p>TVM already targets a lot of backends covering a variety of platforms: CPU, GPU,
+mobile devices, etc… This time we are adding another backend: OpenGL/WebGL.</p>
+
+<p>OpenGL/WebGL enables us to leverage the GPU on an environment which does not
+have CUDA installed. It is, for the time being, the only way of using the GPU
+inside a browser.</p>
+
+<p>This new backend allows us to use OpenGL/WebGL in 3 different ways:</p>
+<ul>
+  <li><strong>Local OpenGL</strong>:
+We can compile a deep learning model into OpenGL and directly
+run it on the local machine, entirely using Python.</li>
+  <li><strong>WebGL with RPC</strong>:
+We can compile a deep learning model into WebGL and export
+it as a shared library via Emscripten, with JavaScript host code and WebGL device code. Then
+we can deploy that library through RPC onto a TVM JavaScript runtime system
+running inside a browser.</li>
+  <li><strong>WebGL with static library</strong>:
+We can compile a deep learning model into WebGL,
+link it with the TVM JavaScript runtime system and export the entire package.
+Then we can run the model in a web page on a browser, with no dependency.
+The detailed flow is described in figure 1.</li>
+</ul>
+
+<p>We rely on Emscripten and its fastcomp LLVM backend to generate the javascript backend.</p>
+
+<p style="text-align: center"><img src="/images/opengl/webgl-flow.png" alt="image" width="65%" /><br />
+Figure 1</p>
+
+<p>See <a href="https://github.com/dmlc/nnvm/blob/master/tutorials/from_mxnet_to_webgl.py">here</a>
+for examples of all three of them.</p>
+
+<h1 id="how-is-this-different-from-x">How is this Different from X?</h1>
+
+<p>Running a neural network on a browser isn’t an entirely new thing.
+Andrej Karpathy’s <a href="https://cs.stanford.edu/people/karpathy/convnetjs/">ConvNetJS</a>
+and Google’s <a href="https://deeplearnjs.org/">DeepLearning.JS</a> are examples of that.</p>
+
+<p>So what’s unique about TVM with WebGL? The big difference is that the op kernels
+in TVM are automatically compiled, not handwritten. As shown in Figure 2, TVM
+utilizes a unified AST to define kernels, and compiles it to code on different
+platforms.</p>
+
+<p style="text-align: center"><img src="/images/opengl/comparison.png" alt="" width="50%" /><br />
+Figure 2</p>
+
+<p>This means that:</p>
+<ul>
+  <li>To deploy your existing model to WebGL, you don’t need to write a lot of
+additional code. The NNVM/TVM model definition is the same for all targets, so
+you just need to compile it to a new target.</li>
+  <li>To add a new op kernel, you only need to define it in TVM once, instead of
+implementing it once for every target. You don’t need to know how to write
+GLSL code to add a new op kernel to WebGL!</li>
+</ul>
+
+<h1 id="benchmark">Benchmark</h1>
+
+<p>Here we perform a benchmark for a typical workload: image classification using
+resnet18.</p>
+
+<p>I’m using my <a href="https://www.asus.com/us/Laptops/N76VZ/">5-year-old laptop</a> which
+has an 8-core Intel® Core™ i7-3610QM, and a GTX650M.</p>
+
+<p>In this benchmark, we download a resnet18 model from the Gluon model zoo, and
+perform end-to-end classification on a cat image. We only measure the model
+execution time (without model/input/parameter loading), and each model is run
+100 times to get an average. The results are shown in figure 3.</p>
+
+<p style="text-align: center"><img src="/images/opengl/opengl-benchmark.png" alt="image" /><br />
+Figure 3</p>
+
+<p>The benchmark is run in 4 different settings:</p>
+<ul>
+  <li><strong>CPU (LLVM)</strong>: The model is compiled into LLVM IR and JIT’ed. Therefore, it is
+run entirely on the CPU.</li>
+  <li><strong>OpenCL</strong>: The model is compiled into OpenCL. There is still some glue code
+compiled to LLVM, which is responsible for setting up and launching OpenCL
+kernels. Then we run it on the local machine.</li>
+  <li><strong>OpenGL</strong>: Same as OpenCL, but compiled to OpenGL.</li>
+  <li><strong>WebGL</strong>: The glue code is compiled to LLVM, and transformed to JavaScript using
+Emscripten’s Fastcomp LLVM backend.
+The device code is compiled to WebGL. We execute the model in Firefox.</li>
+</ul>
+
+<p>From the result above we can observe that, the TVM OpenGL backend has a similar
+performance as OpenCL. More interestingly, the WebGL version inside the browser
+isn’t significantly slower than desktop OpenGL. Considering that the host code
+is JavaScript, this is quite surprising. This might be due to the fact that
+Emscripten generates <a href="http://asmjs.org/">asm.js</a> which enables dramatic
+optimizations in Firefox.</p>
+
+<p>This is a first step toward automatic compilation of deep learning models
+into web browser. We expect more performance improvements as we bring
+optimizations into the TVM stack.</p>
+
+<h2 id="show-me-the-code">Show me the Code</h2>
+<ul>
+  <li>Checkout <a href="https://github.com/dmlc/nnvm/blob/master/tutorials/from_mxnet_to_webgl.py">this complete code example</a>.</li>
+</ul>
+
+<h2 id="acknowledgement">Acknowledgement</h2>
+<p>We thank the developers of Emscripten for providing the fastcomp toolchain and the helps during the development.</p>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/03/23/nmt-transformer-optimize.html b/2018/03/23/nmt-transformer-optimize.html
new file mode 100644
index 0000000..b85019d
--- /dev/null
+++ b/2018/03/23/nmt-transformer-optimize.html
@@ -0,0 +1,458 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Bringing TVM into TensorFlow for Optimizing Neural Machine Translation on GPU</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Bringing TVM into TensorFlow for Optimizing Neural Machine Translation on GPU </h1>
+      <p class="post-meta">
+        <time datetime="2018-03-23T00:00:00-07:00" itemprop="datePublished">
+          Mar 23, 2018
+        </time>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <h2 id="author">Author</h2>
+
+<p>This is a guest blogpost contributed by Alibaba Group’s Machine Translation Platform team and PAI-Blade team</p>
+
+<h2 id="background">Background</h2>
+
+<p>Neural Machine Translation (NMT) is an end-to-end approach for automating translation, with the potential to overcome the weaknesses in conventional phrase-based translation systems. Recently, Alibaba Group is working on deploying NMT service for global e-commerce.</p>
+
+<p>Currently we are exploiting Transformer [1] as the major backbone in our NMT system since it is more friendly for efficient offline training with on-par (even higher) precison against classical RNN/LSTM-based models. Although Transformer is friendly for the offline training phase as it breaks the dependencies across time steps, it is not quite efficiency for online inference. In our production environment, it has been found that the inference speed of the intial version of Transformer [...]
+One paricular challenge we observed, is that batch matmul is a major performance hot-spot in Transformer and the current implementation in cuBLAS is not well optimized.</p>
+
+<p style="text-align: center"><img src="/images/nmt-transformer/model_arch.png" alt="image" width="40%" /></p>
+
+<p>The results below show that TVM generated kernel (with schdule optimization) brings at least <b><em>13X</em></b> speed-up for batch matmul computation, and a futher speed up with operator fusion enabled.</p>
+
+<p style="text-align: center"><img src="/images/nmt-transformer/batch-matmul-bar-charts.png" alt="image" width="45%" /></p>
+
+<h2 id="batch-matmul">Batch Matmul</h2>
+
+<h3 id="why-batch-matmul">Why batch matmul</h3>
+<p>In Transformer, batch matmul is widely used in the computation of multi-head attention. Using batch matmul, multiple heads in the attention layer can run in parallel, which can help improve the computation efficiency of the hardware.</p>
+
+<p style="text-align: center"><img src="/images/nmt-transformer/batchmatmul.png" alt="image" width="90%" /></p>
+
+<p>We conducted a thorough profiling of the Transformer model in the inference phase, and it is shown that batch matmul computation contribute up to ~ 30% of GPU kernel execution time. Using nvprof[2] to do some first-principle analysis of cuBLAS’s batch matmul kernel,it is clearly indicated that current implementation is quite under-performing and several interesting phenomena are observed.</p>
+
+<h3 id="what-is-batch-matmul">What is batch matmul</h3>
+<p>Typically, a batch matmul computation performs the matrix-matrix multiplication over a batch of matrices. The batch is considered to be “uniform”, i.e. all instances have the same dimensions (M, N, K), leading dimensions (lda, ldb, ldc) and transpositions for their respective A, B and C matrices.</p>
+
+<p>Batch matmul computation can be described more concretely as follows:</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>void BatchedGemm(input A, input B, output C, M, N, K, batch_dimension) {
+  for (int i = 0; i &lt; batch_dimension; ++i)  {
+    DoGemm(A[i],B[i],C[i],M,K,N)
+  }
+}
+</code></pre></div></div>
+
+<h4 id="batch-matmul-shapes">Batch matmul shapes</h4>
+
+<p>In the language translation tasks, shape of the batch matmul is significantly smaller than normal matmul computation in other workloads. The shape in Transformer is relevant to the length of input sentences and that of decoder steps. Normally, it is smaller than 30.</p>
+
+<p>As to the batch dimension, it is a fixed number given a certain inference batch size. For instance, if 16 is used as batch size with beam size being 4, the batch dimension is 16 * 4 * #head (number of heads in multi-head attention, which is usually 8). The shape of the matrix M, K, N are within the range of  [1, max decode length] or [1, max encode length].</p>
+
+<h3 id="performance-issue-of-cublas-batch-matmul">Performance issue of cuBLAS’ batch matmul</h3>
+
+<p>Firstly, we make a theoretical FLOPs analysis over the batch matmul kernels. The results are quite interesting: all the batch matmul have limited computation intensity (less than 1 TFLOPs).</p>
+
+<p>Then we profile the cuBLAS performance of batch matmul with multiple shapes through nvprof. The table below shows some of the metrics obtained on a NVIDIA M40 GPU with CUDA8.0.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>input shape <br /> [batch, M, N, K]</th>
+      <th>kernel</th>
+      <th>theoretical FLOPs</th>
+      <th>nvprof observed FLOPs</th>
+      <th>theoretical FLOPs / <br /> observed FLOPs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>[512, 17, 17, 128]</td>
+      <td><strong>maxwell_sgemmBatched_128x128_raggedMn_tn</strong></td>
+      <td>18939904</td>
+      <td>2155872256</td>
+      <td>0.87%</td>
+    </tr>
+    <tr>
+      <td>[512, 1, 17, 128]</td>
+      <td><strong>maxwell_sgemmBatched_128x128_raggedMn_tn</strong></td>
+      <td>1114112</td>
+      <td>2155872256</td>
+      <td>0.052%</td>
+    </tr>
+    <tr>
+      <td>[512, 17, 1, 128]</td>
+      <td><strong>maxwell_sgemmBatched_128x128_raggedMn_tn</strong></td>
+      <td>1114112</td>
+      <td>2155872256</td>
+      <td>0.052%</td>
+    </tr>
+    <tr>
+      <td>[512, 30, 30, 128]</td>
+      <td><strong>maxwell_sgemmBatched_128x128_raggedMn_tn</strong></td>
+      <td>58982400</td>
+      <td>2155872256</td>
+      <td>2.74%</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Even with different shapes (varing in M, N, K), all the <strong>maxwell_sgemmBatched_128x128_raggedMn_tn</strong> calls execute the same amount of FLOPs, which is much bigger than the theoretical value. It can be inferred that all these different shapes may be padded to a certain shape. Among all these shapes, even in the best case, the theoretical FLOPs is still only 2.74% of the actually executed FLOPs, <em>therefore most of the computation is quite redundant</em>. Similarly, the ca [...]
+
+<p><b>It is obvious that cuBLAS’ batch matmul implementation is far from efficiency. Thus we use TVM to generate efficient batch matmul kernels for our NMT workloads.</b></p>
+
+<h2 id="batch-matmul-computation">Batch matmul computation</h2>
+
+<p>In TVM, a general batch matmul computation can be declared as:</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code># computation representation
+A = tvm.placeholder((batch, M, K), name='A')
+B = tvm.placeholder((batch, K, N), name='B')
+k = tvm.reduce_axis((0, K), 'k')
+C = tvm.compute((batch, M, N),
+         lambda b, y, x: tvm.sum(A[b, y, k] * B[b, k, x], axis = k),
+         name = 'C')
+</code></pre></div></div>
+
+<h2 id="schedule-optimization">Schedule optimization</h2>
+
+<p>After declaring the computation, we need to devise our own schedule carefully to squeeze performance potential.</p>
+
+<h3 id="tuning-parameters-of-blockthread-numbers">Tuning parameters of block/thread numbers</h3>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  # thread indices
+  block_y = tvm.thread_axis("blockIdx.y")
+  block_x = tvm.thread_axis("blockIdx.x")
+  thread_y = tvm.thread_axis((0, num_thread_y), "threadIdx.y")
+  thread_x = tvm.thread_axis((0, num_thread_x), "threadIdx.x")
+  thread_yz = tvm.thread_axis((0, vthread_y), "vthread", name="vy")
+  thread_xz = tvm.thread_axis((0, vthread_x), "vthread", name="vx")
+
+  # block partitioning
+  BB, FF, MM, PP = s[C].op.axis
+  BBFF = s[C].fuse(BB, FF)
+  MMPP = s[C].fuse(MM, PP)
+  by, ty_block = s[C].split(BBFF, factor = num_thread_y * vthread_y)
+  bx, tx_block = s[C].split(MMPP, factor = num_thread_x * vthread_x)
+  s[C].bind(by, block_y)
+  s[C].bind(bx, block_x)
+  vty, ty = s[C].split(ty_block, nparts = vthread_y)
+  vtx, tx = s[C].split(tx_block, nparts = vthread_x)
+  s[C].reorder(by, bx, vty, vtx, ty, tx)
+  s[C].reorder(by, bx, ty, tx)
+  s[C].bind(ty, thread_y)
+  s[C].bind(tx, thread_x)
+  s[C].bind(vty, thread_yz)
+  s[C].bind(vtx, thread_xz)
+</code></pre></div></div>
+<p>We fuse the outer dimensions of the batch matmul, i.e. the BB and FF of the op’s dimension, normally known as “batch” dimension in batch matmul computation. Then we split the outer and the inner dimensions by a factor of (<code class="highlighter-rouge">number_thread * vthread</code>).</p>
+
+<p>Strided pattern is not needed in batch matmul, thus the virtual thread number (<code class="highlighter-rouge">vthread_y</code> and <code class="highlighter-rouge">vthread_x</code>) are both set to 1.</p>
+
+<h4 id="finding-the-best-combination-of-number_thread">Finding the best combination of number_thread</h4>
+
+<p>The results below are obtained on a NVIDIA M40 GPU device with CUDA8.0.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Input Shape [batch,features,M,N,K]</th>
+      <th>num_thread_y, num_thread_x</th>
+      <th>num_vthread_y, num_vthread_x</th>
+      <th>Time(us)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>[64,8,1,17,128]</td>
+      <td>8,1</td>
+      <td>32,1</td>
+      <td>37.62</td>
+    </tr>
+    <tr>
+      <td>[64,8,1,17,128]</td>
+      <td>4,1</td>
+      <td>32,1</td>
+      <td>39.30</td>
+    </tr>
+    <tr>
+      <td>[64,8,1,17,128]</td>
+      <td>1,1</td>
+      <td>32,1</td>
+      <td>38.82</td>
+    </tr>
+    <tr>
+      <td>[64,8,1,17,128]</td>
+      <td>1,1</td>
+      <td>256,1</td>
+      <td>41.95</td>
+    </tr>
+    <tr>
+      <td>[64,8,1,17,128]</td>
+      <td>32,1</td>
+      <td>1,1</td>
+      <td>94.61</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>As learned from <a href="http://tvmlang.org/2017/08/22/Optimize-Deep-Learning-GPU-Operators-with-TVM-A-Depthwise-Convolution-Example.html">past experience</a>, the method to find the best combination of <code class="highlighter-rouge">num_thread_y</code> and <code class="highlighter-rouge">num_thread_x</code> is through brute-force search. After a brute-force search, the best combination for current shape can be found, which in current computation is <code class="highlighter-rouge">nu [...]
+
+<h2 id="fuse-batch-matmul-with-other-operations">Fuse batch matmul with other operations</h2>
+
+<p>Normally, the existing “black-box” cuBLAS library calls play the role as the boundary of the normally used “op fusion” optimization tactics. However, with the generated efficient batch matmul kernel, the fusion boundary can be easily broken, more than just element-wise operations can be fused, thus futher performance improvement can be obtained.</p>
+
+<p>It is observed from the the computation graph that a batch matmul is always followed by a <em>broadcast add</em> operation or a <em>transpose</em> operation. By fusing “add” or “transpose” operation with batch matmul, kernel launch overhead and redundant memory access time can be reduced.</p>
+
+<p>Batch matmul and broadcast add fusion computation can be declared as follows:</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code># computation representation
+A = tvm.placeholder((batch_size, features, M, K), name='A')
+# the shape of B is (N, K) other than (K, N) is because B is transposed is this fusion pattern
+B = tvm.placeholder((batch_size, features, N, K), name='B')
+ENTER = tvm.placeholder((batch_size, 1, M, N), name = 'ENTER')
+k = tvm.reduce_axis((0, K), 'k')
+C = tvm.compute(
+           (batch_size, features, M, N),
+           lambda yb, yf, m, x: tvm.sum(A[yb, yf, m, k] * B[yb, yf, x, k], axis = k),
+           name = 'C')
+D = topi.broadcast_add(C, ENTER)
+</code></pre></div></div>
+
+<p>Batch matmul and transpose fusion computation can be declared as:</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code># computation representation
+A = tvm.placeholder((batch_size, features, M, K), name='A')
+B = tvm.placeholder((batch_size, features, K, N), name='B')
+k = tvm.reduce_axis((0, K), 'k')
+C = tvm.compute(
+           (batch_size, M, features, N),
+           lambda yb, m, yf, x: tvm.sum(A[yb, yf, m, k] * B[yb, yf, k, x], axis = k),
+           name = 'C')
+</code></pre></div></div>
+<h3 id="fusion-kernel-performance">Fusion Kernel Performance</h3>
+
+<p>The shape of [batch=64, heads=8, M=1, N=17, K=128] is chosen to elaborate the performance of the generated code. 17 is chosen as the sequence length since it is the average input length in our production scenarios.</p>
+
+<ul>
+  <li>tf-r1.4 <code class="highlighter-rouge">BatchMatmul</code>: 513.9 us</li>
+  <li>tf-r1.4 <code class="highlighter-rouge">BatchMatmul</code> + <code class="highlighter-rouge">Transpose</code> (separate): 541.9 us</li>
+  <li>TVM <code class="highlighter-rouge">BatchMatmul</code>: 37.62 us</li>
+  <li>TVM <code class="highlighter-rouge">BatchMatmul</code> + <code class="highlighter-rouge">Transpose</code> (fused): 38.39 us</li>
+</ul>
+
+<p>The kernel fusion optimization brings a further <b><em>1.7X</em></b> speed-up.</p>
+
+<h2 id="integration-with-tensorflow">Integration with Tensorflow</h2>
+
+<p>The input shape of batch matmul in our workload is finite and can be enumerated easily in advance. With those pre-defined shapes, we can generate highly optimized CUDA kernel ahead of time (fixed shape computation could bring the best optimization potential). Meanwhile, a general batch matmul kernel suitable for most of the shapes will also be generated to provide a fall-back machanism for the shapes which does not have a corresponding ahead-of-time generated kernel.</p>
+
+<p>The generated efficient kernels for specific shapes and the fall-back one are integrated into the Tensorflow framework. We develop fused ops, such as BatchMatMulTranspose or BatchMatMulAdd, to launch the specific generated kernel using TVM’s runtime API for certain input shape or invoke the fall-back kernel. A graph optimization pass is conducted to automatically replace the origin batch <em>matmul + add/transpose</em> pattern with the fused ops. Meanwhile, by combining a more aggress [...]
+
+<h2 id="summary">Summary</h2>
+<p>Inside Alibaba, we found that TVM is a very productive tool to develop high performance GPU kernels to meet our in-house requirements. In this blog, NMT Transformer model is taken as an example to illustrate our optimization strategy with TVM. Firstly, we locate the hot-spot of Transformer model through first-principle analysis. Then we use TVM to generate highly optimized CUDA kernel to replace cuBLAS version (<b><em>13X</em></b> speed-up is observed). Next, we leverage TVM’s kernel  [...]
+
+<h2 id="resources">Resources</h2>
+<ul>
+  <li><a href="https://github.com/Orion34C/tvm-batch-matmul-example/blob/master/tvm_batch_matmul_transpose_m1_kX.py">TVM implementation of fused batch matmul + transpose computation</a></li>
+</ul>
+
+<h2 id="references">References</h2>
+<p>[1] <a href="https://arxiv.org/pdf/1706.03762.pdf">Attention is All You Need</a></p>
+
+<p>[2] <a href="https://devblogs.nvidia.com/cuda-pro-tip-nvprof-your-handy-universal-gpu-profiler/">nvprof is Your Handy Universal GPU Profiler</a></p>
+
+<p>[3] <a href="https://github.com/tensorflow/tensorflow/pull/16306">Add Loop Invariant Node Motion Optimization in GraphOptimizer</a></p>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/07/12/vta-release-announcement.html b/2018/07/12/vta-release-announcement.html
new file mode 100644
index 0000000..08c2b6e
--- /dev/null
+++ b/2018/07/12/vta-release-announcement.html
@@ -0,0 +1,334 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>VTA: An Open, Customizable Deep Learning Acceleration Stack </title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>VTA: An Open, Customizable Deep Learning Acceleration Stack  </h1>
+      <p class="post-meta">
+        <time datetime="2018-07-12T00:00:00-07:00" itemprop="datePublished">
+          Jul 12, 2018
+        </time>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p style="text-align: center">Thierry Moreau(VTA architect), Tianqi Chen(TVM stack), Ziheng Jiang†(graph compilation), Luis Vega(cloud deployment)</p>
+<p style="text-align: center">Advisors: Luis Ceze, Carlos Guestrin, Arvind Krishnamurthy</p>
+<p style="text-align: center">Paul G. Allen School of Computer Science &amp; Engineering, University of Washington</p>
+
+<p>Hardware acceleration is an enabler for ubiquitous and efficient deep learning. With hardware accelerators appearing in the datacenter and edge devices, hardware specialization has taken on a prominent role in the deep learning system stack.</p>
+
+<p>We are excited to announce the launch of the Versatile Tensor Accelerator (VTA, pronounced <em>vita</em>), an open, generic, and customizable deep learning accelerator design. VTA is a programmable accelerator that exposes a RISC-like programming abstraction to describe tensor-level operations. We designed VTA to expose the most salient and common characteristics of mainstream deep learning accelerators, such as tensor operations, DMA load/stores, and explicit compute/memory arbitration.</p>
+
+<p>VTA is more than a standalone accelerator design: it’s an end-to-end solution that includes drivers, a JIT runtime, and an optimizing compiler stack based on TVM. The current release includes a behavioral hardware simulator, as well as the infrastructure to deploy VTA on low-cost FPGA hardware for fast prototyping. By extending the TVM stack with a customizable, and open source deep learning hardware accelerator design, we are exposing a transparent end-to-end deep learning stack from [...]
+
+<p style="text-align: center"><img src="https://raw.githubusercontent.com/uwsaml/web-data/master/vta/blogpost/vta_stack.png" alt="image" width="50%" /></p>
+
+<p>The VTA and TVM stack together constitute a blueprint for end-to-end, accelerator-centric deep learning system that can:</p>
+
+<ul>
+  <li>Provide an open deep learning system stack for hardware, compilers, and systems researchers alike to incorporate optimizations and co-design techniques.</li>
+  <li>Lower the barrier of entry for machine learning practitioners to experiment with novel network architectures, operators and data representations that require specialized hardware support.</li>
+</ul>
+
+<h2 id="use-case-scenarios-for-researchers">Use-Case Scenarios for Researchers</h2>
+
+<p>We highlight ways in which the VTA design together with a complete TVM software stack can enable novel opportunities across hardware, compilers, and deep learning research.</p>
+
+<h3 id="hardware-designers-and-computer-architects">Hardware Designers and Computer Architects</h3>
+
+<p>With new ASIC designs being regularly announced, providing a complete and usable software stack on top of novel hardware is essential to gain a competitive edge both in research circles, and commercially.
+Our VTA release provides a reference TVM software stack built for hardware accelerators.
+We hope to empower hardware designers to quickly build and deploy optimized deep learning libraries ready to be utilized by high-level frameworks of the likes of TensorFlow or PyTorch.
+Software support is essential for performing full-system evaluation to understand the limits and performance bottlenecks in hardware-accelerated systems.
+With the use of FPGAs as hardware deployment backends, we provide a complete solution for rapid and iterative hardware design prototyping.
+Finally, our vision is to see VTA grow into an collection of hardware designs, eventually leading to an open ecosystem of custom hardware accelerators.</p>
+
+<p style="text-align: center"><img src="https://www.acm.org/binaries/content/gallery/acm/ctas/publications/artifact-badges.jpg/artifact-badges.jpg/acm%3Adesktopcta" alt="image" width="20%" /></p>
+
+<p>In addition, VTA is one of the first hardware-software reproducible <a href="http://ctuning.org/ae/">ACM artifacts</a>, which can serve as a template for reproducible deep learning architecture research.
+The VTA artifact deployable using <a href="http://cknowledge.org/">CK</a>, was presented at ReQuEST 2018, co-located with <a href="http://cknowledge.org/request-cfp-asplos2018.html">ASPLOS</a>.</p>
+
+<h3 id="optimizing-compilers-researchers">Optimizing Compilers Researchers</h3>
+
+<p>Novel intermediate representations and optimizing compilers of the likes of TVM have been proposed to better take advantage of deep learning workloads characteristics.
+VTA complements TVM to provide accelerator-centric optimization passes, and low-level code generation. Our open-source deep learning compiler stack also aims to emulate the success of LLVM, by allowing the community to improve accelerator-centric compiler support over time, particularly as more hardware variants of VTA emerge.
+The extendability of the compiler stack, combined with the ability to modify the architecture and the programming interface of the hardware back-end should lead to exciting opportunities in hardware-software co-design for deep learning.</p>
+
+<h3 id="deep-learning-researchers">Deep Learning Researchers</h3>
+
+<p>A transparent and customizable software and hardware stack empowers deep learning researchers to come up with novel neural network operators, and data representations, all the while enabling the complete evaluation of those optimizations on end-to-end systems. Techniques like binarization are currently limited to CPU and GPU evaluations, unless significant engineering resources are dedicated to produce an FPGA or ASIC design that can evaluate the technique’s full energy savings potent [...]
+
+<h2 id="technical-details">Technical Details</h2>
+
+<h3 id="stack-overview">Stack Overview</h3>
+
+<p>The VTA deep learning accelerator and TVM stack can bridge the gap between productivity-oriented deep learning frameworks, and performance-focused hardware substrates, such as FPGAs.</p>
+<ul>
+  <li>NNVM, the graph-level optimizer, provides a graph-level Intermediate Representation (IR) used as a common language between different deep learning frameworks to take advantage of graph-level optimizations, such as operator fusion. The NNVM IR is also used to specify data layout and data format constraints: e.g. tiling for tensorization, and bit-packing for ultra-low precision computing.</li>
+  <li>TVM, the tensor-level optimizer, builds upon the Halide DSL and schedule primitives to provide an optimizing compiler capable of bringing performance portability for deep learning across hardware back-ends. TVM brings novel scheduling primitives that target specialized hardware accelerators, such as tensorization, which lowers computation onto specialized tensor-tensor hardware instructions. In addition, it provides schedule primitives and lowering rules that allow for explicit mem [...]
+  <li>The VTA runtime performs JIT compilation of VTA binaries (instruction streams and micro-kernel code), manages shared memory, and performs synchronization to hand off execution to VTA. The VTA runtime presents an API that looks generic to TVM, to hide complexities of platform-specific bookkeeping tasks. It exposes a C++ API that a TVM module can call into - this simplifies the future inclusion of other hardware accelerator designs, without having to drastically modify the upper TVM  [...]
+  <li>VTA’s two-level ISA provides both (1) a high-level CISC ISA that describes variable latency operations such as DMA loads, or deep learning operators and (2) a low-level, and fixed latency RISC ISA that describe low-level matrix-matrix operations. This two-level ISA allows both code compactness, and expressiveness.</li>
+  <li>Finally, VTA’s micro-architecture provides a flexible deep learning hardware design specification, that can be conveniently compiled onto other FPGA platforms, and eventually in the long term down to ASICs.</li>
+</ul>
+
+<h3 id="vta-hardware-design-overview">VTA Hardware Design Overview</h3>
+
+<p>The Vanilla Tensor Accelerator (VTA) is a generic deep learning accelerator built around a GEMM core, which performs dense matrix multiplication at a high computational throughput.
+The design is inspired by mainstream deep learning accelerators, of the likes of Google’s TPU accelerator. The design adopts decoupled access-execute to hide memory access latency and maximize utilization of compute resources. To a broader extent, VTA can serve as a template deep learning accelerator design, exposing a clean tensor computation abstraction to the compiler stack.</p>
+
+<p style="text-align: center"><img src="https://raw.githubusercontent.com/uwsaml/web-data/master/vta/blogpost/vta_overview.png" alt="image" width="60%" /></p>
+
+<p>The figure above presents a high-level overview of the VTA hardware organization. VTA is composed of four modules that communicate between each other via FIFO queues and single-writer/single-reader SRAM memory blocks, to allow for task-level pipeline parallelism.
+The compute module performs both dense linear algebra computation with its GEMM core, and general computation with its tensor ALU.
+It operates on a register file which instead of storing scalar values, stores tensors of rank 1 or 2.
+The micro-op cache stores low-level code that dictates a sequence of operations to mutate the register file.</p>
+
+<p>The VTA hardware design template offers modularity to the user, with the option to modify hardware datatypes, memory architecture, the GEMM core dimensions, hardware operators, and pipelining stages.
+Exposing multiple variants of VTA to the compiler stack facilitates the developments of compilers, since we can test TVM’s ability to target an multitude of hardware accelerators, rather than a single design.</p>
+
+<h3 id="vta-prototyping-with-vta-simulator-and-pynq-fpga-board">VTA Prototyping with VTA Simulator and Pynq FPGA Board</h3>
+
+<p>The VTA release allows users to experiment with hardware acceleration, and accelerator-centric compiler optimizations in two ways.
+The first approach, which doesn’t require special hardware is to run deep learning workloads on a behavioral simulator of the VTA design.
+This simulator back-end is readily available for developers to experiment with.
+The second approach relies on an off-the-shelf and low-cost FPGA development board – the <a href="http://www.pynq.io/">Pynq board</a>, which exposes a reconfigurable FPGA fabric and an ARM SoC.</p>
+
+<p style="text-align: center"><img src="https://raw.githubusercontent.com/uwsaml/web-data/master/vta/blogpost/vta_system.png" alt="image" width="70%" /></p>
+
+<p>The VTA release offers a simple compilation and deployment flow of the VTA hardware design and TVM workloads on the Pynq platform, with the help of an RPC server interface.
+The RPC server handles FPGA reconfiguration tasks and TVM module invocation offloading onto the VTA runtime.
+The VTA runtime system runs on the ARM CPU of the Pynq embedded system, and generates VTA binaries on the fly to offload to the FPGA hardware.
+This complete solution allows for out-of-the-box prototyping on low-cost FPGAs, with an interactive and familiar Python environment, hiding much of the complexity and headaches of FPGA design away from the user.</p>
+
+<p>For programmers familiar with hardware and FPGAs, we expose the VTA design expressed in HLS C, and provide scripts built on top of the Xilinx toolchains to compile the design into an FPGA bitstream.
+We are currently building a repository of VTA variants, so that users can explore different design variants for their deep learning workloads without having to go through the time consuming FPGA compilation process.</p>
+
+<h2 id="performance-assessment">Performance Assessment</h2>
+
+<p><em>VTA is at its early stages of development and we expect more performance improvements and optimizations to come.
+As of now we offer end-to-end performance evaluations on the low-cost Pynq board which incorporates a dated 28nm FPGA fabric.
+While this platform is meant for prototyping (the 2012 FPGA cannot compete with modern ASICs), we are porting VTA to newer high-performance FPGA platforms that will offer more competitive performance.</em></p>
+
+<p><em>We are working on more experiments and will release new results as they are obtained.</em></p>
+
+<h3 id="resource-utilization-on-resnet-18">Resource Utilization on ResNet-18</h3>
+
+<p>A popular method used to assess the efficient use of hardware are roofline diagrams: given a hardware design, how efficiently are different workloads utilizing the hardware compute and memory resources. The roofline plot below shows the throughput achieved on different convolution layers of the ResNet-18 inference benchmark. Each layer has a different arithmetic intensity, i.e. compute to data movement ratio.
+In the left half, convolution layers are bandwidth limited, whereas on the right half, they are compute limited.</p>
+
+<p style="text-align: center"><img src="https://raw.githubusercontent.com/uwsaml/web-data/master/vta/blogpost/vta_roofline.png" alt="image" width="60%" /></p>
+
+<p>The goal behind designing a hardware architecture, and a compiler stack is to bring each workload as close as possible to the roofline of the target hardware.
+The roofline plot shows the effects of having the hardware and compiler work together to maximize utilization of the available hardware resources.
+The technique showcased is latency hiding, which requires explicit dependence tracking at the hardware level, compiler support to partition work, explicit dependence insertion in the instruction stream during code-generation.
+The result is an overall higher utilization of the available compute and memory resources.</p>
+
+<h3 id="end-to-end-resnet-18-evaluation">End to end ResNet-18 evaluation</h3>
+
+<p style="text-align: center"><img src="https://raw.githubusercontent.com/uwsaml/web-data/master/vta/blogpost/vta_e2e.png" alt="image" width="60%" /></p>
+
+<p>A benefit of having a complete compiler stack built for VTA is the ability to run end-to-end workloads. This is compelling in the context of hardware acceleration because we need to understand what performance bottlenecks, and Amdahl limitations stand in the way to obtaining faster performance.
+The bar plot above shows inference performance with and without offloading the ResNet convolutional layers to the FPGA-based VTA design, on the Pynq board’s ARM Cortex A9 SoC.
+At a glance, it iss clear that VTA accomplishing its goal, reducing the time it takes to perform convolutions on the CPU (dark blue).
+However, it becomes apparent that other operators need offloading, as they now constitute a new bottleneck.
+This kind of high-level visibility is essential to system designers who want to understand how systems affect end-to-end performance.</p>
+
+<h2 id="open-source-effort">Open Source Effort</h2>
+<p>VTA is research effort at the Paul G. Allen School Computer Science and Engineering at University of Washington, and is now integrated into the TVM stack. The TVM project follows the Apache open-source model, to create a community maintained project. You are more than welcome to join us and lead the effort.</p>
+
+<h2 id="acknowledgements">Acknowledgements</h2>
+<p>VTA is a research project that came out of the SAML group, which is generously supported by grants from DARPA and the National Science Foundation and gifts from Huawei, Oracle, Intel and anonymous donors.</p>
+
+<h2 id="get-started">Get Started!</h2>
+<ul>
+  <li>TVM and VTA Github page can be found here: <a href="https://github.com/dmlc/tvm">https://github.com/dmlc/tvm</a>.</li>
+  <li>You can get started with easy to follow <a href="https://tvm.apache.org/docs//vta/tutorials/index.html">tutorials on programming VTA with TVM</a>.</li>
+  <li>For more technical details on VTA, read our <a href="https://arxiv.org/abs/1807.04188">VTA technical report</a> on ArXiv.</li>
+</ul>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/08/10/DLPack-Bridge.html b/2018/08/10/DLPack-Bridge.html
new file mode 100644
index 0000000..9849d29
--- /dev/null
+++ b/2018/08/10/DLPack-Bridge.html
@@ -0,0 +1,335 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Building a Cross-Framework Deep Learning Compiler via DLPack</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Building a Cross-Framework Deep Learning Compiler via DLPack </h1>
+      <p class="post-meta">
+        <time datetime="2018-08-10T00:00:00-07:00" itemprop="datePublished">
+          Aug 10, 2018
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Eddie Yan</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>Deep learning frameworks such as Tensorflow, PyTorch, and ApacheMxNet provide a
+powerful toolbox for quickly prototyping and deploying deep learning models.
+Unfortunately, their ease-of-use has often come at the cost of fragmentation: it
+is only easy to use each framework in isolation. Vertical integration has made
+development streamlined for common use cases, but venturing off of the beaten
+path can be tricky.</p>
+
+<p>One scenario that is poorly supported is passing tensors
+<em>directly</em> from one framework to another in memory, without any data duplication
+or copies. Supporting such a use case would enable users to string together
+pipelines where certain operators are better supported in one framework (or
+faster) than another efficiently. A shared data representation between
+frameworks would also bridge this gap, and allow compiler stacks to target a
+single format when generating code for operators.</p>
+
+<p><a href="https://github.com/dmlc/dlpack">DLPack</a> is an intermediate in-memory
+representation standard for tensor data structures. With DLPack as a common
+representation, we can leverage TVM in scripts written for frameworks that
+traditionally could only rely on vendor-provided libraries. TVM packed functions
+can operate on DLPack tensors, providing wrappers bridging tensor data
+structures from frameworks such as PyTorch and MxNet <em>with zero-data-copy</em>.</p>
+
+<p>DLPack presents a simple, portable in-memory data structure:</p>
+<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*!
+ * \brief Plain C Tensor object, does not manage memory.
+ */</span>
+<span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
+  <span class="cm">/*!
+   * \brief The opaque data pointer points to the allocated data.
+   *  This will be CUDA device pointer or cl_mem handle in OpenCL.
+   *  This pointer is always aligns to 256 bytes as in CUDA.
+   */</span>
+  <span class="kt">void</span><span class="o">*</span> <span class="n">data</span><span class="p">;</span>
+  <span class="cm">/*! \brief The device context of the tensor */</span>
+  <span class="n">DLContext</span> <span class="n">ctx</span><span class="p">;</span>
+  <span class="cm">/*! \brief Number of dimensions */</span>
+  <span class="kt">int</span> <span class="n">ndim</span><span class="p">;</span>
+  <span class="cm">/*! \brief The data type of the pointer*/</span>
+  <span class="n">DLDataType</span> <span class="n">dtype</span><span class="p">;</span>
+  <span class="cm">/*! \brief The shape of the tensor */</span>
+  <span class="kt">int64_t</span><span class="o">*</span> <span class="n">shape</span><span class="p">;</span>
+  <span class="cm">/*!
+   * \brief strides of the tensor,
+   *  can be NULL, indicating tensor is compact.
+   */</span>
+  <span class="kt">int64_t</span><span class="o">*</span> <span class="n">strides</span><span class="p">;</span>
+  <span class="cm">/*! \brief The offset in bytes to the beginning pointer to data */</span>
+  <span class="kt">uint64_t</span> <span class="n">byte_offset</span><span class="p">;</span>
+<span class="p">}</span> <span class="n">DLTensor</span><span class="p">;</span>
+</code></pre></div></div>
+
+<p>As an example, we declare and compile a matrix multiplication operator in TVM,
+and build a wrapper that uses the DLPack representation to allow this operator
+to support PyTorch tensors. We also repeat this demonstration with MxNet. This
+extension allows machine learning developers to quickly port research code to
+relatively unsupported hardware platforms without sacrificing performance.</p>
+
+<p>Illustration of how DLPack provides an intermediate wrapper that is shared
+between frameworks and TVM:</p>
+<p style="text-align: center"><img src="/images/pytorch-dlpack/dlpack.png" alt="image" width="65%" /><br />
+Figure 1</p>
+
+<p>First, we compute a reference output in PyTorch:</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kn">import</span> <span class="nn">torch</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">56</span><span class="p">,</span><span class="mi">56</span><span class="p">)</span>
+    <span class="n">y</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">56</span><span class="p">,</span><span class="mi">56</span><span class="p">)</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">mm</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>We then define and build a TVM matrix multiplication operator, using the default
+schedule:</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">n</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">convert</span><span class="p">(</span><span class="mi">56</span><span class="p">)</span>
+    <span class="n">X</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">placeholder</span><span class="p">((</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'X'</span><span class="p">)</span>
+    <span class="n">Y</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">placeholder</span><span class="p">((</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'Y'</span><span class="p">)</span>
+
+    <span class="n">k</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'k'</span><span class="p">)</span>
+    <span class="n">Z</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">((</span><span class="n">n</span><span class="p">,</span><span class="n">n</span><span class="p">),</span> <span class="k">lambda</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span> <span class="p">:</span> <span class="n">tvm</span><span class="o">.</span><span class="nb">sum</span><span class="p">(</span><span  [...]
+    <span class="n">s</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">create_schedule</span><span class="p">(</span><span class="n">Z</span><span class="o">.</span><span class="n">op</span><span class="p">)</span>
+    <span class="n">fmm</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span><span class="p">],</span> <span class="n">target_host</span><span class="o">=</span><span class="s">'llvm'</span><span class="p">,</span> < [...]
+</code></pre></div></div>
+<p>For brevity, we do not cover TVM’s large collection of scheduling primitives
+that we can use to optimize matrix multiplication. If you wish to make a custom
+GEMM operator run <em>fast</em> on your hardware device, a detailed tutorial can be
+found <a href="https://tvm.apache.org/docs//tutorials/optimize/opt_gemm.html">here</a>.</p>
+
+<p>We then convert the TVM function into one that supports PyTorch tensors:</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kn">from</span> <span class="nn">tvm.contrib.dlpack</span> <span class="kn">import</span> <span class="n">to_pytorch_func</span>
+    <span class="c1"># fmm is the previously built TVM function (Python function)
+</span>    <span class="c1"># fmm is the wrapped TVM function (Python function)
+</span>    <span class="n">fmm_pytorch</span> <span class="o">=</span> <span class="n">to_pytorch_func</span><span class="p">(</span><span class="n">fmm</span><span class="p">)</span>
+    <span class="n">z2</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">56</span><span class="p">,</span><span class="mi">56</span><span class="p">)</span>
+    <span class="n">fmm_pytorch</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z2</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">testing</span><span class="o">.</span><span class="n">assert_allclose</span><span class="p">(</span><span class="n">z</span><span class="o">.</span><span class="n">numpy</span><span class="p">(),</span> <span class="n">z2</span><span class="o">.</span><span class="n">numpy</span><span class="p">())</span>
+</code></pre></div></div>
+<p>and verify that the results match.</p>
+
+<p>We can repeat the same example, but using MxNet instead:</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kn">import</span> <span class="nn">mxnet</span>
+    <span class="kn">from</span> <span class="nn">tvm.contrib.mxnet</span> <span class="kn">import</span> <span class="n">to_mxnet_func</span>
+    <span class="n">ctx</span> <span class="o">=</span> <span class="n">mxnet</span><span class="o">.</span><span class="n">cpu</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">mxnet</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">56</span><span class="p">,</span><span class="mi">56</span><span class="p">),</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
+    <span class="n">y</span> <span class="o">=</span> <span class="n">mxnet</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">56</span><span class="p">,</span><span class="mi">56</span><span class="p">),</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="n">mxnet</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">56</span><span class="p">,</span><span class="mi">56</span><span class="p">),</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
+    <span class="n">f</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span><span class="p">],</span> <span class="n">target_host</span><span class="o">=</span><span class="s">'llvm'</span><span class="p">,</span> <sp [...]
+    <span class="n">f_mxnet</span> <span class="o">=</span> <span class="n">to_mxnet_func</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
+    <span class="n">f_mxnet</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">testing</span><span class="o">.</span><span class="n">assert_allclose</span><span class="p">(</span><span class="n">z</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(),</span> <span class="n">x</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">y</span><span class="o">. [...]
+</code></pre></div></div>
+
+<h2 id="under-the-hood-of-the-pytorch-example">Under the hood of the PyTorch Example</h2>
+<p>As TVM provides <a href="https://github.com/dmlc/tvm/blob/master/include/tvm/runtime/c_runtime_api.h#L455">functions</a> to convert dlpack tensors to tvm <code class="highlighter-rouge">NDArray</code>s and
+vice-versa, so all that is needed is some syntactic sugar by wrapping functions.
+<code class="highlighter-rouge">convert_func</code> is a generic converter for frameworks using tensors with dlpack
+support, and can be used to implement convenient converters, such as
+<code class="highlighter-rouge">to_pytorch_func</code>.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">convert_func</span><span class="p">(</span><span class="n">tvm_func</span><span class="p">,</span> <span class="n">tensor_type</span><span class="p">,</span> <span class="n">to_dlpack_func</span><span class="p">):</span>
+    <span class="k">assert</span> <span class="nb">callable</span><span class="p">(</span><span class="n">tvm_func</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">_wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
+        <span class="n">args</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">ndarray</span><span class="o">.</span><span class="n">from_dlpack</span><span class="p">(</span><span class="n">to_dlpack_func</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>\
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">tensor_type</span><span class="p">)</span> <span class="k">else</span> <span class="n">arg</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">tvm_func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">_wrapper</span>
+
+<span class="k">def</span> <span class="nf">to_pytorch_func</span><span class="p">(</span><span class="n">tvm_func</span><span class="p">):</span>
+    <span class="kn">import</span> <span class="nn">torch</span>
+    <span class="kn">import</span> <span class="nn">torch.utils.dlpack</span>
+    <span class="k">return</span> <span class="n">convert_func</span><span class="p">(</span><span class="n">tvm_func</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">Tensor</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">dlpack</span><span class="o">.</span><span class="n">to_dlpack</span><span class="p">)</span>
+</code></pre></div></div>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/10/03/auto-opt-all.html b/2018/10/03/auto-opt-all.html
new file mode 100644
index 0000000..87f8122
--- /dev/null
+++ b/2018/10/03/auto-opt-all.html
@@ -0,0 +1,590 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Automatic Kernel Optimization for Deep Learning on All Hardware Platforms</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Automatic Kernel Optimization for Deep Learning on All Hardware Platforms </h1>
+      <p class="post-meta">
+        <time datetime="2018-10-03T00:00:00-07:00" itemprop="datePublished">
+          Oct 3, 2018
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Lianmin Zheng, Eddie Yan, Tianqi Chen</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>Optimizing the performance of deep neural network on a diverse range of hardware platforms is still a hard
+problem for AI developers. In terms of system support, we are facing a many-to-many problem here:
+deploying trained models from multiple frontends (e.g. Tensorflow, ONNX, MXNet) to multiple
+hardware platforms (e.g. CPU, GPU, Accelerators). The most performance critical part of
+this problem is obtaining high performance kernel implementations for growing model
+architectures and hardware platforms.</p>
+
+<p>To address this challenge, TVM takes a full stack compiler approach.
+TVM combines code generation and automatic program optimization to generate kernels
+that are comparable to heavily hand-optimized libraries,
+obtaining state-of-the-art inference performance on hardware platforms including
+ARM CPUs, Intel CPUs, Mali GPUs, NVIIDA GPUs and AMD GPUs.</p>
+
+<p>In this blog post, we show the workflow of automatic kernel optimization in TVM compiler stack and 
+benchmark results on several hardware platforms.</p>
+
+<h1 id="system-overview">System Overview</h1>
+
+<p style="text-align: center"><img src="/images/autotune-all/overview.png" alt="image" width="35%" /></p>
+<center> Figure 1. System Overview </center>
+<p></p>
+
+<p>Kernel optimization in TVM is done in an iterative loop fashion.
+As shown in Figure 1, the automatic kernel optimization takes a neural network (typically in computational graph representation)
+from frontend frameworks as input, and generates kernels for all operators in this network.</p>
+
+<p>The inner loop uses a scalable RPC runtime, machine learning based tuners and a tensor compiler.
+In each round of the loop, the tuner picks a batch of promising candidate kernel implementations from a large search space,
+and profile them on real hardware. Then the tuner gets the profiling results. These profiling results are used as training 
+data to fit a prediction model. After fitting the prediction model, the tuner picks the next promising candidates according to the predictions,
+and the loop continues. This way, we search for fast kernels iteratively.</p>
+
+<p>The below figure compares traditional auto-tuning and AutoTVM. 
+The major difference is that AutoTVM is</p>
+<ul>
+  <li><strong>Scalable</strong> to heterogenous cluster of devices</li>
+  <li><strong>Learning</strong> to optimize tensor programs with a transferable machine learning cost model</li>
+</ul>
+
+<p>You can refer to our paper[1] for more details.</p>
+
+<p style="text-align: center"><img src="/images/autotune-all/autotvm.png" alt="image" width="50%" /></p>
+<center> Figure 2. Comparison of Traditional Auto-tuning and AutoTVM </center>
+<p></p>
+
+<h2 id="begin-tuning">Begin Tuning</h2>
+<p>For demonstration, we run our optimization for resnet-18 on RK3399, an ARM development board.
+The detailed instructions are omitted due to the space limit of a blog post.
+Links to tutorials for ARM CPU, Mali GPU, NVIDIA GPU, AMD GPU are all available at the end of this blog.</p>
+
+<p>First we get a pre-trained model from MXNet model zoo, and extract tuning tasks from it.</p>
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">mxnet.gluon.model_zoo.vision</span> <span class="kn">import</span> <span class="n">get_model</span>
+
+<span class="n">block</span> <span class="o">=</span> <span class="n">get_model</span><span class="p">(</span><span class="s">'resnet18_v1'</span><span class="p">,</span> <span class="n">pretrained</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+<span class="n">net</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">nnvm</span><span class="o">.</span><span class="n">frontend</span><span class="o">.</span><span class="n">from_mxnet</span><span class="p">(</span><span class="n">block</span><span class="p">)</span>
+
+<span class="n">tasks</span> <span class="o">=</span> <span class="n">autotvm</span><span class="o">.</span><span class="n">extract_from_graph</span><span class="p">(</span><span class="n">net</span><span class="p">)</span>
+<span class="n">tune_tasks</span><span class="p">(</span><span class="n">tasks</span><span class="p">,</span> <span class="o">**</span><span class="n">tuning_option</span><span class="p">)</span>
+</code></pre></div></div>
+<p>There are 12 different conv2d layers in resnet-18, so we launch 12 tuning tasks.
+For each of them, the tuner makes several hundreds of trials and picks the best one.
+After finishing all tuning tasks, we compile the whole network and generate a single deployable minimal library.
+One sample output is</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Extract tasks...
+Tuning...
+[Task  1/12]  Current/Best:   22.37/  52.19 GFLOPS | Progress: (544/1000) | 406.59 s Done.
+[Task  2/12]  Current/Best:    6.51/  18.77 GFLOPS | Progress: (608/1000) | 325.05 s Done.
+[Task  3/12]  Current/Best:    4.67/  24.87 GFLOPS | Progress: (480/1000) | 372.31 s Done.
+[Task  4/12]  Current/Best:   11.35/  46.83 GFLOPS | Progress: (736/1000) | 602.39 s Done.
+[Task  5/12]  Current/Best:    1.01/  19.80 GFLOPS | Progress: (448/1000) | 262.16 s Done.
+[Task  6/12]  Current/Best:    2.47/  23.76 GFLOPS | Progress: (672/1000) | 563.85 s Done.
+[Task  7/12]  Current/Best:   14.57/  33.97 GFLOPS | Progress: (544/1000) | 465.15 s Done.
+[Task  8/12]  Current/Best:    1.13/  17.65 GFLOPS | Progress: (576/1000) | 365.08 s Done.
+[Task  9/12]  Current/Best:   14.45/  22.66 GFLOPS | Progress: (928/1000) | 724.25 s Done.
+[Task 10/12]  Current/Best:    3.22/  15.36 GFLOPS | Progress: (864/1000) | 564.27 s Done.
+[Task 11/12]  Current/Best:   11.03/  32.23 GFLOPS | Progress: (736/1000) | 635.15 s Done.
+[Task 12/12]  Current/Best:    8.00/  21.65 GFLOPS | Progress: (1000/1000) | 1111.81 s Done.
+Compile...
+Upload...
+Evaluate inference time cost...
+Mean inference time (std dev): 162.59 ms (0.06 ms)
+</code></pre></div></div>
+
+<p>The tuning is especially helpful and worth a try if your model has some strange shapes or
+your hardware is customized, as hand-optimized static libraries cannot consider all situations.</p>
+
+<h1 id="benchmark-results">Benchmark Results</h1>
+<p>We pre-tuned some popular networks on our device cluster and released the following benchmark.
+Instructions for reproduction are at the end of this blog.</p>
+
+<p>Comprehensively benchmarking TVM is easy since we have a unified runtime interface.
+However maintaining complete, up-to-date, and correct comparisons against all other platforms is not feasible
+without expert assistance from the developers of many other projects.
+So we put all our numbers in a table, and then provide an incomplete comparison with some other libraries.</p>
+
+<h2 id="comparison">Comparison</h2>
+<p>We validate the effectiveness of our automatic optimization stack by 
+comparing with heavily optimized traditional libraries on each platform.</p>
+
+<p>We tested popular image classification networks on ImageNet (3x224x224) dataset with batch size = 1 and data type = float32.
+The reported numbers are time costs per image in milliseconds.</p>
+
+<h3 id="arm-cpu">ARM CPU</h3>
+
+<p>We choose <a href="https://github.com/Tencent/ncnn">NCNN</a>, a widely used, hand-optimized kernel library as baseline.
+It makes extensive use of NEON assembly instructions. For example, the code base contains
+<a href="https://github.com/Tencent/ncnn/blob/master/src/layer/arm/convolution_3x3.h">13k lines of code</a> for only 3x3 convolution layers.
+We reference the benchmark numbers in their project repository.
+As shown in the figure below, TVM outperforms it for all networks on Rasbperry Pi 3B.</p>
+
+<p><img src="/images/autotune-all/arm.png" alt="image" width="90%" /></p>
+
+<h3 id="mali-gpu">Mali GPU</h3>
+
+<p><a href="https://github.com/ARM-software/ComputeLibrary">ARM Compute Library</a> is a vendor provided library that supports Mali GPU (OpenCL) well.
+According to the results, TVM provides stronger performance in ResNet and MobileNet due to advantages in convolutional layers.
+TVM lags behind a bit on vgg-16 because vgg-16 is an old and huge network and has several large dense layers.</p>
+
+<p><img src="/images/autotune-all/mali.png" alt="image" width="90%" /></p>
+
+<h3 id="nvidia-gpu">NVIDIA GPU</h3>
+
+<p>On NVIDIA GPU, <a href="https://developer.nvidia.com/cudnn">CuDNN</a> and <a href="https://developer.nvidia.com/tensorrt">TensorRT</a> are two vendor-provided libraries for training and inference respectively. Since we focus on inference,
+we run our benchmark in the unbatched setting. Another tensor compiler <a href="https://github.com/plaidml/plaidml">PlaidML</a> is also reported as baseline
+as there is a previous benchmark of it compared against a pre-AutoTVM version of TVM.
+We reference its benchmark results from <a href="https://github.com/plaidml/plaidbench">PlaidBench</a>.
+According to the results below, TVM achieves parity with TensorRT performance.</p>
+
+<p><img src="/images/autotune-all/nvidia.png" alt="image" width="90%" /></p>
+
+<h3 id="amd-gpu">AMD GPU</h3>
+
+<p>We also take a quick look at a AMD GPU. TVM supports OpenCL and <a href="https://rocm.github.io/">ROCm</a> backend. We found ROCm is better since
+it is more specialized for AMD GPUs.
+<a href="https://github.com/ROCmSoftwarePlatform/MIOpen">MIOpen</a> is a vendor provided
+kernel library. TVM’s graph runtime can call MIOpen’s kernel implementations directly, so we report
+the baseline performance by using this integration.</p>
+
+<p>We didn’t do any specific optimization for AMD GPU. All computation definition and schedule code for NVIDIA GPU is directly reused.
+As a result, TVM is a little bit slower then MIOpen in most cases.
+We believe there is still room for improvement.</p>
+
+<p><img src="/images/autotune-all/amd.png" alt="image" width="90%" /></p>
+
+<h2 id="all-our-results">All Our Results</h2>
+<p>We tested the following networks on ImageNet (3x224x224) dataset with batch size = 1 and data type = float32.
+The reported numbers are time costs per image in milliseconds.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+      <th> </th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td> </td>
+      <td><strong>densenet121</strong></td>
+      <td><strong>inception v3</strong></td>
+      <td><strong>mobilenet</strong></td>
+      <td><strong>mobilenet v2</strong></td>
+      <td><strong>resnet18</strong></td>
+      <td><strong>resnet50</strong></td>
+      <td><strong>squeezenet v1.0</strong></td>
+      <td><strong>squeezenet v1.1</strong></td>
+      <td><strong>vgg16</strong></td>
+      <td><strong>vgg19</strong></td>
+    </tr>
+    <tr>
+      <td><strong>ARM CPU</strong></td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>Huawei P20 Pro</td>
+      <td>181.4</td>
+      <td>439.9</td>
+      <td>41.1</td>
+      <td>34.5</td>
+      <td>76.5</td>
+      <td>208.2</td>
+      <td>51.8</td>
+      <td>25.7</td>
+      <td>480.6</td>
+      <td>627.0</td>
+    </tr>
+    <tr>
+      <td>Google Pixel2</td>
+      <td>162.2</td>
+      <td>433.5</td>
+      <td>39.5</td>
+      <td>30.1</td>
+      <td>61.1</td>
+      <td>181.3</td>
+      <td>47.3</td>
+      <td>23.2</td>
+      <td>391.1</td>
+      <td>487.7</td>
+    </tr>
+    <tr>
+      <td>Firefly RK3399</td>
+      <td>335.9</td>
+      <td>1285.9</td>
+      <td>78.6</td>
+      <td>66.7</td>
+      <td>161.2</td>
+      <td>403.8</td>
+      <td>94.6</td>
+      <td>48.5</td>
+      <td>902.9</td>
+      <td>1090.1</td>
+    </tr>
+    <tr>
+      <td>Raspberry Pi 3B</td>
+      <td>609.5</td>
+      <td>2070.4</td>
+      <td>122.2</td>
+      <td>103.7</td>
+      <td>322.5</td>
+      <td>725.8</td>
+      <td>185.1</td>
+      <td>94.1</td>
+      <td>1759.6</td>
+      <td>2118.6</td>
+    </tr>
+    <tr>
+      <td>Xilinx PYNQ</td>
+      <td>2888.3</td>
+      <td>9709.1</td>
+      <td>723.5</td>
+      <td>514.3</td>
+      <td>1234.6</td>
+      <td>3580.5</td>
+      <td>909.9</td>
+      <td>477.3</td>
+      <td><sup>-(Note 1)</sup></td>
+      <td>-</td>
+    </tr>
+    <tr>
+      <td><strong>Mali GPU</strong></td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>Mali-T860</td>
+      <td>410.9</td>
+      <td>783.1</td>
+      <td>75.4</td>
+      <td>70.8</td>
+      <td>128.6</td>
+      <td>352.9</td>
+      <td>106.2</td>
+      <td>58.0</td>
+      <td>679.5</td>
+      <td>805.3</td>
+    </tr>
+    <tr>
+      <td><strong>NVIDIA GPU</strong></td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>GTX 1080 Ti</td>
+      <td>3.6</td>
+      <td>5.8</td>
+      <td>0.6</td>
+      <td>- <sup>(Note 2) </sup></td>
+      <td>-</td>
+      <td>2.7</td>
+      <td>-</td>
+      <td>-</td>
+      <td>4.0</td>
+      <td>4.6</td>
+    </tr>
+    <tr>
+      <td>GTX TITAN X</td>
+      <td>5.8</td>
+      <td>9.7</td>
+      <td>1.0</td>
+      <td>-</td>
+      <td>-</td>
+      <td>4.3</td>
+      <td>-</td>
+      <td>-</td>
+      <td>6.4</td>
+      <td>7.5</td>
+    </tr>
+    <tr>
+      <td><strong>AMD GPU</strong></td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>AMD Vega FE</td>
+      <td>5.7</td>
+      <td>8.8</td>
+      <td>1.0</td>
+      <td>-</td>
+      <td>-</td>
+      <td>4.5</td>
+      <td>-</td>
+      <td>-</td>
+      <td>5.9</td>
+      <td>7.0</td>
+    </tr>
+    <tr>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+  </tbody>
+</table>
+
+<ul>
+  <li>Note 1: Out of memory on this board.</li>
+  <li>Note 2: We didn’t tune some small networks on GPU due to time constraints.
+When profiling data is not available, TVM can use fallback code generation. 
+But competitive performance is not guaranteed in this scenario.</li>
+</ul>
+
+<h1 id="conclusion">Conclusion</h1>
+<p>With an expressive code generator and an efficient search algorithm, we are able to
+generate kernels that are comparable to heavily hand-optimized ones.
+Since programmer time is expensive and machine time is getting cheaper,
+we believe automatic optimization with real hardware and data in the loop will be the standard workflow
+for inference deployment. TVM just provides such a solution.</p>
+
+<h2 id="links">Links</h2>
+<p>[1] benchmark: <a href="https://github.com/dmlc/tvm/tree/master/apps/benchmark">https://github.com/dmlc/tvm/tree/master/apps/benchmark</a><br />
+[2] Tutorial on tuning for ARM CPU: <a href="https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_arm.html">https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_arm.html</a><br />
+[3] Tutorial on tuning for Mobile GPU: <a href="https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_mobile_gpu.html">https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_mobile_gpu.html</a><br />
+[4] Tutorial on tuning for NVIDIA/AMD GPU: <a href="https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_cuda.html">https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_cuda.html</a><br />
+[5] Paper about AutoTVM: <a href="https://arxiv.org/abs/1805.08166">Learning to Optimize Tensor Program</a><br />
+[6] Paper about Intel CPU (by AWS contributors) :  <a href="https://arxiv.org/abs/1809.02697">Optimizing CNN Model Inference on CPUs</a></p>
+
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/10/09/ml-in-tees.html b/2018/10/09/ml-in-tees.html
new file mode 100644
index 0000000..b7c74f2
--- /dev/null
+++ b/2018/10/09/ml-in-tees.html
@@ -0,0 +1,312 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Efficient Privacy-Preserving ML Using TVM</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Efficient Privacy-Preserving ML Using TVM </h1>
+      <p class="post-meta">
+        <time datetime="2018-10-09T00:00:00-07:00" itemprop="datePublished">
+          Oct 9, 2018
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Nick Hynes</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>This post describes Myelin, a framework for privacy-preserving machine learning in trusted hardware enclaves, and how TVM makes Myelin fast.
+The key idea is that TVM, unlike other popular ML frameworks, compiles models into lightweight, optimized, and dependency-free libraries which can fit into resource constrained enclaves.</p>
+
+<p style="text-align: center"><img src="/images/sgx/tvmfits.png" alt="TVM fits in enclaves" style="width: 80vw; max-width: 600px" /></p>
+
+<p>Give creating a privacy-preserving ML model a try! Check out the <a href="https://github.com/dmlc/tvm/tree/master/apps/sgx">example code</a> available in the TVM repo.</p>
+
+<h1 id="motivation-privacy-preserving-ml">Motivation: Privacy-Preserving ML</h1>
+
+<p>Machine learning models benefit from large and diverse datasets.
+Unfortunately, using such datasets often requires trusting a centralized data aggregator or computation provider.
+For sensitive applications like healthcare and finance this is undesirable as it could compromise patient privacy or divulge trade secrets.
+Recent advances in secure and privacy-preserving computation, including <em>trusted execution environments</em> and <em>differential privacy</em>, offer a way for mutually distrusting parties to efficiently train a machine learning model without compromising the training data.
+We use TVM to make privacy-preserving ML framework fast.</p>
+
+<p style="text-align: center"><img src="/images/sgx/sgx.png" alt="Myelin workflow" style="width: 80vw; max-width: 600px" /></p>
+
+<h2 id="use-cases">Use Cases</h2>
+
+<ul>
+  <li><strong>private MLaaS</strong>: a cloud provider runs their architecture on your data. You get the model outputs, your data stays private, and the cloud provider knows that you can’t steal model.</li>
+  <li><strong>trustworthy ML competitions</strong>: you train a model on contest data. The contest organizer sends private test data to your model and gets verifiable report of accuracy. Your model stays safe until the organizer decides to purchase it. Other participants can‘t cheat by training on test data.</li>
+  <li><strong>training on shared private data</strong>: you (a researcher) want to train a model on several hospitals’ data. Directly sharing is too complicated. Instead, have a “trusted third party” train a privacy-preserving model.</li>
+  <li><a href="http://www.vldb.org/pvldb/vol11/p2086-hynes.pdf"><strong>ML on the Blockchain</strong></a></li>
+</ul>
+
+<h1 id="background">Background</h1>
+
+<p style="text-align: center"><img src="/images/sgx/dpnn.png" alt="sketch of DP deep learning in a TEE" style="width: 80vw; max-width: 400px" /></p>
+
+<h2 id="trusted-execution-environments">Trusted Execution Environments</h2>
+
+<p>A <a href="https://en.wikipedia.org/wiki/Trusted_Computing#Remote_attestation">trusted execution environment</a> (TEE) essentially allows a remote user to provably run code on another person’s machine without revealing the computation to the hardware provider.</p>
+
+<p>More technically, the TEE provides a secure <em>enclave</em> of isolated/encrypted memory and CPU registers; also a trusted source of randomness.
+The TEE can also send a signed attestation of the code that’s loaded so that the remote user can verify that the enclave has been correctly loaded.
+This process, known as remote attestation, can be used to establish a secure communication channel into the enclave .
+The remote user can then provision it with secrets like private keys, model parameters, and training data.</p>
+
+<p>Compared to pure crypto methods like <a href="https://en.wikipedia.org/wiki/Garbled_circuit">secure multi-parity computation (MPC)</a> and <a href="https://en.wikipedia.org/wiki/Homomorphic_encryption#Fully_homomorphic_encryption">fully-homomorphic encryption (FHE)</a>, TEEs are several orders of magnitude faster and support general-purpose computation (i.e. not just arithmetic operations).
+Perhaps the only drawbacks are the additional trust assumptions in the hardware root of trust (a key burned into the processor) and loaded software.</p>
+
+<p>Trust assumptions notwithstanding, TEE technology is becoming increasingly widespread and is playing a major role in practical privacy-preservation.
+In fact, general-purpose TEEs already exist in commodity hardware like <a href="https://software.intel.com/en-us/sgx">Intel SGX</a> and <a href="https://genode.org/documentation/articles/trustzone">ARM TrustZone</a>.
+Additionally, the fully-open source <a href="https://keystone-enclave.org">Keystone enclave</a> is on the way.</p>
+
+<h2 id="differential-privacy">Differential Privacy</h2>
+
+<p style="text-align: center"><img src="/images/sgx/dp.png" alt="DP as false positive/negative" style="width: 80vw; max-width: 500px" /></p>
+
+<p><a href="https://en.wikipedia.org/wiki/Differential_Privacy#Randomized_Response">Differential privacy (DP)</a> provides a formal guarantee that models trained on similar datasets are indistinguishable
+Informally, a user’s privacy is not compromised by choosing to contribute data to a model.</p>
+
+<p>In other words, given the output of an algorithm on two datasets which differ in only a single record, differential privacy upper bounds the probability that an adversary can determine which dataset.
+An algorithm may be made DP using a mechanism which adds noise to the algorithm’s output.
+The amount of noise is calibrated on how much the output depends on any particular inputs.
+If you’re familiar with hypothesis testing, if outcomes A and B each have probability 0.5, applying a DP mechanism is like convolving with a probability distribution: the privacy is in the false positive and false negative rates.
+Since deep learning models tend to generalize well, the amount of noise is often less than might be expected.</p>
+
+<p>Running a DP training algorithm in a TEE ensures that the DP mechanism is faithfully applied.</p>
+
+<h1 id="efficient-privacy-preserving-ml-using-tvm">Efficient Privacy-Preserving ML Using TVM</h1>
+
+<p>One of the primary challenges of working with a TEE is that the code running within does not have access to the untrusted OS.
+This means that the trusted software cannot  create threads or perform I.O
+Practically speaking, the result is that numerical libraries like OpenBLAS–much less frameworks like PyTorch and TensorFlow–cannot run directly in enclaves.</p>
+
+<p>TEEs actually have a similar programming model to resource-constrained hardware accelerators.
+This is exactly what TVM is made for!
+In the privacy workflow, a user first defines an entire training graph in the high-level graph specification language.
+TVM them compiles the model and outputs a static library containing optimized numerical kernels which can easily be loaded into a TEE.
+Since the kernels are automatically generated and have strict bounds checking, they expose a low surface area of attack.
+They are supported by a lightweight memory-safe Rust runtime which also may easily be reviewed for safety and correctness.</p>
+
+<p>Of course, safety is most useful when practically applicable.
+Fortunately, TVM modules in enclaves have comparable performance to native CPU-based training.
+By coordinating threads using the untrusted runtime, a single TVM enclave can fully utilize the resources of its host machine.
+Moreover, it’s not difficult to imagine a secure parameter server which orchestrates entire datacenters of enclave-enabled machines.</p>
+
+<p>TVM also provides opportunities for more subtle optimization of privacy-preserving algorithms.
+Indeed, its fine-grained scheduling features allow speedups when using differential privacy.
+For instance, the tightest DP bounds may be obtained from clipping the gradients of each training example and adding noise to each [1].
+In autograd frameworks, this requires forwarding the model for each example in the minibatch (though only one backward pass is needed) [2].
+Using TVM, however, per-example gradient clipping is straightforward: instead of scheduling each weight update as a single reduction over both batch and feature dimensions, the reduction is split into two.
+The reduction over features is followed by clipping and noising, and then the final result is finally summed over examples to obtain the weight update.
+Thus, TVM allows applying differential privacy without introducing overhead greater than what is required by the technique.
+Also, if one really wants to get really fancy, it’s possible to fuse the clipping and noising operations and apply them in-place to further trim down latency and memory usage.</p>
+
+<p>For benchmarks on realistic workloads, please refer to the tech report <a href="https://arxiv.org/abs/1807.06689"><em>Efficient Deep Learning on Multi-Source Private Data</em></a>.
+And, of course, feel free go give the framework a spin in the <a href="https://github.com/dmlc/tvm/tree/master/apps/sgx">TVM SGX example</a>.</p>
+
+<h1 id="conclusion">Conclusion</h1>
+
+<p>The next generation of learning systems will be ushered in by privacy.
+As TEE technology becomes better understood and more widely available, it makes sense to leverage it as a resource for privacy-preserving machine learning and analytics.
+TVM is well poised to facilitate development of this use case in both research and deployment.</p>
+
+<h1 id="bio--acknowledgement">Bio &amp; Acknowledgement</h1>
+
+<p><a href="https://github.com/nhynes">Nick</a> is a PhD student in Prof. Dawn Song’s lab at UC Berkeley.
+His research interest is in the general domain of ML on shared private data, but this is really just an excuse to mess with Rust, security monitors, hardware enclaves, and compilers like TVM.</p>
+
+<p>Thanks to Tianqi Chen for the code reviews!</p>
+
+<h1 id="references">References</h1>
+
+<p>[1] <a href="https://arxiv.org/abs/1607.00133">Deep Learning with Differential Privacy</a><br />
+[2] <a href="https://arxiv.org/pdf/1510.01799v2.pdf">Efficient Per-Example Gradient Computations</a></p>
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2018/12/18/lowprecision-conv.html b/2018/12/18/lowprecision-conv.html
new file mode 100644
index 0000000..997729a
--- /dev/null
+++ b/2018/12/18/lowprecision-conv.html
@@ -0,0 +1,357 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Automating Generation of Low Precision Deep Learning Operators</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/community">Community</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/download">Download</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/about">About</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+    
+  
+    
+      
+      	
+      	<li><a href="/vta">VTA</a></li>
+      	
+      
+      
+    
+  
+    
+      
+      
+      	
+      	<li><a href="/blog">Blog</a></li>
+      	
+      
+    
+  
+
+
+
+
+            <li> <a href="https://tvm.apache.org/docs">Docs</a></li>
+            <li> <a href="https://tvmconf.org">TVM Conference</a></li>
+            <li> <a href="https://github.com/apache/incubator-tvm/">Github</a></li>
+            <li> <a href="/asf">ASF</a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    
+<div class="container">
+<div class="content">
+  <div class="row">
+    <div class="span14">
+      <h1>Automating Generation of Low Precision Deep Learning Operators </h1>
+      <p class="post-meta">
+        <time datetime="2018-12-18T00:00:00-08:00" itemprop="datePublished">
+          Dec 18, 2018
+        </time>
+        
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person">
+          <span itemprop="name">Meghan Cowan</span>
+        </span>
+        
+      </p>
+      <p class="post-meta">
+        </p>
+    </br>
+    <p>As deep learning models grow larger and more complex, deploying them on low powered phone and IoT
+devices becomes challenging because of their limited compute and energy budgets. A  recent  trend
+ in  deep  learning  is  the  use  of  extremely  quantized  models  that operate  on  inputs  and
+ weights  of  a  few  bits, with networks like XNOR-Net, DoReFa-Net, and HWGQ-Net making steady
+progress improving accuracy.</p>
+
+<p>An example of a low precision graph snippet is below. The low precision convolution takes in
+quantized data and bitpacks into the proper data layout for an efficient bitserial convolution.
+The output is in a higher precision and traditional deep learning layers such as batch normalization and ReLu are applied to it, before being re-quantized and sent through another low precision operator.</p>
+
+<p style="text-align: center"><img src="/images/low-precision/workflow.png" alt="image" width="50%" /></p>
+<center> Low precision convolution pipeline.</center>
+<p></p>
+
+<p>Theoretically,  low  precision operators use less operations than
+floating point operators, leading many to believe they can achieve up tremendous speedups.
+However, deep  learning frameworks  leverage  decades  of  engineering  work  through  low  level
+BLAS  and LAPACK libraries that are incredibly well optimized, and CPUs include intrinsic
+instructions to accelerate these tasks.  In  practice,  it  is  not  simple  to  develop low-level
+operators such as convolutions  that  are competitive  with  8-bit  quantized  or  even floating
+point operators.
+In  this  post  we  introduce  our  approach to automatically generating optimized
+low  precision  convolutions for  CPUs. We declare our low precision operators so that they compute
+on efficiently stored low precision inputs, and describe a schedule that describes a search space
+of implementation parameters. We rely on AutoTVM to quickly search the space and find optimized
+parameters for the particular convolution, precision, and backend.</p>
+
+<h2 id="bitserial-computation-background">Bitserial Computation Background</h2>
+
+<p>The  core  of  low  precision  models  is  the bitserial dot product that enables convolution and
+dense operators to be computed using only bitwise operations and popcount.
+ Typically, a dot product is computed by element wise multiplication of two vectors followed by
+ summing all the elements, like the simple example below. If all the data is binary, the input
+ vectors can be packed into single integer, and the dot product can be computed by  bitwise-anding
+ the packed inputs and counting the number of 1’s in the result using popcount.
+Note: Depending how the input data is quantized, bitwise-xnor may be used instead of bitwise-and.</p>
+
+<p style="text-align: center"><img src="/images/low-precision/binary-dotproduct.png" alt="image" width="50%" /></p>
+<center> Binary dot product.</center>
+<p></p>
+
+<p>Arbitrary precision dot products can be computed in this fashion by first separating input data
+into bitplanes. Once in this representation we can compute dotproduct by summing weighted binary
+dot products between the bitplanes of A and B. The number of binary dotproducts grows with the
+product of A and B’s precision, so this method is only practical for very low precision data.</p>
+
+<p style="text-align: center"><img src="/images/low-precision/bitserial-dotproduct.png" alt="image" width="50%" /></p>
+<center> Bitserial dot product.</center>
+<p></p>
+
+<h2 id="defining-operators-in-tvm">Defining Operators in TVM</h2>
+<p>Before the computation, input data needs to be bitpacked so that the bitplanes of the input data
+can be accessed and are packed into a supported datatype such as a uint8 or uint32. We provide
+a flexible bitpacking operator that takes arbitrary size input tensors and returns a bitpacked
+tensor where the user specifies which axis the bitplanes should be.</p>
+
+<p style="text-align: center"><img src="/images/low-precision/bitpack.png" alt="image" width="50%" /></p>
+<center> Different bitpacked layouts.</center>
+<p></p>
+
+<p>Once in this bitpacked format the low precision  convolution can be computed bitserially.
+For this demo, that data is packed along the input channel and the bitplanes are added to the
+innermost axis, and the data is packed into 32-bit integers. The bitserial convolution is computed
+similar to a normal convolution, but the bitwise-and (&amp;) replaces multiplication, and we use
+popcount to accumulate values in the packed data. The bitplane axes become additional reduction axes
+and compute the binary dot products between different bitplanes of the input and kernel.
+Finally, the output is computed in an unpacked format and in higher precision.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Input_bitpacked</span> <span class="o">=</span> <span class="n">bitpack</span><span class="p">(</span><span class="n">Input</span><span class="p">,</span> <span class="n">activation_bits</span><span class="p">,</span> <span class="n">pack_axis</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">bit_axis</span><span class="o">=</spa [...]
+<span class="n">Weights_bitpacked</span> <span class="o">=</span> <span class="n">bitpack</span><span class="p">(</span><span class="n">Filter</span><span class="p">,</span> <span class="n">weight_bits</span><span class="p">,</span> <span class="n">pack_axis</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">bit_axis</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">pack_type</span><span class="o"> [...]
+<span class="n">batch</span><span class="p">,</span> <span class="n">in_height</span><span class="p">,</span> <span class="n">in_width</span><span class="p">,</span> <span class="n">in_channel_q</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">Input_bitpacked</span><span class="o">.</span><span class="n">shape</span>
+<span class="n">kernel_h</span><span class="p">,</span> <span class="n">kernel_w</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">num_filter</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">Filter_bitpakced</span><span class="o">.</span><span class="n">shape</span>
+
+<span class="n">stride_h</span><span class="p">,</span> <span class="n">stride_w</span> <span class="o">=</span> <span class="n">stride</span>
+<span class="n">pad_top</span><span class="p">,</span> <span class="n">pad_left</span><span class="p">,</span> <span class="n">pad_down</span><span class="p">,</span> <span class="n">pad_right</span> <span class="o">=</span> <span class="n">get_pad_tuple</span><span class="p">(</span><span class="n">padding</span><span class="p">,</span> <span class="p">(</span><span class="n">kernel_h</span><span class="p">,</span> <span class="n">kernel_w</span><span class="p">))</span>
+
+<span class="c1"># Computing the output shape
+</span><span class="n">out_channel</span> <span class="o">=</span> <span class="n">num_filter</span>
+<span class="n">out_height</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">((</span><span class="n">in_height</span> <span class="o">-</span> <span class="n">kernel_h</span> <span class="o">+</span> <span class="n">pad_top</span> <span class="o">+</span> <span class="n">pad_down</span><span class="p">)</span> <span class="o">//</span> <span class="n">stride_h</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
+<span class="n">out_width</span> <span class="o">=</span> <span class="n">simplify</span><span class="p">((</span><span class="n">in_width</span> <span class="o">-</span> <span class="n">kernel_w</span> <span class="o">+</span> <span class="n">pad_left</span> <span class="o">+</span> <span class="n">pad_right</span><span class="p">)</span> <span class="o">//</span> <span class="n">stride_w</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
+<span class="n">pad_before</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">pad_top</span><span class="p">,</span> <span class="n">pad_left</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
+<span class="n">pad_after</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">pad_down</span><span class="p">,</span> <span class="n">pad_right</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
+<span class="n">Input_padded</span> <span class="o">=</span> <span class="n">pad</span><span class="p">(</span><span class="n">Input_bitpacked</span><span class="p">,</span> <span class="n">pad_before</span><span class="p">,</span> <span class="n">pad_after</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">"PaddedInput"</span><span class="p">)</span>
+
+<span class="c1"># Treat the bitplane axes like additional reduction axes
+</span><span class="n">rc</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">in_channel_q</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'rc'</span><span class="p">)</span>
+<span class="n">ry</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">kernel_h</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'ry'</span><span class="p">)</span>
+<span class="n">rx</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">kernel_w</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'rx'</span><span class="p">)</span>
+<span class="n">ib</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">input_bits</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'ib'</span><span class="p">)</span>
+<span class="n">wb</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">reduce_axis</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">weight_bits</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="s">'wb'</span><span class="p">)</span>
+
+
+<span class="n">tvm</span><span class="o">.</span><span class="n">compute</span><span class="p">((</span><span class="n">batch</span><span class="p">,</span> <span class="n">out_height</span><span class="p">,</span> <span class="n">out_width</span><span class="p">,</span> <span class="n">out_channel</span><span class="p">),</span> <span class="k">lambda</span> <span class="n">nn</span><span class="p">,</span> <span class="n">yy</span><span class="p">,</span> <span class="n">xx</span><spa [...]
+             <span class="n">tvm</span><span class="o">.</span><span class="nb">sum</span><span class="p">(</span><span class="n">tvm</span><span class="o">.</span><span class="n">popcount</span><span class="p">(</span>
+               <span class="n">Input_padded</span><span class="p">[</span><span class="n">nn</span><span class="p">,</span> <span class="n">yy</span> <span class="o">*</span> <span class="n">stride_h</span> <span class="o">+</span> <span class="n">ry</span><span class="p">,</span> <span class="n">xx</span> <span class="o">*</span> <span class="n">stride_w</span> <span class="o">+</span> <span class="n">rx</span><span class="p">,</span> <span class="n">rc</span><span class="p">,</span> <s [...]
+               <span class="n">Weights_bitpacked</span><span class="p">[</span><span class="n">ry</span><span class="p">,</span> <span class="n">rx</span><span class="p">,</span> <span class="n">rc</span><span class="p">,</span> <span class="n">ff</span><span class="p">,</span> <span class="n">wb</span><span class="p">]))</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">ib</span><span class="o">+</span><span class="n">wb</span><span class="p">)))</span><span [...]
+               <span class="n">axis</span><span class="o">=</span><span class="p">[</span><span class="n">rc</span><span class="p">,</span> <span class="n">ry</span><span class="p">,</span> <span class="n">rx</span><span class="p">,</span> <span class="n">wb</span><span class="p">,</span> <span class="n">ib</span><span class="p">]))</span>
+
+</code></pre></div></div>
+
+<p>In our schedule we apply common optimizations like vectorization and memory tiling to provide better
+memory locality and take advantage of SIMD units. Some of these optimizations such as tiling,
+require parameters that need to be tuned to for the specific microarchitecture. We expose these
+parameters as knobs to TVM and use AutoTVM to automatically tune all the parameters simultaneously.</p>
+
+<p>Finally, we can craft small microkernels to replace the innermost loop(s) of computation and schedule
+ them using TVM’s tensorize primitive. Since, compilers often produce suboptimal code, people can
+ often write short assembly sequences that are more efficient. These microkernels often take advantage
+ of new intrinsics that are being introduced to help accelerate deep learning workloads and use
+ them clever ways to improve memory accesses or reduce the number instructions required.</p>
+
+<h2 id="results">Results</h2>
+
+<h3 id="raspberry-pi">Raspberry Pi</h3>
+<p>Convolution speedups on Raspberry Pi 3B compared to 16-bit integer TVM implementation.
+Workload are convolution layers from ResNet18.</p>
+
+<p style="text-align: center"><img src="/images/low-precision/rasp-conv.png" alt="image" width="50%" /></p>
+<center> Speedup of low precision convolutions on a Raspberry Pi compared to 16-bit TVM implementation.</center>
+<p></p>
+
+<p>2-bit activation, 1-bit weight convolution speedups on Raspberry Pi 3B compared to hand optimized implementation from <a href="https://arxiv.org/pdf/1712.02427.pdf">High performance ultra-low-precision convolutions
+on mobile devices.</a>.
+Workload are convolution layers from ResNet18.</p>
+
+<p style="text-align: center"><img src="/images/low-precision/rasp-conv-2.png" alt="image" width="50%" /></p>
+<center> Speedup of 2-bit weight 1-bit activation Raspberry Pi convolutions against a hand optimized implementation.</center>
+<p></p>
+
+<h3 id="x86">x86</h3>
+
+<p>Convolution speedups on x86 compared to a 32-bit floating point TVM implementation.
+Note: x86 doesn’t support a vectorized popcount for this microarchitecture, so speedups are lower.</p>
+<p style="text-align: center"><img src="/images/low-precision/x86-conv.png" alt="image" width="50%" /></p>
+<center> Speedup of x86 low precision convolutions compared to a 32-bit floating point TVM implementation.</center>
+<p></p>
+
+<h2 id="show-me-the-code">Show me the code</h2>
+
+<ul>
+  <li><a href="https://github.com/dmlc/tvm/blob/master/topi/python/topi/nn/bitserial_conv2d.py">TOPI bitserial convolution</a></li>
+  <li><a href="https://github.com/dmlc/tvm/blob/master/topi/python/topi/arm_cpu/bitserial_conv2d.py">TOPI ARM cpu bitserial convolution</a></li>
+</ul>
+
+<h2 id="references">References</h2>
+
+<ul>
+  <li>[1] <a href="https://arxiv.org/abs/1810.11066">Automating Generation of Low Precision Deep Learning Operators</a></li>
+  <li>[2] <a href="https://arxiv.org/abs/1603.05279">XNOR-Net</a></li>
+  <li>[3] <a href="https://arxiv.org/abs/1702.00953">HWGQ</a></li>
+  <li>[4] <a href="https://arxiv.org/abs/1606.06160">DoReFa</a></li>
+</ul>
+
+
+    </div>
+  </div>
+</div>
+</div>
+
+
+    
+
+
+
+
+
+    <div class="container">
+
+      <footer class="small">
+        Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF),
+        sponsored by the <i>Apache Incubator</i>. Incubation is required
+        of all newly accepted projects until a further review indicates that the infrastructure,
+        communications, and decision making process have stabilized in a manner consistent with other
+        successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+        or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+        Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache,
+        the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+
+        See also other useful <a href="/asf" class="footer-link">ASF links</a>:
+        <a href="https://www.apache.org/" class="footer-link">Apache Homepage</a>,
+        <a href="https://www.apache.org/licenses/" class="footer-link">License</a>
+        <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-link">Sponsorship</a>,
+        <a href="https://www.apache.org/security/" class="footer-link">Security</a>
+        <a href="https://www.apache.org/foundation/thanks.html" class="footer-link">Thanks</a>,
+        <a href="https://www.apache.org/events/current-event.html" class="footer-link">Current Event</a>
+
+      </footer>
+    </div>
+  </body>
+</html>
+
+
diff --git a/2019/01/19/Golang.html b/2019/01/19/Golang.html
new file mode 100644
index 0000000..cd312b9
--- /dev/null
+++ b/2019/01/19/Golang.html
@@ -0,0 +1,366 @@
+
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>TVM Golang Runtime for Deep Learning Deployment</title>
+    
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le styles -->
+    <link href="/assets/themes/custom-twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
+    <link href="/assets/themes/custom-twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
+
+    <!-- Le fav and touch icons -->
+  <!-- Update these with your own images
+    <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  <link rel="shortcut icon" href="images/logo/tvm-logo.png">
+  -->
+  <link href="/images/logo/tvm-logo-square.png" rel="icon" type="image/png"/>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-75982049-2"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+
+    gtag('js', new Date());
+    gtag('config', 'UA-75982049-2');
+  </script>
+
+</head>
+
+  <body>
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <h2 id="logo-wrap">
+            <a href="/" class="nav">
+              <img src="/images/logo/tvm-logo-small-black.png" width="100px">
+            </a>
+          </h2>
+          <ul class="nav" id="nav-bar">
+            
+            
+            
+
+
+
+  
+    
+      
+      
+    
+  
+    
+      
... 923009 lines suppressed ...