ARM neon 指令 (Android)代码环境配置

本次使用的ARM平台是手机平台

  1. 首先确保安装好了NDK
    配置好了PATH变量,将NDK路径加入PATH
  2. CMakeList 设置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cmake_minimum_required (VERSION 3.16)
    project (Dome)
    add_subdirectory(./src/neon)
    add_executable(neon neon.cpp)
    set_target_properties(neon PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build")

    target_link_libraries(neon PRIVATE c++_static dl)

    set(THIS_COMPILE_FLAGS -march=armv8-a)

    target_compile_options(neon PRIVATE ${THIS_COMPILE_FLAGS})
  3. 编译脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
    -DANDROID_ABI="arm64-v8a" \
    -DANDROID_STL=c++_static \
    -DANDROID_NATIVE_API_LEVEL=android-21 \
    -DMNN_BUILD_FOR_ANDROID_COMMAND=true \
    -DANDROID_TOOLCHAIN=clang \
    -DCMAKE_GENERATOR="Unix Makefiles"
  4. 运行
    1
    adb push neon  /data/local/tmp && adb shell /data/local/tmp/neon
  5. 源代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
    #include <stdlib.h>
    #include <arm_neon.h>
    #include <math.h>
    #include <cstddef>

    int main()
    {
    //定义a, b, c
    unsigned char a[8] = {0, 1, 2, 3, 4, 5, 6, 7};
    unsigned char b[8] = {8, 9, 10, 11, 12, 13, 14, 15};
    unsigned char c[8];
    uint8x8_t rega, regb, regc; //定义3个8x8bit无符号整型的 NEON 寄存器
    //加载 a, b 到寄存器
    rega = vld1_u8(&a[0]);
    regb = vld1_u8(&b[0]);
    regc = vadd_u8(rega, regb); //做加法
    vst1_u8(&c[0], regc); //回写到c中
    //测试
    for(int i = 0 ; i < 8 ; i++)
    {
    printf("%d ",c[i] );
    }
    printf("\n");
    }

ARM neon 指令 (Android)代码环境配置
https://kangqi.site/2024/09/02/neon/neon 配置/
作者
klay
发布于
2024年9月2日
许可协议