如何在 Android 上使用 float16 neon 内在函数?

问题描述 投票:0回答:1

如何在 Android 上使用arm float16 内部函数?

考虑以下程序:

#include <arm_neon.h>

int main(int, char** argv) {
    const float16x8_t a = vdupq_n_f16(1.0F);
    const float16x8_t b = vdupq_n_f16(- 1.0F);
    const float16x8_t c = vaddq_f16(a, b);
}

以及以下 cmake 文件:

cmake_minimum_required(VERSION 3.15)
project(test CXX)
add_executable(test main.cpp)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -march=${MARCH}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -march=${MARCH}")
target_compile_options(test PRIVATE -Wall -Wextra -Wpedantic -g)
target_compile_features(test PRIVATE cxx_std_17)

使用以下命令实例化:

cmake -DCMAKE_ANDROID_API=26 -DANDROID_PLATTFORM="26"\                             
              -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
              -DCMAKE_ANDROID_NDK=/tmp/android-ndk-r25c  \
              -DCMAKE_ANDROID_STL_TYPE=c++_static -DCMAKE_ANDROID_ABI=arm64-v8a\
              -DCMAKE_BUILD_TYPE=Release -DMARCH=armv8.2-a -DCMAKE_SYSTEM_NAME=Android -S . -B build_android

编译程序时,出现以下错误:

/tmp/float16/main.cpp:6:27: error: use of undeclared identifier 'vaddq_f16'
    const float16x8_t c = vaddq_f16(a, b);
                          ^

据我所知,float16 可用于 Arm-v8.2。此外,函数

vaddq_f161
#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
中的 ifdef
arm_neon.h
保护。编译 Android 程序时,在什么情况下该标志设置为 true? Android ABI 注释 说 arm64-v8a 仅指 Arm-v8.0。有没有办法在 Android 上使用 float16 内在函数?

android c++ arm neon half-precision-float
1个回答
0
投票

回答问题(并参考上面问题的评论):

float16 内在函数可以与选项

-DMARCH=armv8.2-a+fp16
一起使用。请参阅GCC 文档,列出架构选项。

© www.soinside.com 2019 - 2024. All rights reserved.