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

tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new 06a466c  allow libbacktrace to be used when cross compiling the 
runtime (#7917)
06a466c is described below

commit 06a466c829eaa6251787fc9e1fee9033d2ef3aa3
Author: Mher Kazandjian <[email protected]>
AuthorDate: Tue Jun 1 03:01:30 2021 +0200

    allow libbacktrace to be used when cross compiling the runtime (#7917)
---
 cmake/libs/Libbacktrace.cmake |  27 +++++++++-
 docs/deploy/index.rst         | 115 ++++++++++++++++++++++++++++++++++++++++--
 docs/install/from_source.rst  |  28 +++++-----
 3 files changed, 152 insertions(+), 18 deletions(-)

diff --git a/cmake/libs/Libbacktrace.cmake b/cmake/libs/Libbacktrace.cmake
index 7428553..58eb4e0 100644
--- a/cmake/libs/Libbacktrace.cmake
+++ b/cmake/libs/Libbacktrace.cmake
@@ -14,14 +14,39 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+
+# On MacOS, the default C compiler (/usr/bin/cc) is actually a small script 
that dispatches to a
+# compiler the default SDK (usually 
/Library/Developer/CommandLineTools/usr/bin/ or
+# 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/).
 CMake
+# automatically detects what is being dispatched and uses it instead along 
with all the flags it
+# needs. CMake makes this second compiler avaliable through the 
CMAKE_C_COMPILER variable, but it
+# does not make the necessary flags available. This leads to configuration 
errors in libbacktrace
+# because it can't find system libraries. Our solution is to detect if 
CMAKE_C_COMPILER lives in
+# /Library or /Applications and switch to the default compiler instead.
 include(ExternalProject)
 
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin" AND (CMAKE_C_COMPILER MATCHES "^/Library"
+  OR CMAKE_C_COMPILER MATCHES "^/Applications"))
+    set(c_compiler "/usr/bin/cc")
+  else()
+    set(c_compiler "${CMAKE_C_COMPILER}")
+endif()
+
 ExternalProject_Add(project_libbacktrace
   PREFIX libbacktrace
   SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../../3rdparty/libbacktrace
   BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace
   CONFIGURE_COMMAND 
"${CMAKE_CURRENT_LIST_DIR}/../../3rdparty/libbacktrace/configure"
-                    "--prefix=${CMAKE_CURRENT_BINARY_DIR}/libbacktrace" 
--with-pic
+                    "--prefix=${CMAKE_CURRENT_BINARY_DIR}/libbacktrace"
+                    --with-pic
+                    "CC=${c_compiler}"
+                    "CFLAGS=${CMAKE_C_FLAGS}"
+                    "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}"
+                    "CPP=${c_compiler} -E"
+                    "NM=${CMAKE_NM}"
+                    "STRIP=${CMAKE_STRIP}"
+                    "--host=${MACHINE_NAME}"
   INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace"
   BUILD_COMMAND make
   INSTALL_COMMAND make install
diff --git a/docs/deploy/index.rst b/docs/deploy/index.rst
index 3cbbb10..b127de9 100644
--- a/docs/deploy/index.rst
+++ b/docs/deploy/index.rst
@@ -25,12 +25,20 @@ as well as how to integrate it with your project.
 
 .. image::  https://tvm.apache.org/images/release/tvm_flexible.png
 
+Build the TVM runtime library
+-----------------------------
+
+.. _build-tvm-runtime-on-target-device:
+
 Unlike traditional deep learning frameworks. TVM stack is divided into two 
major components:
 
-- TVM compiler, which does all the compilation and optimizations
+- TVM compiler, which does all the compilation and optimizations of the model
 - TVM runtime, which runs on the target devices.
 
-In order to integrate the compiled module, we **do not** need to build entire 
TVM on the target device. You only need to build the TVM compiler stack on your 
desktop and use that to cross-compile modules that are deployed on the target 
device.
+In order to integrate the compiled module, we **do not** need to build entire
+TVM on the target device. You only need to build the TVM compiler stack on 
your 
+desktop and use that to cross-compile modules that are deployed on the target 
device.
+
 We only need to use a light-weight runtime API that can be integrated into 
various platforms.
 
 For example, you can run the following commands to build the runtime API
@@ -46,11 +54,103 @@ on a Linux based embedded system such as Raspberry Pi:
     cmake ..
     make runtime
 
-Note that we type `make runtime` to only build the runtime library.
+Note that we type ``make runtime`` to only build the runtime library.
+
+It is also possible to cross compile the runtime. Cross compiling
+the runtime library should not be confused with cross compiling models
+for embedded devices.
+
 If you want to include additional runtime such as OpenCL,
-you can modify `config.cmake` to enable these options.
+you can modify ``config.cmake`` to enable these options.
 After you get the TVM runtime library, you can link the compiled library
 
+.. figure:: 
https://raw.githubusercontent.com/tlc-pack/web-data/main/images/dev/tvm_deploy_crosscompile.svg
+   :align: center
+   :width: 85%
+
+A model (optimized or not by TVM) can be cross compiled by TVM for
+different architectures such as ``aarch64`` on a ``x64_64`` host. Once the 
model
+is cross compiled it is neccessary to have a runtime compatible with the target
+architecture to be able to run the cross compiled model.
+
+
+Cross compile the TVM runtime for other architectures
+-----------------------------------------------------
+
+In the example :ref:`above <build-tvm-runtime-on-target-device>` the runtime 
library was 
+compiled on a Raspberry Pi. Producing the runtime library can be done much 
faster on 
+hosts that have high performace processors with ample resources (such as 
laptops, workstation) 
+compared to a target devices such as a Raspberry Pi. In-order to cross compile 
the runtime the toolchain
+for the target device must be installed. After installing the correct 
toolchain,
+the main difference compared to compiling natively is to pass some additional 
command
+line argument to cmake that specify a toolchain to be used. For reference
+building the TVM runtime library on a modern laptop (using 8 threads) for 
``aarch64``
+takes around 20 seconds vs ~10 min to build the runtime on a Raspberry Pi 4.
+
+cross-compile for aarch64
+"""""""""""""""""""""""""
+
+.. code-block:: bash
+
+   sudo apt-get update
+   sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
+
+.. code-block:: bash
+
+    cmake .. \
+        -DCMAKE_SYSTEM_NAME=Linux \
+        -DCMAKE_SYSTEM_VERSION=1 \
+        -DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc \
+        -DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++ \
+        -DCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu \
+        -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
+        -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
+        -DMACHINE_NAME=aarch64-linux-gnu 
+
+    make -j$(nproc) runtime
+
+For bare metal ARM devices the following toolchain is quite handy to install 
instead of gcc-aarch64-linux-*
+
+.. code-block:: bash
+
+   sudo apt-get install gcc-multilib-arm-linux-gnueabihf 
g++-multilib-arm-linux-gnueabihf
+
+
+cross-compile for RISC-V
+"""""""""""""""""""""""""
+
+.. code-block:: bash
+
+   sudo apt-get update
+   sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
+
+
+.. code-block:: bash
+
+    cmake .. \
+        -DCMAKE_SYSTEM_NAME=Linux \
+        -DCMAKE_SYSTEM_VERSION=1 \
+        -DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc \
+        -DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ \
+        -DCMAKE_FIND_ROOT_PATH=/usr/riscv64-linux-gnu \
+        -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
+        -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
+        -DMACHINE_NAME=riscv64-linux-gnu 
+
+    make -j$(nproc) runtime
+
+The ``file`` command can be used to query the architecture of the produced 
runtime.
+
+
+.. code-block:: bash
+
+   file libtvm_runtime.so
+   libtvm_runtime.so: ELF 64-bit LSB shared object, UCB RISC-V, version 1 
(GNU/Linux), dynamically linked, 
BuildID[sha1]=e9ak845b3d7f2c126dab53632aea8e012d89477e, not stripped
+
+    
+Optimize and tune models for target devices
+-------------------------------------------
+
 The easiest and recommended way to test, tune and benchmark TVM kernels on
 embedded devices is through TVM's RPC API.
 Here are the links to the related tutorials.
@@ -58,8 +158,11 @@ Here are the links to the related tutorials.
 - :ref:`tutorial-cross-compilation-and-rpc`
 - :ref:`tutorial-deploy-model-on-rasp`
 
+Deploy optimized model on target devices
+----------------------------------------
+
 After you finished tuning and benchmarking, you might need to deploy the model 
on the
-target device without relying on RPC. see the following resources on how to do 
so.
+target device without relying on RPC. See the following resources on how to do 
so.
 
 .. toctree::
    :maxdepth: 2
@@ -72,3 +175,5 @@ target device without relying on RPC. see the following 
resources on how to do s
    tensorrt
    vitis_ai
    bnns
+
+
diff --git a/docs/install/from_source.rst b/docs/install/from_source.rst
index bc6cdb9..5d723d1 100644
--- a/docs/install/from_source.rst
+++ b/docs/install/from_source.rst
@@ -51,27 +51,31 @@ Build the Shared Library
 
 Our goal is to build the shared libraries:
 
-- On Linux the target library are `libtvm.so`
-- On macOS the target library are `libtvm.dylib`
-- On Windows the target library are `libtvm.dll`
+   - On Linux the target library are `libtvm.so` and `libtvm_runtime.so`
+   - On macOS the target library are `libtvm.dylib` and `libtvm_runtime.dylib` 
+   - On Windows the target library are `libtvm.dll` and `libtvm_runtime.dll` 
 
+It is also possible to :ref:`build the runtime <deploy-and-integration>` 
library only.
+
+The minimal building requirements for the ``TVM`` libraries are:
+
+   - A recent c++ compiler supporting C++ 14 (g++-5 or higher)
+   - CMake 3.5 or higher
+   - We highly recommend to build with LLVM to enable all the features.
+   - If you want to use CUDA, CUDA toolkit version >= 8.0 is required. If you 
are upgrading from an older version, make sure you purge the older version and 
reboot after installation.
+   - On macOS, you may want to install `Homebrew <https://brew.sh>` to easily 
install and manage dependencies.
+
+To install the these minimal pre-requisites on Ubuntu/Debian like
+linux operating systems, execute (in a terminal):
 
 .. code:: bash
 
     sudo apt-get update
     sudo apt-get install -y python3 python3-dev python3-setuptools gcc 
libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
 
-The minimal building requirements are
-
-- A recent c++ compiler supporting C++ 14 (g++-5 or higher)
-- CMake 3.5 or higher
-- We highly recommend to build with LLVM to enable all the features.
-- If you want to use CUDA, CUDA toolkit version >= 8.0 is required. If you are 
upgrading from an older version, make sure you purge the older version and 
reboot after installation.
-- On macOS, you may want to install `Homebrew <https://brew.sh>` to easily 
install and manage dependencies.
-
 
 We use cmake to build the library.
-The configuration of TVM can be modified by `config.cmake`.
+The configuration of TVM can be modified by editing `config.cmake` and/or by 
passing cmake flags to the command line:
 
 
 - First, check the cmake in your system. If you do not have cmake,

Reply via email to