首頁 > 軟體

Ne10編譯安裝

2020-06-16 16:45:18

介紹

NEON,即“ARM Advanced SIMD”,是ARM從ARMv7開始提供的高階單指令多資料(SIMD)擴充套件。它是一種64/128位元混合SIMD體系結構。NEON在網上的資料比較少,對於新手來說不太友好。一番折騰之後,終於在GIT上找到一個封裝好的NEON庫,Ne10,內部用組合實現了若干基本運算。

Git地址

安裝指南

預備

先安裝arm-linux交叉編譯器:

sudo apt-get install gcc-arm-linux-gnueabihf

sudo apt-get install g++-arm-linux-gnueabihf

否則,會出現編譯錯誤

cc: error: unrecognized command line option ‘-mthumb-interwork’
cc: error: unrecognized command line option ‘-mthumb’
cc: error: unrecognized command line option ‘-mfpu=vfp3’

作為小白的我不知所以,抓狂很久,直到看到根目錄下的GNUlinux_config.cmake才恍然大誤大悟。
關於abi的介紹,可參考這篇部落格
交叉編譯器

編譯

Native compilation on *nix platforms

編譯命令

cd $NE10_PATH                      # Change directory to the location of the Ne10 source
mkdir build && cd build            # Create the `build` directory and navigate into it
export NE10_LINUX_TARGET_ARCH=armv7 # Set the target architecture (can also be "aarch64")
cmake -DGNULINUX_PLATFORM=ON ..    # Run CMake to generate the build files
make                                # Build the project

這步總是有問題,找到的編譯器是gccg++,而不是gcc-arm-linux-gnueabihfg++-arm-linux-gnueabihf

-- Found assembler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works

...Cross compilation on *nix platforms...

編譯命令

cd $NE10_PATH
mkdir build && cd build
export NE10_LINUX_TARGET_ARCH=armv7  # Can also be "aarch64"
cmake -DCMAKE_TOOLCHAIN_FILE=../GNUlinux_config.cmake ..
make

這步是ok的。找到了合適的編譯器

-- Found assembler: /usr/bin/arm-linux-gnueabihf-as
-- Check for working C compiler: /usr/bin/arm-linux-gnueabihf-gcc
-- Check for working C compiler: /usr/bin/arm-linux-gnueabihf-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/arm-linux-gnueabihf-g++
-- Check for working CXX compiler: /usr/bin/arm-linux-gnueabihf-g++ -- works

成功編譯。

Linking C static library libNE10.a
[ 94%] Built target NE10
Scanning dependencies of target NE10_test_static
[ 95%] Building C object samples/CMakeFiles/NE10_test_static.dir/NE10_sample_intro.c.o
[ 96%] Building C object samples/CMakeFiles/NE10_test_static.dir/NE10_sample_matrix_multiply.c.o
[ 97%] Building C object samples/CMakeFiles/NE10_test_static.dir/NE10_sample_complex_fft.c.o
[ 98%] Building C object samples/CMakeFiles/NE10_test_static.dir/NE10_sample_fir.c.o
[100%] Building C object samples/CMakeFiles/NE10_test_static.dir/NE10_samples.c.o
Linking CXX executable NE10_test_static
[100%] Built target NE10_test_static

作者還提到

Additionally, for systems without hardware floating point support, the appropriate compilation options should be added to the CMAKE_C_FLAGS and CMAKE_ASM_FLAGS variables in the root CMakeLists.txt file. For example, -mfloat-abi=softfp -mfpu=neon.

執行/build/samples/NE10_test_static出現錯誤

bash: ./NE10_test_static: cannot execute binary file: Exec format error

應該是32位元程式不能執行在64位元系統上。

64位元編譯

編譯64位元程式時(armv7改為aarch64)出現問題

In file included from /home/XXX/Ne10-master/modules/imgproc/NE10_resize.neon.c:28:0:
/home/XXX/Ne10-master/modules/imgproc/NE10_resize.neon.c: In function ‘ne10_img_vresize_linear_neon’:
/home/XXX/Ne10-master/modules/imgproc/NE10_resize.neon.c:174:19: error: incompatible types when initializing type ‘int32x4_t’ using type ‘int32x2_t’
        qT_0123 = vmlaq_lane_s32 (qT_0123, qS1_0123, dBeta, 1);

還沒有找到問題所在。

...for Android

編譯命令

cd $NE10_PATH
mkdir build && cd build
export ANDROID_NDK=/absolute/path/of/android-ndk  # Change to your local ndk path
export NE10_ANDROID_TARGET_ARCH=armv7  # Can also be "aarch64"
cmake -DCMAKE_TOOLCHAIN_FILE=../android/android_config.cmake ..
make

找到編譯器

-- Found assembler: /home/XXX/android-ndk-r13b//toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-as
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - failed
-- Target architecture: armv7
-- Building type: RELEASE
-- Loaded toolchain:
    /home/XXX/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
    /home/XXX/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
    /home/XXX/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-as

成功編譯

Linking C static library libNE10.a
Scanning dependencies of target NE10_test_static
Linking CXX executable NE10_test_static
Scanning dependencies of target NE10_test_demo
Linking CXX shared library libNE10_test_demo.so
[100%] Built target NE10_test_demo

Android執行結果

將運算重複執行十萬次。具體還需要深入理解後再分析。

# Introduction
ne10_addc_float: 0.610000
ne10_addc_float_c: 1.863000
ne10_addc_float_neon: 0.652000

# Matrix Multiply
ne10_mulmat_3x3f: 4.211000
ne10_mulmat_3x3f_c: 7.352000
ne10_mulmat_3x3f_neon: 4.246000

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-09/154270.htm


IT145.com E-mail:sddin#qq.com