首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android上编译NEON代码时出错

在Android上编译NEON代码时出错
EN

Stack Overflow用户
提问于 2012-12-08 09:30:08
回答 1查看 466关注 0票数 2

下面是简单的二值化函数

代码语言:javascript
复制
void binarize(void *output, const void *input, int begin, int end, uint8_t threshold) {
#ifdef __ARM_NEON__
    uint8x16_t thresholdVector = vdupq_n_u8(threshold);
    uint8x16_t highValueVector = vdupq_n_u8(255);
    uint8x16_t* __restrict inputVector = (uint8x16_t*)input;
    uint8x16_t* __restrict outputVector = (uint8x16_t*)output;
    for ( ; begin < end; begin += 16, ++inputVector, ++outputVector) {
        *outputVector = (*inputVector > thresholdVector) & highValueVector;
    }
#endif
}

它在iOS上运行得很好。然而,当我为Android编译它时,它给了我一个错误:

错误:类型“uint8x16_t {aka __vector(16) __builtin_neon_uqi}”和“uint8x16_t {aka __vector(16) __builtin_neon_uqi}”到二进制“operator>”的操作数无效

我在Android.mk中使用这个标志来启用NEON:

代码语言:javascript
复制
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
      LOCAL_ARM_NEON := true
endif
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-08 10:53:16

差异的出现是因为编译器的不同。对于iOS,您正在使用Clang编译,而对于Android,则使用GCC构建代码(除非覆盖默认值)。

GCC对于向量类型更愚蠢,不能将它们与C/C++操作符如>&一起使用。所以你有两个基本的选择:

  1. 尝试从最新的Android r8c中编译Clang 为此,将NDK_TOOLCHAIN_VERSION=clang3.1放到您的Application.mk中。
  2. 使用vld1q_u8 (加载)、vst1q_u8 (存储)、vcgtq_u8 ( operator > )和vandq_u8 ( operator & )显式重写代码。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13776228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档