2009-07-29 9 views
25

Me preguntaba si alguien tenía números duros en el rendimiento de ARM vs Thumb code en iPhone 3GS. Específicamente para código de punto no flotante (VFP o NEON): conozco los problemas con el rendimiento de punto flotante en el modo Thumb.Rendimiento de ARM vs Thumb en iPhone 3GS, código de punto no flotante

¿Existe algún punto en el que el tamaño de código adicional de las instrucciones ARM más grandes se convierta en un riesgo de rendimiento? En otras palabras, si mi código ejecutable es relativamente pequeño en comparación con la memoria disponible, ¿hay alguna diferencia en el rendimiento entre activar el modo Thumb?

La razón por la que pregunto es que si bien puedo habilitar ARM para los archivos fuente específicos de NEON en Xcode usando la opción "-marm", esto rompe la compilación del simulador porque GCC está construyendo x86. Me preguntaba si debería desactivar "compilar como pulgar" y terminar con esto.

+2

Ooh Random -1 voto sin explicación. Buena esa. – Justicle

+3

Wow otro. Personas de esfuerzo con clase: todos estamos aprendiendo mucho. – Justicle

+0

+1 - Parece una pregunta razonable para mí (solo te devuelve a cero aunque temo ...) –

Respuesta

13

No sé sobre el iPhone, pero una afirmación general de que el pulgar es más lento que ARM no es correcto en absoluto. Dada la memoria de estado de cero de 32 bits de ancho, el pulgar será un poco más lento, números como 5% o 10%. Ahora bien, si se trata de thumb2 que es una historia diferente, se dice que thumb2 puede funcionar más rápido, no sé qué tiene el iPhone, supongo que no es thumb2.
Si no se está quedando sin memoria de 32 bits de estado de espera, sus resultados variarán. Una gran cosa es la memoria de 32 bits de ancho. Si está ejecutando un bus de 16 bits de ancho, como la familia GameBoy Advance, y hay algunos estados de espera en esa memoria o ROM, entonces pulgar puede ejecutar fácilmente ARM para el rendimiento, aunque se necesitan más instrucciones para realizar la misma tarea.

¡Pruebe su código! No es difícil inventar una prueba que proporcione los resultados que le interesan o no. Es tan fácil mostrar que el brazo se lleva el pulgar, ya que el pulgar se lleva el brazo. A quién le importa qué son los dhrystones, es qué tan rápido corre SU código HOY que importa.

Lo que he descubierto a lo largo de los años en el rendimiento del código de prueba para ARM es que su código y su compilador son el factor principal. Por lo tanto, el pulgar es un poco más lento en teoría porque usa un poco más de instrucciones para realizar la misma tarea. ¿Pero sabías que tu compilador favorito podría ser horrible y que con solo cambiar los compiladores podrías ejecutar varias veces más rápido (gcc entra en esa categoría)? O usando el mismo compilador y mezclando las opciones de optimización. De cualquier forma, puede observar la diferencia entre el brazo y el pulgar al usar las herramientas con inteligencia. Probablemente lo sepas, pero te sorprendería saber cuántas personas piensan que la única forma de que compren el código es la única y la única forma de obtener un mejor rendimiento es lanzar más memoria u otro hardware al problema.

Si está en el iPhone, escucho que esas personas están usando LLVM?Me gusta el concepto de llvm de muchas maneras y estoy ansioso por usarlo como mi controlador diario cuando madura, pero descubrí que produce un código que era 10-20% (o mucho más) más lento para la tarea en particular que estaba haciendo. Estaba en modo armado, no probé el modo pulgar y tenía un caché de 1 y 1 encendidos. Si hubiera probado sin las memorias caché para comparar verdaderamente el pulgar con el brazo, probablemente vería el pulgar un poco más lento, pero si lo piensas (que no me interesaba en ese momento) puedes almacenar el doble del código de pulgar que código de arma que PODRÍA implicar que a pesar de que hay un poco más de código en general para la tarea, almacenar en caché una cantidad significativamente mayor y reducir el tiempo de recuperación promedio puede ser notablemente más rápido. Puede que tenga que intentarlo.

Si está utilizando llvm, tiene el otro problema de varios lugares para realizar optimizaciones. Pasando de C a bytecode puede optimizar, luego puede optimizar el bytecode, puede fusionar todo su bytecode y optimizarlo como un todo, y luego, al pasar de un código de bytes a un ensamblador, puede optimizarlo. Si solo tenía 3 archivos de origen y suponía que solo había dos niveles de optimización por oportunidad, los que no optimizan u optimizan, con gcc tendría que probar 8 combinaciones, con llvm el número de experimentos es casi un orden de magnitud mayor . Más de lo que realmente puedes correr, de cientos a miles. Para la única prueba que estaba ejecutando, NO opimizing en el paso de C a bytecode, NO optimizando el bytecode mientras estaba separado, pero optimizando después de fusionar los archivos de bytecode en uno grande (ger). Tener LLC optimize en el camino para armar produjo los mejores resultados.

Conclusión ... prueba, prueba, prueba.

EDIT:

He estado utilizando la palabra de código de bytes, creo que el término correcto es código binario en el mundo LLVM. El código en los archivos .bc es lo que quiero decir ...

Si va de C a ARM usando LLVM, hay un código de bits (bc) en el medio. Hay opciones de línea de comando para optimizar en el paso C a bc. Una vez que se puede optimizar por archivo, bc a bc. Si elige, puede combinar dos o más archivos bc en archivos bc más grandes, o simplemente convertir todos los archivos en un gran archivo bc. Entonces, cada uno de estos archivos combinados también se puede optimizar.

Mi teoría, que solo tiene un par de casos de prueba hasta ahora, es que si no hace ninguna optimización hasta que tenga todo el programa/proyecto en un archivo grande de bc, el optimizador tiene la cantidad máxima si información con la cual hacer su trabajo. Entonces eso significa ir de C a BC sin optimización. A continuación, combine todos los archivos bc en un gran archivo bc. Una vez que tenga todo como un gran archivo bc, deje que el optimizador realice su paso de optimización, maximizando la información y, con suerte, la calidad de la optimización. A continuación, vaya desde el archivo bc optimizado al ensamblador ARM. La configuración predeterminada para llc es con la optimización activada, desea permitir esa optimización, ya que es el único paso que sabe cómo optimizar para el objetivo. Las optimizaciones de bc a bc son genéricas y no específicas del objetivo (AFAIK).

Todavía tiene que probar, probar, probar. Continúe y experimente con optimizaciones entre los pasos, vea si hace que su programa se ejecute más rápido o más lento.

+0

+1 gracias por su visión de LLVM – slf

+0

¿Puede profundizar en esto? "NO opimizing en el paso de C a bytecode, NO optimizando el bytecode mientras está separado, pero optimizando después de fusionar los archivos de bytecode en uno grande (ger).El hecho de que llc se haya optimizado en el camino para armar produjo los mejores resultados ". – slf

+0

El iPhone 3GS tiene un Cortex-A8 que sí es compatible con Thumb-2. Sin embargo, no sé si Xcode le permitirá usarlo. revisión específica de iPhone? –

4

Vea este PDF de ARM/Thumb para conocer el rendimiento/tamaño del código/consumo de energía.

Profile Guided Selection of ARM and Thumb Instructions
      - Departamento de Ciencias de la Computación de la Universidad de Arizona por Rajiv Gupta

+0

Un enlace no es realmente una respuesta, pero lo he actualizado con un buen enlace. –

+0

Concluye que el código ARM genera código grande, mayor energía de I-cache pero más rápido; El código de pulgar genera código pequeño, baja energía de I-cache pero más lenta. –

+0

Ok, pero es un papel de 2002 ... – Antonio

1

código pulgar en esencia siempre será más lento que ARM equivalente. El único caso en que el código de pulgar puede ser una gran ganancia de rendimiento es si hace la diferencia entre el ajuste de su código en la memoria en el chip o el caché.

Es difícil dar cifras exactas sobre las diferencias de rendimiento, ya que depende totalmente de lo que hace realmente el código.

Puede establecer indicadores de compilador por arquitectura en XCode, lo que evitaría romper la compilación del simulador. Consulte la documentación de configuración de compilación de XCode.

Cuestiones relacionadas