es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué Clang no utiliza vcnt para __builtin_popcountll en AArch32?

La prueba simple,

c
unsigned f(unsigned long long x) {
return __builtin_popcountll(x);
}

cuando se compila con clang –target=arm-none-linux-eabi -mfpu=neon -mfloat-abi=softfp -mcpu=cortex-a15 -Os, resulta en que el compilador emite numerosas instrucciones para implementar el popcount clásico para las palabras bajas y altas en x en paralelo, y luego suma los resultados.

Me parece, al revisar los manuales de arquitectura, que el código de NEON similar al que se genera para

#include <arm_neon.h>

unsigned f(unsigned long long x) {
    uint8x8t v = vcntu8(vcreateu8(x));
    return vgetlaneu64(vpaddlu32(vpaddlu16(vpaddlu8(v))), 0);
}

habría sido beneficioso en términos de tamaño al menos, aunque no necesariamente en términos de rendimiento.

¿Por qué Clang no lo hace? ¿Simplemente le estoy dando opciones incorrectas? ¿Son las transiciones de ARM a NEON a ARM tan espectacularmente lentas, incluso en el A15, que no vale la pena? (Esto es lo que un comentario en una pregunta relacionada parece sugerir, pero muy brevemente). ¿El código de Clang para AArch32 carece de cuidado y atención, ya que casi todos los dispositivos móviles modernos usan AArch64? (Eso parece improbable, pero GCC, por ejemplo, se sabe que ocasionalmente tiene una mala generación de código en arquitecturas no prominentes, como PowerPC o MIPS).


Los opciones de Clang podrían ser incorrectas o redundantes, ajustar según sea necesario.

En mis experimentos, GCC tampoco parece hacer eso, solo emitiendo una llamada a __popcountdi2, pero eso sugiere que simplemente podría estar usándolo incorrectamente.
</arm_neon.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que Clang no genera código NEON para el fragmento de código dado debido a que las transiciones de ARM a NEON a ARM son demasiado lentas, incluso en el A15. Esto es lo que sugiere un comentario en una pregunta relacionada. También es posible que el código Clang para AArch32 carezca de cuidado y atención, ya que casi todos los dispositivos móviles modernos utilizan AArch64. GCC no parece hacer esto tampoco, ya que emite una llamada a __popcountdi2. Esto sugiere que el código podría ser llamado incorrectamente.

Comments are closed.