..  Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

..    http://www.apache.org/licenses/LICENSE-2.0

..  Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

TVM Documentation
=================

TVM is an open deep learning compiler stack for CPUs, GPUs, and specialized accelerators. It aims to close the gap between the productivity-focused deep learning frameworks, and the performance- or efficiency-oriented hardware backends.


Get Started
-----------

- Follow the :doc:`instructions <install/index>` to install TVM.
- Checkout the :doc:`Tutorials <tutorials/index>`.

For Developers
--------------

- :doc:`dev/index` is useful for developers who want to understand the
  architecture of TVM and/or actively develop on the project.
- :doc:`dev/how_to` gives quick development tips on various topics.


.. toctree::
   :maxdepth: 1
   :caption: How to
   :hidden:

   install/index
   contribute/index
   deploy/index
   dev/how_to

.. toctree::
   :maxdepth: 1
   :caption: Tutorials
   :hidden:

   tutorials/index


.. toctree::
   :maxdepth: 2
   :caption: References
   :hidden:

   langref/index
   api/python/index
   api/links

.. toctree::
   :maxdepth: 2
   :hidden:
   :caption: Deep Dive

   dev/index

.. toctree::
   :maxdepth: 2
   :hidden:
   :caption: MISC

   vta/index
   faq


Index
-----

.. toctree::
   :maxdepth: 1

   genindex
