【海思】-HISI 3559 Aクロスコンパイルopenblasとテスト
17009 ワード
要旨:openblasは主にマトリクス演算の加速に用いられる
openblasをダウンロードします.ここでは0.3.7バージョンを使用します.https://github.com/xianyi/OpenBLAS コンパイル前提 クロスコンパイルツールチェーンaarch 64-linux-gnu をインストールする必要があります
ダウンロード先は次のとおりです.https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/コンパイル・サーバにコピーし、ハイスはこのオープン・ソース・ツール・チェーンに交差して切り替え、次のコマンドを実行します.クロスコンパイラ検証aarch 64-linux-gnu-gcc--version クロスコンパイルopenblas 結果インストールディレクトリopenblas_install,lib,include,binフォルダ あり
code
コンパイルtxt cmakeの書き方は他のダイナミックライブラリの使用と同じです.ヘッダファイルとライブラリファイル を追加リンク時に を加える
私たちが普段c++をコンパイルしているプロジェクトは、 です.は、システムのデフォルトのg++を使用してコンパイルされています.hisi 3559 aのプロジェクトをコンパイルするときは、aarch 64-linux-gnu-g++クロスコンパイラを使用する必要があります.cmakeのCMAKE_を通ることができますCXX_COMPILERで指定します.そこでクロスコンパイルのコマンドは:
しゅつりょく
Scanning dependencies of target main [ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o [100%] Linking CXX executable main [100%] Built target main
上の方法は、コマンドラインにおいて、長いパスを入力するには、まだ多重化できません.cmakeのcmake_を使うことができますtoolchain_fileによる指定 hisi 3559を新規作成します.cmakeファイル(一般アプリケーション開発ドキュメントで提供される)、書き込み: コンパイル.これで簡潔で多重化されます.
コンパイルされた実行可能ファイルmainをhisi 3559上の に転送する. openblas_install/libファイルhisi 3559をアップロードし、環境変数 を設定 main を実行する結果 -8.000000 16.000000 -2.000000 10.000000 -8.000000 4.000000 7.000000 12.000000 5.000000
https://blog.csdn.net/heliangbin87/article/details/103375571 https://blog.csdn.net/liqiming100/article/details/78841227
1.openblasクロスコンパイル
ダウンロード先は次のとおりです.https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/コンパイル・サーバにコピーし、ハイスはこのオープン・ソース・ツール・チェーンに交差して切り替え、次のコマンドを実行します.
tar xf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
vi .profile
PATH="$HOME/bin:$PATH:$HOME/bin/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin"
source .profile
tar -zxvf OpenBLAS-0.3.7.tar.gz
cd OpenBLAS-0.3.7
make BINARY=64 CC=aarch64-linux-gnu-gcc NOFORTRAN=1 HOSTCC=gcc TARGET=ARMV8
make PREFIX=../openblas_install install
.
├── bin
├── include
│ ├── cblas.h
│ ├── f77blas.h
│ ├── lapacke_config.h
│ ├── lapacke.h
│ ├── lapacke_mangling.h
│ ├── lapacke_utils.h
│ └── openblas_config.h
└── lib
├── cmake
│ └── openblas
│ ├── OpenBLASConfig.cmake
│ └── OpenBLASConfigVersion.cmake
├── libopenblas.a -> libopenblas_armv8p-r0.3.7.a
├── libopenblas_armv8p-r0.3.7.a
├── libopenblas_armv8p-r0.3.7.so
├── libopenblas.so -> libopenblas_armv8p-r0.3.7.so
├── libopenblas.so.0 -> libopenblas_armv8p-r0.3.7.so
└── pkgconfig
└── openblas.pc
2.使用テスト
code
#include
#include
int main() {
int i = 0;
double A[6] = {1.0,3.0,1.0,-3.0,4.0,-1.0};
double B[6] = {1.0,4.0,1.0,-3.0,4.0,-1.0};
double C[9] = {.5,.5,.5,1.5,.5,2.5,.5,.5,.5};
int M = 3; // row of A and C
int N = 3; // col of B and C
int K = 2; // col of A and row of B
double alpha = 1.0;
double beta = 0.0;
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, K, B, N, beta, C, N);
//CblasRowMajor
//CblasNoTrans
for (i = 0; i < 9; i++) {
printf("%lf ", C[i]);
}
printf("
");
return 1;
}
コンパイルtxt
cmake_minimum_required (VERSION 2.6)
project (TEST)
set (TEST_VERSION 0.1)
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_SRC)
include_directories(/home/yangna/chenjun/HISI3559a/openblas_install/include) #
# link_directories(/home/yangna/chenjun/HISI3559a/openblas_install/lib)
find_library(Openblas_LIBS openblas /home/yangna/chenjun/HISI3559a/openblas_install/lib) #
add_executable(main ${DIR_SRC})
target_link_libraries(main ${Openblas_LIBS})
target_link_libraries(main -lm) #
target_link_libraries(main -lpthread)
-lm -lpthread
の2つの2.1 cmake+cxx_compiler指定
mkdir build && cd build
cmake ..
make
mkdir build && cd build
cmake -DCMAKE_CXX_COMPILER=/home/yangna/Atlas500_DDK/toolchains/Euler_compile_env_cross/arm/cross_compile/install/bin/aarch64-linux-gnu-g++ ..
make
しゅつりょく
Scanning dependencies of target main [ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o [100%] Linking CXX executable main [100%] Built target main
2.2 cmake+CMAKE_TOOLCHAIN_FILE指定
set(EULER_CROSS_PATH /home/yangna/Atlas500_DDK/toolchains/Euler_compile_env_cross)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools ${EULER_CROSS_PATH}/arm/cross_compile/install/)
#set(CMAKE_SYSROOT ${tools}/sysroot)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
set(CMAKE_AR ${tools}/bin/aarch64-linux-gnu-ar)
set(CMAKE_RANLIB ${tools}/bin/aarch64-linux-gnu-ranlib)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../atlas500_host.cmake ..
make
3.hisi 3559で実行
vi /etc/profile
# for openblas lib , 2020-08-04
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/1_profile/openblas_lib
source /etc/profile
./main