2012-12-08 3 views
2

Voici fonction binarisation simple,erreurs lors de la compilation du code NEON sur Android

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 
} 

Il fonctionne très bien sur iOS. Cependant, quand je le compiler pour Android, il me donne une erreur:

error: invalid operands of types 'uint8x16_t {aka __vector(16) __builtin_neon_uqi}' and 'uint8x16_t {aka __vector(16) __builtin_neon_uqi}' to binary 'operator>'

J'utilise ce drapeau Android.mk pour permettre NEON:

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

Répondre

3

La différence vient du fait de différents compilateurs. Pour iOS, vous compilez avec Clang mais pour Android vous construisez le code avec GCC (à moins que vous ne remplaciez les valeurs par défaut).

GCC est beaucoup plus stupide sur les types de vecteurs et ne pouvait pas les utiliser avec les opérateurs C/C++ comme > ou &. Donc, vous avez deux options de base:

  1. Essayez de compiler avec Clang de la dernière R8C Android NDK

    Mettez NDK_TOOLCHAIN_VERSION=clang3.1 à votre Application.mk pour cela.

  2. Ressaisissez votre code en utilisant explicitement vld1q_u8 pour la charge, vst1q_u8 pour le magasin, vcgtq_u8 pour operator > et vandq_u8 pour operator &
+0

N'a pas essayé la première option, mais le second fonctionne très bien. Merci! – Max

Questions connexes