1
2

More than 3 years have passed since last update.

OpenBLAS を Android aarch64 + NDK r20 or later でビルドするメモ

Last updated at Posted at 2020-03-21

背景

OpenBLAS(+ Lapack)を Android arm64 で動かしたい.

Lapack(clapack)はこちら

Lapack(clapack)を Android arm64 + cmake + NDK r20 or later でビルドする
https://qiita.com/syoyo/items/09009ca77393cc0bd986

ビルド方法

How to build OpenBLAS for Android
https://github.com/xianyi/OpenBLAS/wiki/How-to-build-OpenBLAS-for-Android

は情報が古いです.

NDK r20 などでは, gcc 関連がそれなりに消えて clang only になったので, wiki の情報だとビルドがうまくいきません.

Compiling OpenBLAS for Android #2005
https://github.com/xianyi/OpenBLAS/issues/2005

にありました.

cd $OPENBLAS_SOURCE
export NDK=${HOME}/Android/sdk/ndk-bundle
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
make \
    TARGET=CORTEXA57 \
    ONLY_CBLAS=1 \
    CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang \
    AR=$TOOLCHAIN/bin/aarch64-linux-android-ar \
    HOSTCC=gcc \
    -j4
make PREFIX=./android-openblas/arm64 install

でビルドできます! sysroot 指定など不要でビルド楽です.

CORTEX architecture

現時点(2020/03/21)では, CORTEXA53, 57, 72, 73 がありました.

Cmake build

ソースコードのレイアウト上, out-of-tree build はちょっと気持ち悪いことがわかりました
(生成された congig.h ではなく, 既存の config.h(x86 用のデフォルト設定) をインクルードしてしまうため, config.h を消さないといけない)

in-source ビルドではこんな感じでいけました.

## Please edit android sdk/ndk/cmake path
ANDROID_SDK_ROOT=$HOME/Android/Sdk/
ANDROID_NDK_ROOT=$HOME/Android/Sdk/ndk-bundle
#ANDROID_NDK_ROOT=$HOME/Android/Sdk/ndk/android-ndk-r21/
# CMake 3.10 or later required
CMAKE_BIN=$ANDROID_SDK_ROOT/cmake/3.10.2.4988404/bin/cmake
#CMAKE_BIN=cmake

# For ninja build
# -DCMAKE_MAKE_PROGRAM=$ANDROID_SDK_ROOT/cmake/3.6.4111459/bin/ninja \

# Due to the source code layout of OpenBLAS, we need to use in-source build 
# Otherwise compilation fails due to the conflict of existing `config.h` and generated `config.h`
# (Using in-source build correctly overrides `config.h`)

$CMAKE_BIN \
  -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \
  -DANDROID_ARM_MODE=arm \
  -DANDROID_ARM_NEON=On \
  -DANDROID_ABI=arm64-v8a \
  -DANDROID_NATIVE_API_LEVEL=28 \
  -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \
  -DANDROID_STL=c++_shared \
  -DTARGET=CORTEXA73 \
  -DNOFORTRAN=1 \
  -DDYNAMIC_ARCH=0 \
  -DBUILD_WITHOUT_LAPACK=On \
  -DBUILD_RELAPACK=Off \
  .

参考情報

clapack の Android ビルド(ndk-build であるが)

Compile Kaldi for 64-bit Android on Ubuntu 18
https://medium.com/swlh/compile-kaldi-for-64-bit-android-on-ubuntu-18-70967eb3a308

TODO

  • LAPACK をビルドする(clapack を使う)
  • cmake で cross compile を試す.
    • in-source ビルドでなんとかビルド. out-of-tree はちょっとめんどい(既存 config.h を消せばいける)
  • CORTEXA73 での性能を試す(Snapdragon 835 などの A73 アーキでいくらか速くなるはず?)
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2