procesadores procesador arquitectura arm simd neon cortex-a8

procesador - arquitectura arm pdf



ARM Cortex-A8: Cuál es la diferencia entre VFP y NEON (4)

En el procesador ARM Cortex-A8, entiendo lo que NEON es, es un coprocesador SIMD.

Pero, ¿la unidad VFP (Vector Floating Point), que también es un coprocesador, funciona como un procesador SIMD? Si es así, ¿cuál es mejor usar?

Leí algunos enlaces como -

  1. Link1

  2. Link2 .

Pero no es muy claro lo que significan. Dicen que VFP nunca fue pensado para SIMD, pero en Wiki leí lo siguiente: " La arquitectura VFP también admite la ejecución de instrucciones vectoriales cortas, pero operan en cada elemento vectorial secuencialmente y, por lo tanto, no ofrecen el rendimiento de SIMD verdadero ( Paralelismo de instrucción única).

No está tan claro qué creer, ¿alguien puede dar más información sobre este tema?


IIRC, el VFP es un coprocesador de punto flotante que funciona secuencialmente.

Esto significa que puede usar la instrucción en un vector de flotantes para el comportamiento similar a SIMD, pero internamente, la instrucción se realiza en cada elemento del vector en secuencia .

Si bien el tiempo total requerido para la instrucción se reduce debido a la instrucción de carga única, el VFP aún necesita tiempo para procesar todos los elementos del vector.

El verdadero SIMD obtendrá más rendimiento del punto flotante neto, pero el uso de VFP con vectores es aún más rápido que el uso puramente secuencial.


Arquitectónicamente, VFP (no se llamó Vector Floating Point por nada) tiene una disposición para operar en un vector de punto flotante en una sola instrucción. No creo que alguna vez ejecute varias operaciones simultáneamente (como SIMD verdadero), pero podría ahorrar algo de tamaño del código. Sin embargo, si lee el Manual de referencia de arquitectura ARM en la ayuda de Shark (como lo describo en mi introducción a NEON, enlace 1 en la pregunta), verá en la sección A2.6 que la característica vectorial de VFP está obsoleta en ARMv7 (que es lo que implementa Cortex A8), y el software debería usar SIMD Avanzado para operaciones de vectores de coma flotante.

Peor aún, en la implementación de Cortex A8, VFP se implementa con una unidad de ejecución VFP Lite (Read Lite como que ocupa una superficie de silicio más pequeña, no con menos funciones), lo que significa que es realmente más lento que en el ARM11, por ejemplo. Afortunadamente, la mayoría de las instrucciones de VFP de precisión simple son ejecutadas por la unidad NEON, pero no estoy seguro de que las operaciones vectoriales de VFP sí lo hagan; e incluso si lo hacen, ciertamente ejecutan más lento que con las instrucciones NEON.

Espero que aclare las cosas!


Para armv7 ISA (y variantes)

El NEON es una unidad SIMD y de procesamiento de datos en paralelo para datos enteros y de punto flotante y VFP es una unidad de punto flotante completamente compatible con IEEE-754. En particular, en el A8, la unidad NEON es mucho más rápida para casi todo, incluso si no tiene datos altamente paralelos, ya que el VFP no está canalizado.

Entonces, ¿por qué alguna vez usarías el VFP?

La diferencia más importante es que el VFP proporciona un punto flotante de doble precisión.

En segundo lugar, hay algunas instrucciones especializadas que VFP ofrece que no hay implementaciones equivalentes en la unidad NEON. Me viene a la mente SQRT, tal vez algunas conversiones de tipo.

Pero la diferencia más importante que no se menciona en la respuesta de Cosmin es que la tubería de punto flotante NEON no es totalmente compatible con IEEE-754. La mejor descripción de las diferencias se encuentra en la descripción del registro de FPSCR .

Debido a que no es compatible con IEEE-754, un compilador no puede generar estas instrucciones a menos que le indique al compilador que no está interesado en el cumplimiento total. Esto se puede hacer de varias maneras.

  1. Usando una función intrínseca para forzar el uso de NEON, por ejemplo, consulte la Lista de funciones intrínsecas de neón de GCC .
  2. Pregúntele al compilador, muy bien. Incluso las versiones GCC más nuevas con -mfpu=neon no generarán instrucciones NEON de coma flotante a menos que también especifique -funsafe-math-optimizations .

Para armv8 + ISA (y variantes) [Actualización]

NEON ahora es totalmente compatible con IEE-754, y desde el punto de vista de un programador (y compilador), en realidad no hay demasiada diferencia. La precisión doble ha sido vectorizada. Desde el punto de vista de la microarquitectura, dudo que sean unidades de hardware diferentes. ARM documenta las instrucciones escalares y vectoriales por separado, pero ambas forman parte de "SIMD avanzado".


Hay bastante diferencia entre los dos. Neon es un procesador acelerador SIMD (Single Instruction Multiple Data) como parte del núcleo ARM. Significa que durante la ejecución de una instrucción, la misma operación ocurrirá en hasta 16 conjuntos de datos en paralelo. Dado que hay un paralelismo dentro del Neon, puede obtener más MIPS o FLOPS de Neon de lo que puede hacer un procesador SISD estándar que funcione con la misma frecuencia de reloj.

El mayor beneficio de Neon es si desea ejecutar la operación con vectores, es decir, codificación / decodificación de video. También puede realizar operaciones de punto flotante de precisión simple (flotante) en paralelo.

VFP es un acelerador de hardware de punto flotante clásico. No es una arquitectura paralela como Neon. Básicamente, realiza una operación en un conjunto de entradas y devuelve una salida. Su propósito es acelerar los cálculos de coma flotante. Admite punto flotante de precisión simple y doble.

Tienes 3 posibilidades para usar Neon:

  • use funciones intrínsecas #include "arm_neon.h"
  • en línea el código de ensamblaje
  • deje que el gcc haga las optimizaciones para usted proporcionando -mfpu=neon como argumento (gcc 4.5 es bueno en esto)