Pregunta

procesador En ARM Cortex-A8, entiendo lo NEON es, es un co-procesador SIMD.

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

He leído algunos enlaces tales como -

  1. Link1

  2. Link2 .

Pero no es realmente muy claro lo que significan. Dicen que VFP nunca fue pensado para ser utilizado para SIMD sino en Wiki leí lo siguiente: - " la arquitectura también es compatible con VFP ejecución de instrucciones vectoriales cortos pero estos operan sobre cada elemento del vector secuencialmente y por lo tanto no ofrecen el rendimiento de la verdadera (Single Instruction Multiple Data) paralelismo SIMD. "

Es así que no está tan claro qué creer, ¿alguien puede elaborar más sobre este tema?

¿Fue útil?

Solución

Hay bastante diferencia entre los dos. Neon es un procesador de acelerador SIMD (Single múltiple de instrucciones de datos) como parte del núcleo ARM. Esto significa que durante la ejecución de una instrucción de la misma operación se producirá en hasta 16 conjuntos de datos en paralelo. Dado que no hay paralelismo en el interior del neón, usted puede obtener más MIPS o sandalias de neón de lo que puede un procesador de SISD estándar funcionando a la misma velocidad de reloj.

El mayor beneficio de neón es que si se desea ejecutar la operación con vectores, es decir, de vídeo de codificación / decodificación. También se puede realizar la precisión simple de operaciones de punto flotante (float) en paralelo.

VFP es un acelerador clásico de hardware de punto flotante. No es una arquitectura paralela como el neón. Básicamente se lleva a cabo una operación en un conjunto de entradas y devuelve una salida. Es propósito es acelerar los cálculos de punto flotante. Es compatible con punto flotante de precisión simple y doble.

Usted tiene 3 posibilidades de utilizar Neon:

    funciones
  • intrínsecos uso # include "arm_neon.h"
  • inline el código ensamblador
  • dejar que el gcc para hacer las optimizaciones para que al proporcionar -mfpu=neon como argumento (gcc 4.5 es buena en esto)

Otros consejos

Arquitectónicamente, VFP (no fue llamado vector de punto flotante para nada) de hecho tiene una disposición para operar en un vector de punto flotante en una sola instrucción. No creo que alguna vez realmente ejecuta las operaciones múltiples de forma simultánea (como verdadera SIMD), pero podría ahorrar un poco el tamaño del código. Sin embargo, si usted lee la arquitectura ARM Manual de referencia en la ayuda de tiburón (como lo describo en mi introducción al neón, enlace 1 en la pregunta), verá en la sección A2.6 que el vector de características de VFP está en desuso en ARMv7 (que es lo que los implementos de la corteza A8), y el software debe utilizar Advanced SIMD para las operaciones de punto flotante por vectores.

aún peor, en la implementación de la corteza A8, VFP se implementa con una unidad de ejecución VFP Lite (Lite leer como ocupando una superficie de silicio más pequeños, no como tener menos funciones), lo que significa que en realidad es más lento que en el ARM11, por ¡ejemplo! Afortunadamente, la mayoría de las instrucciones VFP de precisión simple se ejecutan por la unidad de neón, pero no estoy seguro de las operaciones de vectores VFP hacen; e incluso si lo hacen, sin duda más lento que ejecutan las instrucciones de neón.

La esperanza que borra lo arriba!

Para ARMv7 ISA (y variantes)

El neón es un SIMD y datos paralelos unidad de procesamiento para número entero y datos de punto flotante y el VFP es una unidad de punto flotante totalmente IEEE-754 compatible. En particular, en la A8, la unidad de neón es mucho más rápido para casi todo, incluso si usted no tiene datos altamente paralelas, ya que el VFP no es segmentado.

Entonces, ¿por qué nunca utilizar el VFP?!

El más importante diferencia es que el VFP proporciona el doble de coma flotante de precisión.

En segundo lugar, hay algunas instrucciones especializadas que VFP que las ofertas que no existen implementaciones equivalentes en la unidad de neón. SQRT viene a la mente, tal vez algunas conversiones de tipos.

Sin embargo, 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 están en la FPSCR Registro Descripción .

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

  1. Uso de una función intrínseca para forzar el uso de neón, por ejemplo, véase la GCC neón intrínseca Lista de funciones .
  2. Haga el compilador, muy bien. Incluso las versiones más recientes del CCG con -mfpu=neon no generarán instrucciones de punto flotante NEON menos que también especifique -funsafe-math-optimizations.

Para ARMv8 + ISA (y variantes) [Actualizar]

NEON es ahora totalmente compatible IEE-754, y desde un programador (y del compilador) punto de vista, en realidad no es mucha diferencia. Doble precisión ha sido vectorizado. Desde un punto de vista micro-arquitectura que tipo de duda de que son incluso diferentes unidades de hardware. ARM hace instrucciones escalares y vectoriales documento por separado, pero ambos son parte de "avanzada SIMD."

IIRC, el VFP es un coprocesador de coma flotante que funciona de forma secuencial.

Esto significa que usted puede utilizar la instrucción en un vector de flotadores para SIMD-como el comportamiento, pero internamente, la instrucción se realiza en cada elemento del vector en la secuencia .

Mientras que el tiempo total requerido para la instrucción se reduce por esto debido a la instrucción de carga única, el VFP todavía necesita tiempo para procesar todos los elementos del vector.

Es cierto SIMD ganará un rendimiento más neta de coma flotante, pero utilizando el VFP con vectores sigue siendo más rápido que el uso puramente secuencial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top