2010-07-22 15 views

Respuesta

54

Una de las mayores diferencias es que la arquitectura armv6 tiene soporte de hardware para la aritmética de punto flotante de doble precisión, mientras que armv7 solo ofrece soporte de software heredado para la aritmética de coma flotante de doble precisión.

Para compensar, la arquitectura armv7 tiene una unidad "NEON" que brinda soporte de hardware deslumbrantemente rápido para la aritmética de punto flotante de precisión simple.

Esto es algo que deberá tener en cuenta si está haciendo algo que involucre la aritmética de coma flotante, ya sea que lo haga en precisión simple o doble. Si lo hace con doble precisión, pero no necesariamente necesita esa cantidad de precisión, probablemente pueda obtener un impulso significativo en el rendimiento de los dispositivos armv7 utilizando una sola precisión.

Apple cubrió muchas de las diferencias entre armv6 y armv7 y una introducción al marco Accelerate en una de sus sesiones WWDC de este año. Los videos aún deberían estar disponibles en iTunes (a partir de julio de 2010).

+5

En realidad, según Stephen Canon, las operaciones de coma flotante de precisión simple y doble se realizan en hardware en armv6: http://stackoverflow.com/questions/1622729/double-vs-float-on-the-iphone/ 1622786 # 1622786 –

+0

Eso es verdad. Me perdí de eso. – Jasarien

3

Debe compilar para ambos si desea que su aplicación se ejecute en iPad y en todos los modelos de iPhone/iPod toch. Los dispositivos iOS antiguos usan arm6 y los nuevos usan arm7.

La única razón para no compilar para una u otra sería el tamaño reducido de la aplicación, ya que solo necesita una versión compilada del código. Pero a menos que tenga una base de código grande, esta diferencia de tamaño de archivo será bastante marginal.

+0

Entonces, ¿cuál es la importancia de la arquitectura activa en el menú desplegable para la construcción? –

+0

Creo que lo sacaron en el último SDK. Por lo general, la configuración de tu compilación ha sido modificada de todos modos. –

3

arm7 está más optimizado para iPod Touch (tercera generación) y iPhone 3GS y más reciente. Necesitará usar 'Estándar/Arm6 + Arm7' cuando compile para dispositivos más antiguos. En la práctica, no he visto mucha diferencia de rendimiento en mis aplicaciones.

79

Los dispositivos iOS anteriores (iPhone, iPhone 3G, iPod touch de primera y segunda generación) tenían CPU que solo admitían el conjunto de instrucciones armv6. El iPhone 3G S (y el iPad y el iPod touch de tercera generación) tiene un procesador más nuevo que también es compatible con el conjunto de instrucciones de armv7. En general, armv7 es más rápido en estos procesadores más nuevos y se recomienda que al menos incluya una compilación armv7 en sus aplicaciones en el futuro (en una aplicación solo para iPad, probablemente solo pueda compilar para armv7).

Como señala Jasarien, el área de mayor diferencia entre los conjuntos de instrucciones es en operaciones de coma flotante. En armv6, las aplicaciones tendían a construirse usando el conjunto reducido de instrucciones Thumb para producir binarios más pequeños, pero el rendimiento del punto flotante del Thumb era terrible. Por lo tanto, era necesario desactivar Thumb porque quería cálculos de coma flotante más rápidos. En armv7, el conjunto de instrucciones Thumb-2 ya no tiene esta limitación, por lo que Apple recomienda que lo compile casi todo el tiempo.

Puede hacer que la configuración de Thumb build sea condicional para que esté desactivada para dispositivos más antiguos y para dispositivos más nuevos. Para hacer esto, vaya a la configuración de compilación de Xcode y seleccione la opción Compilar para el pulgar. Vaya al menú en la parte inferior izquierda de la pantalla y elija la opción Agregar condición de configuración de compilación. En la nueva condición de configuración de construcción, elija ARMv6 para la arquitectura, desactive Thumb para ello, agregue otra condición, elija ARMv7 para su arquitectura y habilite Thumb para ello.

De acuerdo con la respuesta de Stephen Canon here, las operaciones de coma flotante de precisión simple y doble son compatibles con el hardware en armv6.Descubrí que la aritmética de precisión simple tiene un rendimiento ligeramente mejor en esta plataforma, quizás debido a que más operaciones se ajustan a la caché. En armv7, la unidad de punto flotante de NEON SIMD solo funciona en operaciones de precisión simple, por lo que puede haber una gran diferencia en el rendimiento entre las operaciones de precisión simple y doble.

Otras cuestiones que podrían ser de interés sobre este tema incluyen:

+0

A partir de Xcode 4.3, como parte de la migración del proyecto, Apple está configurando GCC_THUMB_SUPPORT = NO incondicionalmente. ¿Cualquier comentario? Parece contra intuitivo para mí y (por supuesto/lamentablemente) no hay nada de Apple al respecto. Sus documentos todavía dicen usar el pulgar para armv7. – smparkes

+0

@smparkes - Podría ser un error técnico en la migración del proyecto, porque el conjunto de instrucciones no debería haber cambiado. Todavía debería ser una ventaja tener las instrucciones Thumb-2 generadas para ARMv7. En el peor de los casos, perfile su aplicación (memoria y rendimiento) en ambas condiciones para ver cómo la configuración cambia las cosas. Cada vez que he intentado esto, construir para Thumb me ayudó en ARMv7. –

+0

Gracias, Brad. Creo que dejaré mis anulaciones actuales y rechazaré las de Xcode. Ahora para arreglar las otras cosas 4.3 se rompió ... – smparkes

4

Para mí, las principales ventajas de ARMv7 son :

  • pulgar-2
  • NEON

NEON debe ser codificado explícitamente, no se toman ventaja de que simplemente volver a compilar, pero si se puede invertir el tiempo que puede acelerar multimedia/juego operaciones por un factor de 8. Sin embargo, thumb-2 es prácticamente una reducción gratuita del tamaño del código casi sin inconvenientes (al contrario que el pulgar en ARMv6, que hace que el código de coma flotante sea mucho más lento en comparación con el modo ARM). Por supuesto, agregar otra versión de su ejecutable en ARMv7 no reducirá el tamaño de su ejecutable, pero reducirá su código en memoria, cachés, etc.

Cuestiones relacionadas