我在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'不被包括在内。但是它们在同一个头文件中。
我应该如何解决此问题?
答案 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时才使用此代码,并用其他架构的后备替代它。