使用未声明的标识符“ vpaddq_u8”

时间:2019-04-19 04:28:54

标签: android-ndk neon

我在android-ndk中使用neon, 但是我在主题标题方面遇到了问题。
我在这里下载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);
}

最奇怪的是:arm_neon.h包含了vandq_u8和vpaddq_u8,但是异常跟踪是:

error: use of undeclared identifier 'vpaddq_u8'

这意味着'vandq_u8'被包括在内,但'vpaddq_u8'不被包括在内。但是它们在同一个头文件中。

我应该如何解决此问题?

1 个答案:

答案 0 :(得分:1)

我相信这里的问题是,您不仅要为ARM编译相同的代码,而且还要为x86编译同一代码。

NDK也为x86提供了一个arm_neon.h版本,该版本具有不完整的ARM内部函数集,该内部函数使用不同的SSE内部函数来模拟它们。这甚至允许为x86使用相同的SIMD代码,但不会获得最佳性能。 (这是否是可取的,或者是否确实比普通的串行代码提供了更好的性能,都存在争议。)此标头确实包含vandq_u8,但缺少vpaddq_u8

因此,请确保不要编译包含x86的NEON内在函数的代码(从ndk.abiFilters中的build.gradle删除x86和x86_64)。另外,使用ifdefs仅在针对ARM / AArch64时才使用此代码,并用其他架构的后备替代它。