使用未声明的标识符'vpaddq_u8'

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

我在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);
}

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

error: use of undeclared identifier 'vpaddq_u8'

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

我该如何解决这个问题?

android-ndk neon
1个回答
1
投票

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

NDK也有一个版本的arm_neon.h也用于x86,它有一套不完整的ARM内在函数,它使用不同的SSE内在函数模拟它们。即使对于x86,这也允许使用相同的SIMD代码,但不会获得最佳性能。 (这是否是可取的,或者它是否确实给你提供比普通串行代码更好的性能,是非常有争议的。)这个标题确实包含vandq_u8,但是缺少vpaddq_u8

因此,请确保不编译包含x86的NEON内在函数的代码(从ndk.abiFilters中的build.gradle中删除x86和x86_64)。或者,使用ifdef仅在定位ARM / AArch64时使用此代码,并将其替换为其他体系结构的后备。

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