背景
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
を消せばいける)
- in-source ビルドでなんとかビルド. out-of-tree はちょっとめんどい(既存
- CORTEXA73 での性能を試す(Snapdragon 835 などの A73 アーキでいくらか速くなるはず?)