使用未声明的标识符 'vpaddq_u8'
use of undeclared identifier 'vpaddq_u8'
我在 android-ndk 中使用霓虹灯,
但我遇到了主题标题的问题。
我在这里下载 hello-neon 演示:
https://github.com/googlesamples/android-ndk
这是一个展示如何在 android ndk 中使用 neon 的演示。
然后我像这样添加代码:
#include <arm_neon.h>
uint16_t neonTest(uint8x16_t input){
uint8x16_t minput = vandq_u8(input,input);
uint8x16_t tmp = vpaddq_u8(minput,minput);
tmp = vpaddq_u8(tmp,tmp);
tmp = vpaddq_u8(tmp,tmp);
return vgetq_lane_u16(vreinterpretq_u16_u8(tmp),0);
}
最奇怪的是:vandq_u8 和 vpaddq_u8 都包含在 arm_neon.h 中,但异常跟踪是:
error: use of undeclared identifier 'vpaddq_u8'
这意味着 'vandq_u8' 是 include 但 'vpaddq_u8' 不是。但它们在同一个 header 文件中。
我该如何解决这个问题?
我认为这里的问题是您不仅要为 ARM 编译相同的代码,还要为 x86 编译相同的代码。
NDK 也有一个适用于 x86 的 arm_neon.h 版本,它有一组不完整的 ARM 内在函数,使用不同的 SSE 内在函数来模拟它们。这允许对 x86 使用相同的 SIMD 代码,但不会获得最佳性能。 (这是否是可取的,或者它是否真的给你比普通串行代码更好的性能,是非常有争议的。)这个 header 确实包含 vandq_u8
,但缺少 vpaddq_u8
。
因此,确保不要为 x86 编译包含 NEON 内在函数的代码(从 build.gradle
中的 ndk.abiFilters
中删除 x86 和 x86_64)。或者,使用 ifdefs 仅在针对 ARM/AArch64 时使用此代码,并将其替换为其他架构的后备。
我在 android-ndk 中使用霓虹灯,
但我遇到了主题标题的问题。
我在这里下载 hello-neon 演示:
https://github.com/googlesamples/android-ndk
这是一个展示如何在 android ndk 中使用 neon 的演示。
然后我像这样添加代码:
#include <arm_neon.h>
uint16_t neonTest(uint8x16_t input){
uint8x16_t minput = vandq_u8(input,input);
uint8x16_t tmp = vpaddq_u8(minput,minput);
tmp = vpaddq_u8(tmp,tmp);
tmp = vpaddq_u8(tmp,tmp);
return vgetq_lane_u16(vreinterpretq_u16_u8(tmp),0);
}
最奇怪的是:vandq_u8 和 vpaddq_u8 都包含在 arm_neon.h 中,但异常跟踪是:
error: use of undeclared identifier 'vpaddq_u8'
这意味着 'vandq_u8' 是 include 但 'vpaddq_u8' 不是。但它们在同一个 header 文件中。
我该如何解决这个问题?
我认为这里的问题是您不仅要为 ARM 编译相同的代码,还要为 x86 编译相同的代码。
NDK 也有一个适用于 x86 的 arm_neon.h 版本,它有一组不完整的 ARM 内在函数,使用不同的 SSE 内在函数来模拟它们。这允许对 x86 使用相同的 SIMD 代码,但不会获得最佳性能。 (这是否是可取的,或者它是否真的给你比普通串行代码更好的性能,是非常有争议的。)这个 header 确实包含 vandq_u8
,但缺少 vpaddq_u8
。
因此,确保不要为 x86 编译包含 NEON 内在函数的代码(从 build.gradle
中的 ndk.abiFilters
中删除 x86 和 x86_64)。或者,使用 ifdefs 仅在针对 ARM/AArch64 时使用此代码,并将其替换为其他架构的后备。