【海思】-HISI 3559 Aクロスコンパイルopenblasとテスト

17009 ワード

要旨:openblasは主にマトリクス演算の加速に用いられる

1.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/コンパイル・サーバにコピーし、ハイスはこのオープン・ソース・ツール・チェーンに交差して切り替え、次のコマンドを実行します.
    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
    
  • クロスコンパイラ検証aarch 64-linux-gnu-gcc--version
  • クロスコンパイルopenblas
  • 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
    
  • 結果インストールディレクトリopenblas_install,lib,include,binフォルダ
  • あり
    .
    ├── 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)
    
  • cmakeの書き方は他のダイナミックライブラリの使用と同じです.ヘッダファイルとライブラリファイル
  • を追加
  • リンク時に-lm -lpthreadの2つの
  • を加える

    2.1 cmake+cxx_compiler指定

  • 私たちが普段c++をコンパイルしているプロジェクトは、
  • です.
    mkdir build && cd build
    cmake ..
    make
    
  • は、システムのデフォルトのg++を使用してコンパイルされています.hisi 3559 aのプロジェクトをコンパイルするときは、aarch 64-linux-gnu-g++クロスコンパイラを使用する必要があります.cmakeのCMAKE_を通ることができますCXX_COMPILERで指定します.そこでクロスコンパイルのコマンドは:
  • 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指定

  • 上の方法は、コマンドラインにおいて、長いパスを入力するには、まだ多重化できません.cmakeのcmake_を使うことができますtoolchain_fileによる指定
  • hisi 3559を新規作成します.cmakeファイル(一般アプリケーション開発ドキュメントで提供される)、書き込み:
  • 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で実行

  • コンパイルされた実行可能ファイルmainをhisi 3559上の
  • に転送する.
  • openblas_install/libファイル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 ./main
  • を実行する
  • 結果
  • -8.000000 16.000000 -2.000000 10.000000 -8.000000 4.000000 7.000000 12.000000 5.000000

    reference

  • https://blog.csdn.net/heliangbin87/article/details/103375571
  • https://blog.csdn.net/liqiming100/article/details/78841227