blob: 07c7e0db7b2d00015e199fcdb7a5ab53dd2f1dda [file] [log] [blame]
Nikhil Raj03c7ff32023-08-22 12:00:04 +01001<!-- HTML header for doxygen 1.8.17-->
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4<head>
5<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
6<meta http-equiv="X-UA-Compatible" content="IE=9"/>
7<meta name="generator" content="Doxygen 1.8.17"/>
8<meta name="viewport" content="width=device-width, initial-scale=1"/>
9<title>Arm NN: How to use the Android NDK to build Arm NN</title>
10<link href="tabs.css" rel="stylesheet" type="text/css"/>
11<script type="text/javascript" src="jquery.js"></script>
12<script type="text/javascript" src="dynsections.js"></script>
13<link href="navtree.css" rel="stylesheet" type="text/css"/>
14<script type="text/javascript" src="resize.js"></script>
15<script type="text/javascript" src="navtreedata.js"></script>
16<script type="text/javascript" src="navtree.js"></script>
17<link href="search/search.css" rel="stylesheet" type="text/css"/>
18<script type="text/javascript" src="search/searchdata.js"></script>
19<script type="text/javascript" src="search/search.js"></script>
20<script type="text/x-mathjax-config">
21 MathJax.Hub.Config({
22 extensions: ["tex2jax.js"],
23 jax: ["input/TeX","output/HTML-CSS"],
24});
25</script>
26<script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
27<link href="doxygen.css" rel="stylesheet" type="text/css" />
28<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
29</head>
30<body>
31<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
32<div id="titlearea">
33<table cellspacing="0" cellpadding="0">
34 <tbody>
35 <tr style="height: 56px;">
36 <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 15rem; margin-top: .5rem; margin-left 13px"/>
37 <td id="projectalign" style="padding-left: 0.9em;">
38 <div id="projectname">
Nikhil Raj1dc83fe2024-05-16 09:47:51 +010039 &#160;<span id="projectnumber">24.05</span>
Nikhil Raj03c7ff32023-08-22 12:00:04 +010040 </div>
41 </td>
42 </tr>
43 </tbody>
44</table>
45</div>
46<!-- end header part -->
47<!-- Generated by Doxygen 1.8.17 -->
48<script type="text/javascript">
49/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
50var searchBox = new SearchBox("searchBox", "search",false,'Search');
51/* @license-end */
52</script>
53<script type="text/javascript" src="menudata.js"></script>
54<script type="text/javascript" src="menu.js"></script>
55<script type="text/javascript">
56/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
57$(function() {
58 initMenu('',true,false,'search.php','Search');
59 $(document).ready(function() { init_search(); });
60});
61/* @license-end */</script>
62<div id="main-nav"></div>
63</div><!-- top -->
64<div id="side-nav" class="ui-resizable side-nav-resizable">
65 <div id="nav-tree">
66 <div id="nav-tree-contents">
67 <div id="nav-sync" class="sync"></div>
68 </div>
69 </div>
70 <div id="splitbar" style="-moz-user-select:none;"
71 class="ui-resizable-handle">
72 </div>
73</div>
74<script type="text/javascript">
75/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
76$(document).ready(function(){initNavTree('md__build_guide_android_n_d_k.html',''); initResizable(); });
77/* @license-end */
78</script>
79<div id="doc-content">
80<!-- window showing the filter options -->
81<div id="MSearchSelectWindow"
82 onmouseover="return searchBox.OnSearchSelectShow()"
83 onmouseout="return searchBox.OnSearchSelectHide()"
84 onkeydown="return searchBox.OnSearchSelectKey(event)">
85</div>
86
87<!-- iframe showing the search results (closed by default) -->
88<div id="MSearchResultsWindow">
89<iframe src="javascript:void(0)" frameborder="0"
90 name="MSearchResults" id="MSearchResults">
91</iframe>
92</div>
93
94<div class="PageDoc"><div class="header">
95 <div class="headertitle">
96<div class="title">How to use the Android NDK to build Arm NN </div> </div>
97</div><!--header-->
98<div class="contents">
99<div class="textblock"><ul>
100<li><a href="#introduction">Introduction</a></li>
101<li><a href="#initial-setup">Initial Setup</a></li>
102<li><a href="#download-the-android-ndk-and-make-a-standalone-toolchain">Download the Android NDK and make a standalone toolchain</a></li>
103<li><a href="#install-cmake">Install Cmake</a></li>
104<li><a href="#build-flatbuffers">Build Flatbuffers</a></li>
105<li><a href="#download-arm-nn">Download Arm NN</a></li>
106<li><a href="#get-and-build-tflite">Get And Build TFLite</a></li>
107<li><a href="#build-arm-compute-library">Build Arm Compute Library</a></li>
108<li><a href="#build-arm-nn">Build Arm NN</a></li>
109<li><a href="#build-standalone-sample-dynamic-backend">Build Standalone Sample Dynamic Backend</a></li>
110<li><a href="#run-the-arm-nn-unit-tests-on-an-android-device">Run the Arm NN unit tests on an Android device</a></li>
111</ul>
112<h1>Introduction</h1>
113<p>These are step-by-step instructions for using the Android NDK to build Arm NN. They have been tested on a clean installation of Ubuntu 18.04 and 20.04, and should also work with other OS versions. The instructions show how to build the Arm NN core library and its dependencies.</p>
114<p>For ease of use there is a shell script version of this guide located in the scripts directory called <a href="scripts/build_android_ndk_guide.sh">build_android_ndk_guide.sh</a>. Run the script with a -h flag to see the command line parameters.</p>
115<p>The shell script version of this guide (build_android_ndk_guide.sh) also provides user the option to use the Arm NN and ComputeLibrary available in your BASE_DIR, instead of downloading a new version. BASE_DIR is path to the script file, which is armnn/scripts/.</p>
116<h1>Initial Setup</h1>
117<p>First, we need to specify the Android version and the directories you want to build Arm NN in and to install some applications required to build Arm NN and its dependencies.</p>
118<div class="fragment"><div class="line">export ANDROID_API=30</div>
119<div class="line">export WORKING_DIR=$HOME/armnn-devenv</div>
120<div class="line">export NDK_DIR=$WORKING_DIR/android-ndk-r25</div>
121<div class="line">export NDK_TOOLCHAIN_ROOT=$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64</div>
122<div class="line">export PATH=$NDK_TOOLCHAIN_ROOT/bin/:$PATH</div>
123</div><!-- fragment --><p>You may want to append the above export variables commands to your <code>~/.bashrc</code> (or <code>~/.bash_profile</code> in macOS).</p>
124<p>The ANDROID_API variable should be set to the Android API version number you are using. For example, "30" for Android R. The WORKING_DIR can be any directory you have write permissions to.</p>
125<h2>Required Applications</h2>
126<p>Git is required to obtain Arm NN. If this has not been already installed then install it using: </p><div class="fragment"><div class="line">sudo apt install git</div>
127</div><!-- fragment --><p>Arm Compute Library requires SCons. If this has not been already installed then install it using: </p><div class="fragment"><div class="line">sudo apt install scons</div>
128</div><!-- fragment --><p>CMake is required to build Arm NN and its dependencies. If this has not been already installed then install it using: </p><div class="fragment"><div class="line">sudo apt install cmake</div>
129</div><!-- fragment --><h1>Download the Android NDK and make a standalone toolchain</h1>
130<p>Download the Android NDK from <a href="https://developer.android.com/ndk/downloads/index.html">the official website</a>: </p><div class="fragment"><div class="line">mkdir -p $WORKING_DIR</div>
131<div class="line">cd $WORKING_DIR</div>
132<div class="line"># For Mac OS, change the NDK download link accordingly.</div>
133<div class="line">wget https://dl.google.com/android/repository/android-ndk-r25-linux.zip</div>
134<div class="line">unzip android-ndk-r25-linux.zip</div>
135</div><!-- fragment --><p>With Android NDK-25, you no longer need to use the make_standalone_toolchain script to create a toolchain for a specific version of Android. Android's current preference is for you to just specify the architecture and operating system while setting the compiler and just use the ndk directory.</p>
136<h1>Install Cmake</h1>
137<p>Cmake 3.19rc3 or later is required to build Arm NN. If you are using Ubuntu 20.04 the command given in <a href="#initial-setup">Initial Setup</a> should install a usable version. If you're using Ubuntu 18.04 you may need to compile cmake yourself.</p>
138<div class="fragment"><div class="line">cd $WORKING_DIR</div>
139<div class="line">sudo apt-get install libssl-dev</div>
140<div class="line">wget https://github.com/Kitware/CMake/releases/download/v3.19.0-rc3/cmake-3.19.0-rc3.tar.gz</div>
141<div class="line">tar -zxvf cmake-3.19.0-rc3.tar.gz</div>
142<div class="line">cd cmake-3.19.0-rc3</div>
143<div class="line">./bootstrap --prefix=$WORKING_DIR/cmake/install</div>
144<div class="line">make all install</div>
145<div class="line">cd..</div>
146</div><!-- fragment --><h1>Build Flatbuffers</h1>
147<p>Download Flatbuffers: </p><div class="fragment"><div class="line">cd $WORKING_DIR</div>
Nikhil Raj6f92c8e2023-11-22 11:41:15 +0000148<div class="line">wget https://github.com/google/flatbuffers/archive/v23.5.26.tar.gz</div>
149<div class="line">tar xf v23.5.26.tar.gz</div>
150</div><!-- fragment --><p>Build Flatbuffers for x86: </p><div class="fragment"><div class="line">cd $WORKING_DIR/flatbuffers-23.5.26</div>
Nikhil Raj03c7ff32023-08-22 12:00:04 +0100151<div class="line"> </div>
152<div class="line">rm -f CMakeCache.txt</div>
153<div class="line"> </div>
154<div class="line">rm -rf build-x86</div>
155<div class="line">mkdir build-x86</div>
156<div class="line">cd build-x86</div>
157<div class="line"> </div>
158<div class="line">rm -rf $WORKING_DIR/flatbuffers-x86</div>
159<div class="line">mkdir $WORKING_DIR/flatbuffers-x86</div>
160<div class="line"> </div>
161<div class="line">CXXFLAGS=&quot;-fPIC&quot; $CMAKE .. \</div>
162<div class="line"> -DFLATBUFFERS_BUILD_FLATC=1 \</div>
163<div class="line"> -DCMAKE_INSTALL_PREFIX:PATH=$WORKING_DIR/flatbuffers-x86</div>
164<div class="line"> </div>
165<div class="line">make all install -j16</div>
166</div><!-- fragment --><p>Note: -fPIC is added to allow users to use the libraries in shared objects.</p>
Nikhil Raj6f92c8e2023-11-22 11:41:15 +0000167<p>Build Flatbuffers for Android: </p><div class="fragment"><div class="line">cd $WORKING_DIR/flatbuffers-23.5.26</div>
Nikhil Raj03c7ff32023-08-22 12:00:04 +0100168<div class="line"> </div>
169<div class="line">rm -f CMakeCache.txt</div>
170<div class="line"> </div>
171<div class="line">rm -rf build-android</div>
172<div class="line">mkdir build-android</div>
173<div class="line">cd build-android</div>
174<div class="line"> </div>
175<div class="line">rm -rf $WORKING_DIR/flatbuffers-android</div>
176<div class="line">mkdir $WORKING_DIR/flatbuffers-android</div>
177<div class="line"> </div>
178<div class="line">CC=/usr/bin/aarch64-linux-gnu-gcc CXX=/usr/bin/aarch64-linux-gnu-g++ \</div>
179<div class="line">CXXFLAGS=&quot;-fPIC&quot; \</div>
180<div class="line">cmake .. \</div>
181<div class="line"> -DCMAKE_ANDROID_NDK=$NDK_DIR \</div>
182<div class="line"> -DCMAKE_SYSTEM_NAME=Android \</div>
183<div class="line"> -DCMAKE_SYSTEM_VERSION=$ANDROID_API \</div>
184<div class="line"> -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \</div>
185<div class="line"> -DCMAKE_CXX_FLAGS=--std=c++14 \</div>
186<div class="line"> -DFLATBUFFERS_BUILD_FLATC=OFF \</div>
187<div class="line"> -DCMAKE_BUILD_TYPE=Release \</div>
188<div class="line"> -DFLATBUFFERS_BUILD_TESTS=OFF \</div>
189<div class="line"> -DCMAKE_INSTALL_PREFIX=$WORKING_DIR/flatbuffers-android</div>
190<div class="line"> </div>
191<div class="line">make all install -j16</div>
192</div><!-- fragment --><h1>Download Arm NN</h1>
193<p>Clone Arm NN:</p>
194<div class="fragment"><div class="line">cd $WORKING_DIR</div>
195<div class="line">git clone https://github.com/ARM-software/armnn.git</div>
196</div><!-- fragment --><p>Checkout the Arm NN branch: </p><div class="fragment"><div class="line">cd armnn</div>
197<div class="line">git checkout &lt;branch_name&gt;</div>
198<div class="line">git pull</div>
199</div><!-- fragment --><p>For example, if you want to check out the 23.02 release branch: </p><div class="fragment"><div class="line">cd armnn</div>
200<div class="line">git checkout branches/armnn_23_02</div>
201<div class="line">git pull</div>
202</div><!-- fragment --><h1>Get And Build TFLite</h1>
203<p>This optional step is only required if you intend to build the TFLite delegate or parser for Arm NN.</p>
204<p>First clone Tensorflow manually and check out the version Arm NN was tested with: </p><div class="fragment"><div class="line">cd $WORKING_DIR</div>
205<div class="line">git clone https://github.com/tensorflow/tensorflow.git</div>
206<div class="line">cd tensorflow</div>
Nikhil Raj38b600d2024-02-15 15:02:19 +0000207<div class="line">git fetch &amp;&amp; git checkout v2.15.0</div>
Nikhil Raj03c7ff32023-08-22 12:00:04 +0100208</div><!-- fragment --><p>Or use the script that Arm NN provides: </p><div class="fragment"><div class="line">git fetch &amp;&amp; git checkout $(../armnn/scripts/get_tensorflow.sh -p)</div>
209</div><!-- fragment --><p>Next, set variable TFLITE_ROOT_DIR and build Tensorflow Lite: </p><div class="fragment"><div class="line">export TFLITE_ROOT_DIR=$WORKING_DIR/tensorflow/tensorflow/lite</div>
210<div class="line">cd $WORKING_DIR</div>
211<div class="line">mkdir -p tflite-out/android</div>
212<div class="line">cd tflite-out/android</div>
213<div class="line"> </div>
214<div class="line">CMARGS=&quot;-DTFLITE_ENABLE_XNNPACK=OFF \</div>
215<div class="line"> -DFLATBUFFERS_BUILD_FLATC=OFF \</div>
216<div class="line"> -DBUILD_SHARED_LIBS=OFF \</div>
217<div class="line"> -DBUILD_TESTING=OFF&quot;</div>
218<div class="line"> </div>
219<div class="line">CMARGS=&quot;$CMARGS -DCMAKE_TOOLCHAIN_FILE=$NDK_DIR/build/cmake/android.toolchain.cmake \</div>
220<div class="line"> -DANDROID_ABI=arm64-v8a \</div>
221<div class="line"> -DANDROID_PLATFORM=$ANDROID_API&quot;</div>
222<div class="line"> </div>
223<div class="line">cmake $CMARGS $TFLITE_ROOT_DIR</div>
224<div class="line"> </div>
225<div class="line">cd $WORKING_DIR</div>
226<div class="line">cmake --build tflite-out/android -j 16</div>
227</div><!-- fragment --><p>Now generate the Tensorflow Lite Schema for the TFLite parser: </p><div class="fragment"><div class="line">cd $WORKING_DIR</div>
228<div class="line">mkdir -p $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema</div>
229<div class="line"> </div>
230<div class="line">SCHEMA_LOCATION=$WORKING_DIR/tensorflow/tensorflow/lite/schema/schema.fbs</div>
231<div class="line">cp $SCHEMA_LOCATION $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema</div>
232<div class="line"> </div>
233<div class="line">cd $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema</div>
234<div class="line">$WORKING_DIR/flatbuffers-x86/bin/flatc -c --gen-object-api --reflect-types --reflect-names schema.fbs</div>
235</div><!-- fragment --><h1>Build Arm Compute Library</h1>
236<p>Clone Arm Compute Library:</p>
237<div class="fragment"><div class="line">cd $WORKING_DIR</div>
238<div class="line">git clone https://github.com/ARM-software/ComputeLibrary.git</div>
239</div><!-- fragment --><p>Checkout Arm Compute Library release tag: </p><div class="fragment"><div class="line">cd ComputeLibrary</div>
240<div class="line">git checkout &lt;tag_name&gt;</div>
241</div><!-- fragment --><p>For example, if you want to check out the 23.02 release tag: </p><div class="fragment"><div class="line">cd ComputeLibrary</div>
242<div class="line">git checkout v23.02</div>
243</div><!-- fragment --><p>Arm NN and Arm Compute Library are developed closely together. To use a particular version of Arm NN you will need a compatible version of ACL. Arm NN provides a script that downloads the version of Arm Compute Library that Arm NN was tested with: </p><div class="fragment"><div class="line">git checkout $(../armnn/scripts/get_compute_library.sh -p) </div>
244</div><!-- fragment --><p>Build the Arm Compute Library: </p><div class="fragment"><div class="line">scons arch=arm64-v8a os=android toolchain_prefix=llvm- compiler_prefix=aarch64-linux-android$ANDROID_API- \</div>
245<div class="line"> neon=1 opencl=1 embed_kernels=1 extra_cxx_flags=&quot;-fPIC&quot; \</div>
246<div class="line"> benchmark_tests=0 validation_tests=0 -j16</div>
247</div><!-- fragment --><h1>Build Arm NN</h1>
248<p>Build Arm NN:</p>
249<div class="fragment"><div class="line">mkdir $WORKING_DIR/armnn/build</div>
250<div class="line">cd $WORKING_DIR/armnn/build</div>
251<div class="line">CXX=aarch64-linux-android$ANDROID_API-clang++ \</div>
252<div class="line">CC=aarch64-linux-android$ANDROID_API-clang \</div>
253<div class="line">CXX_FLAGS=&quot;-fPIE -fPIC&quot; \</div>
254<div class="line">cmake .. \</div>
255<div class="line"> -DCMAKE_BUILD_TYPE=Release \</div>
256<div class="line"> -DCMAKE_ANDROID_NDK=$NDK_DIR \</div>
257<div class="line"> -DNDK_VERSION=r25 \</div>
258<div class="line"> -DCMAKE_SYSTEM_NAME=Android \</div>
259<div class="line"> -DCMAKE_SYSTEM_VERSION=$ANDROID_API \</div>
260<div class="line"> -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \</div>
261<div class="line"> -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \</div>
262<div class="line"> -DARMCOMPUTE_ROOT=$WORKING_DIR/ComputeLibrary \</div>
263<div class="line"> -DARMCOMPUTE_BUILD_DIR=$WORKING_DIR/ComputeLibrary/build \</div>
264<div class="line"> -DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMNNREF=1 \</div>
265<div class="line"> -DFLATBUFFERS_INCLUDE_PATH=$WORKING_DIR/flatbuffers-x86/include \</div>
266<div class="line"> -DFLATBUFFERS_ROOT=$WORKING_DIR/flatbuffers-android \</div>
267<div class="line"> -DFLATC_DIR=$WORKING_DIR/flatbuffers-x86 \</div>
268<div class="line"> -DBUILD_UNIT_TESTS=1 \</div>
269<div class="line"> -DBUILD_TESTS=1 \</div>
270<div class="line"> -fexception \</div>
271</div><!-- fragment --><p>To include the Arm NN TFLite delegate add these arguments to the above list:</p>
272<div class="fragment"><div class="line">-DBUILD_ARMNN_TFLITE_DELEGATE=1 \</div>
273<div class="line">-DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \</div>
274<div class="line">-DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \</div>
275<div class="line">-DTFLITE_ROOT_DIR=$WORKING_DIR/tensorflow/tensorflow/lite \</div>
276</div><!-- fragment --><p>To include the Arm NN TFLite Parser add these arguments to the above list:</p>
277<div class="fragment"><div class="line">-DBUILD_TF_LITE_PARSER=1 \</div>
278<div class="line">-DTF_LITE_GENERATED_PATH=$WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema \</div>
279<div class="line">-DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \</div>
280<div class="line">-DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \</div>
281</div><!-- fragment --><p>To include standalone sample dynamic backend tests, add these arguments to enable the tests and the dynamic backend path to the CMake command:</p>
282<div class="fragment"><div class="line"> -DSAMPLE_DYNAMIC_BACKEND=1 \</div>
283<div class="line"> -DDYNAMIC_BACKEND_PATHS=$SAMPLE_DYNAMIC_BACKEND_PATH</div>
284<div class="line"># Where $SAMPLE_DYNAMIC_BACKEND_PATH is the path where libArm_SampleDynamic_backend.so library file is pushed</div>
285</div><!-- fragment --><ul>
286<li>Run the build <div class="fragment"><div class="line">make -j16</div>
287</div><!-- fragment --></li>
288</ul>
289<h1>Build Standalone Sample Dynamic Backend</h1>
290<p>This step is optional. The sample dynamic backend is located in armnn/src/dynamic/sample </p><div class="fragment"><div class="line">mkdir build</div>
291<div class="line">cd build</div>
292</div><!-- fragment --><ul>
293<li>Use CMake to configure the build environment, update the following script and run it from the armnn/src/dynamic/sample/build directory to set up the Arm NN build: <div class="fragment"><div class="line">#!/bin/bash</div>
294<div class="line">CXX=aarch64-linux-android$ANDROID_API-clang++ \</div>
295<div class="line">CC=aarch64-linux-android$ANDROID_API-clang \</div>
296<div class="line">CXX_FLAGS=&quot;-fPIE -fPIC&quot; \</div>
297<div class="line">cmake \</div>
298<div class="line"> -DCMAKE_C_COMPILER_WORKS=TRUE \</div>
299<div class="line"> -DCMAKE_CXX_COMPILER_WORKS=TRUE \</div>
300<div class="line"> -DCMAKE_ANDROID_NDK=$NDK_DIR \</div>
301<div class="line"> -DCMAKE_SYSTEM_NAME=Android \</div>
302<div class="line"> -DCMAKE_SYSTEM_VERSION=$ANDROID_API \</div>
303<div class="line"> -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \</div>
304<div class="line"> -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \</div>
305<div class="line"> -DCMAKE_CXX_FLAGS=--std=c++14 \</div>
306<div class="line"> -DCMAKE_EXE_LINKER_FLAGS=&quot;-pie -llog&quot; \</div>
307<div class="line"> -DCMAKE_MODULE_LINKER_FLAGS=&quot;-llog&quot; \</div>
308<div class="line"> -DARMNN_PATH=$WORKING_DIR/armnn/build/libarmnn.so ..</div>
309</div><!-- fragment --></li>
310<li>Run the build <div class="fragment"><div class="line">make</div>
311</div><!-- fragment --></li>
312</ul>
313<h1>Run the Arm NN unit tests on an Android device</h1>
314<ul>
315<li>Push the build results to an Android device and make symbolic links for shared libraries: Currently adb version we have used for testing is 1.0.41. <div class="fragment"><div class="line">adb push libarmnn.so /data/local/tmp/</div>
316<div class="line">adb push libtimelineDecoder.so /data/local/tmp/</div>
317<div class="line">adb push libtimelineDecoderJson.so /data/local/tmp/</div>
318<div class="line">adb push GatordMock /data/local/tmp/</div>
319<div class="line">adb push libarmnnBasePipeServer.so /data/local/tmp/</div>
320<div class="line">adb push libarmnnTestUtils.so /data/local/tmp/</div>
321<div class="line">adb push UnitTests /data/local/tmp/</div>
322<div class="line">adb push $NDK_DIR/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so /data/local/tmp/</div>
323</div><!-- fragment --></li>
324<li>Push the files needed for the unit tests (they are a mix of files, directories and symbolic links): <div class="fragment"><div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testSharedObject</div>
325<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/testSharedObject/* /data/local/tmp/src/backends/backendsCommon/test/testSharedObject/</div>
326<div class="line"> </div>
327<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend</div>
328<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/testDynamicBackend/* /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend/</div>
329<div class="line"> </div>
330<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1</div>
331<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath1/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1/</div>
332<div class="line"> </div>
333<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2</div>
334<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/</div>
335<div class="line">adb shell ln -s Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1</div>
336<div class="line">adb shell ln -s Arm_CpuAcc_backend.so.1 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2</div>
337<div class="line">adb shell ln -s Arm_CpuAcc_backend.so.1.2 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2.3</div>
338<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_GpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/</div>
339<div class="line">adb shell ln -s nothing /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_no_backend.so</div>
340<div class="line"> </div>
341<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath3</div>
342<div class="line"> </div>
343<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5</div>
344<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath5/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5/</div>
345<div class="line"> </div>
346<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6</div>
347<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath6/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6/</div>
348<div class="line"> </div>
349<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath7</div>
350<div class="line"> </div>
351<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9</div>
352<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath9/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9/</div>
353<div class="line"> </div>
354<div class="line">adb shell mkdir -p /data/local/tmp/src/backends/dynamic/reference</div>
355<div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/dynamic/reference/Arm_CpuRef_backend.so /data/local/tmp/src/backends/dynamic/reference/</div>
356</div><!-- fragment --></li>
357</ul>
358<p>If the standalone sample dynamic tests are enabled, also push libArm_SampleDynamic_backend.so library file to the folder specified as $SAMPLE_DYNAMIC_BACKEND_PATH when Arm NN is built. This is the example when $SAMPLE_DYNAMIC_BACKEND_PATH is specified as /data/local/tmp/dynamic/sample/:</p>
359<div class="fragment"><div class="line">adb shell mkdir -p /data/local/tmp/dynamic/sample/</div>
360<div class="line">adb push -p $WORKING_DIR/armnn/src/dynamic/sample/build/libArm_SampleDynamic_backend.so /data/local/tmp/dynamic/sample/</div>
361</div><!-- fragment --><p>If the delegate was built, push the delegate unit tests too. </p><div class="fragment"><div class="line">adb push $WORKING_DIR/armnn/build/delegate/DelegateUnitTests /data/local/tmp/</div>
362<div class="line">adb push $WORKING_DIR/armnn/build/delegate/libarmnnDelegate.so /data/local/tmp/</div>
363</div><!-- fragment --><p>Run Arm NN unit tests: </p><div class="fragment"><div class="line">adb shell &#39;LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/UnitTests&#39;</div>
364</div><!-- fragment --><p>If the delegate was built run Arm Delegate NN unit tests: </p><div class="fragment"><div class="line">adb shell &#39;LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/DelegateUnitTests&#39;</div>
365</div><!-- fragment --><p>If libarmnnUtils.a is present in <code>$WORKING_DIR/armnn/build/</code> and the unit tests run without failure then the build was successful. </p>
366</div></div><!-- contents -->
367</div><!-- PageDoc -->
368</div><!-- doc-content -->
369<!-- start footer part -->
370<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
371 <ul>
372 <li class="navelem"><a class="el" href="buildguides.html">Build Guides</a></li>
Nikhil Raj1dc83fe2024-05-16 09:47:51 +0100373 <li class="footer">Generated on Thu May 16 2024 09:31:54 for Arm NN by
Nikhil Raj03c7ff32023-08-22 12:00:04 +0100374 <a href="http://www.doxygen.org/index.html">
375 <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
376 </ul>
377</div>
378</body>
379</html>