2

ここに単純な二値化関数があります

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 を有効にします。

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
      LOCAL_ARM_NEON := true
endif
4

1 に答える 1

3

違いは、コンパイラの違いによるものです。iOS の場合は Clang でコンパイルしますが、Android の場合は GCC でコードをビルドします (デフォルトをオーバーライドしない限り)。

GCC は vector 型についてもっと愚かで、>orのような C/C++ 演算子でそれらを使用できませんでし&た。したがって、2 つの基本的なオプションがあります。

  1. 最新の Android NDK r8c から Clang でコンパイルしてみてください

    このためにあなたに入れNDK_TOOLCHAIN_VERSION=clang3.1ますApplication.mk

  2. vld1q_u8for load、vst1q_u8for store、vcgtq_u8foroperator >およびvandq_u8forを使用してコードを明示的に書き直しますoperator &
于 2012-12-08T10:53:16.070 に答える