编译Arm Compute Library

Arm NNLib

Image credit: Unsplash

操作系统:Arch Linux

  1. clone repo

    git clone https://github.com/ARM-software/ComputeLibrary.git
    
  2. 编译lib,需要下载ndk

    我的ndk在/opt/android-ndk目录下,因此直接设置环境变量NDK和PATH,等会编译lib会直接用交叉编译的clang和clang++。

    1. zshrc中设置环境变量

      export NDK="/opt/android-ndk"
      export PATH="$NDK/:$PATH"
      
    2. 软连接aarch64-linux-android-clang++aarch64-linux-android-clang,由于我的机子是Google Pixel 4,所以架构是armv8的,也是aarch64(通过adb shell getprop | grep cpu.abi获得),且我的android api版本是32(通过adb shell getprop | grep build.version.sdk获得),因此链接对应版本呢的clang和clang++

      # /opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/
      sudo ln -s aarch64-linux-android32-clang++ aarch64-linux-android-clang++
      sudo ln -s aarch64-linux-android32-clang aarch64-linux-android-clang
      
    3. 获取aarch64-linux-android-araarch64-linux-android-ranlib,这个不在ndk中,而是需要去网上自行获取,我机器上编译过android中的linux内核,自带有,所以直接拷贝到NDK的bin目录下就行。

    4. 编译Lib

      运行官网命令,由于我们是CPU和GPU都想尝试一下,所以neon和opencl都标为了1。

      CXX=clang++ CC=clang scons Werror=1 -j8 debug=0 asserts=1 neon=1 opencl=1 embed_kernels=1 os=android arch=armv8a
      

      生成的lib会在build文件夹下

  3. 编译示例

    我们尝试编译graph_mobilenet,根据官网的说法,我们使用了Graph AI,所以使用以下命令,其中注意我们加了额外的-Lbuild/来将build目录下的lib放入链接路径中。

    aarch64-linux-android-clang++ examples/graph_mobilenet.cpp utils/Utils.cpp utils/GraphUtils.cpp utils/CommonGraphOptions.cpp -I. -Iinclude -std=c++14 -Wl,--whole-archive -Lbuild/ -larm_compute_graph-static -Wl,--no-whole-archive -larm_compute-static -larm_compute_core-static -L. -o graph_lenet_aarch64 -static-libstdc++ -pie -DARM_COMPUTE_CL
    
QianLong Sang
QianLong Sang
Second Year CS Phd

My research interests include operating system, computer architecture and computer security.