Pregunta

Me preguntaba si alguien tenía alguna duro números en el BRAZO vs Pulgar código de rendimiento en el iPhone 3GS.Específicamente para los no-de punto flotante (VFP o NEÓN) código - soy consciente de los problemas con punto flotante de rendimiento en el Pulgar de modo.

Hay un punto donde el código adicional el tamaño de la más grande del BRAZO de instrucciones se convierte en un ejercicio de peligro?En otras palabras, si mi código ejecutable es relativamente pequeño en comparación con la memoria disponible, hay alguna mide diferencia de rendimiento para girar el Pulgar modo?

La razón que pido es que si bien puedo habilitar el BRAZO para NEON archivos de origen específico en Xcode con la "-marm" opción, de esta forma se rompe el Simulador de construir porque GCC es la construcción de x86.Me preguntaba si debería desactivar la opción "compilar pulgar" y hacer con ella.

¿Fue útil?

Solución

No sé sobre el iPhone, pero una declaración general de que el pulgar es más lento que el brazo no es correcto en absoluto. Teniendo en cuenta toda la memoria en estado de espera cero bits 32, con el pulgar será un poco más lento, como los números 5% o 10%. Ahora bien, si es thumb2 que es una historia diferente, se dice que thumb2 puede correr más rápido, no sé lo que el iPhone tiene mi conjetura es que no es thumb2.
Si no está funcionando de cero esperar por el estado de memoria de 32 bits a continuación, sus resultados pueden variar. Una gran cosa es la memoria de 32 bits de ancho. Si está ejecutando en un bus de ancho de 16 bits como la familia de Game Boy Advance, y hay algunos estados de espera en esa memoria o ROM, entonces el pulgar puede fácilmente ejecutar ARM para el rendimiento a pesar de que se necesita más instrucciones pulgar para llevar a cabo la misma tarea.

Prueba de su código! No es difícil inventar una prueba que proporciona los resultados que le interesan o no. Es tan fácil de mostrar brazo saca de quicio el pulgar, ya que es el pulgar golpes de distancia de brazo. A quién le importa lo que los dhrystone son, es la rapidez con que no ejecute el código HOY que importa.

Lo que he encontrado en los últimos años en el rendimiento del código de pruebas para ARM es que su código y su compilador son el gran factor. Por lo general es un pequeño tanto por ciento más lento en teoría, ya que utiliza un porcentaje de algunos más instrucciones a peform la misma tarea. Pero, ¿sabía que su compilador favorito podría ser horrible y simplemente cambiar compiladores podría ejecutar varias veces más rápido (gcc entra en esa categoría)? O usando el mismo compilador y mezclar las opciones de optimización. De cualquier manera usted puede sombrear la diferencia brazo / pulgar por ser inteligente sobre el uso de las herramientas. Usted probablemente sabe esto, pero te sorprendería saber cuántas personas piensan que la única manera que saben cómo compilar código es el único camino y la única manera de obtener un mejor rendimiento se tire más memoria u otro hardware en el problema.

Si usted está en el iPhone que escucho esa gente está usando LLVM? Me gusta el concepto llvm de muchas maneras y estoy con ganas de usarlo como mi diario de conductor cuando madura, pero nos pareció que para producir código que fue de 10-20% (o más) más lenta para la tarea particular que estaba haciendo. Yo estaba en el modo de armado, que no lo intenté modo de pulgar, y que tenía una caché L1 y L2 sucesivamente. Si hubiera probado sin los cachés de comparar realmente el pulgar para armar que probablemente vea el pulgar un pequeño tanto por ciento más lento, pero si usted piensa en él (que yo no estaba interesado en el tiempo) se puede almacenar en caché el doble de código pulgar de código brazo que podría dar a entender que a pesar de que hay un pequeño tanto por ciento más código general para la tarea, mediante el almacenamiento significativamente más de lo mismo y la reducción de la media se ha podido recuperar el pulgar de tiempo puede ser mucho más rápido. Voy a tener que ir a probar eso.

Si está utilizando llvm, tiene otro problema de múltiples lugares para realizar optimizaciones. Al pasar de C a bytecode puede optimizar, a continuación, puede optimizar el código de bytes en sí, a continuación, puede fusionar la totalidad de su código de bytes y optimizar que en su conjunto, a continuación, al pasar de código de bytes a ensamblador puede optimizar. Si usted tenía sólo 3 archivos de origen, y asumió que sólo había dos niveles de optimización por oportunidad, los que están siendo Dont optimizar o no optimizar, con gcc que tendría 8 combinaciones para poner a prueba, con llvm el número de experimentos es casi un orden de magnitud mayor . Más de lo que realmente puede funcionar, de cientos a miles. Para el ensayo estaba corriendo, NO opimizing en el paso C a código de bytes, entonces NO optimizar el código de bytes, mientras que por separado, pero la optimización después de combinar los archivos de código de bytes en un gran (GER) uno. El optimize llc tener en el camino hacia el brazo produjo los mejores resultados.

Bottom line ... 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 brazo usando LLVM, no hay código binario (BC) en el medio. Hay opciones de línea de comandos para la optimización de la C a ste bcpags. Una vez bc puede optimizar por archivo, BC a BC. Si decide que puede fusionar dos o más archivos en bc bc grandes archivos, o simplemente convertir todos los archivos en un archivo grande aC. A continuación, cada uno de estos archivos combinados también se puede optimizar.

Mi teoría, que sólo tiene un par de casos de prueba detrás de él hasta ahora, es que si no hacer ninguna optimización hasta que tenga el programa entero / proyecto en un archivo grande aC, el optimizador tiene la cantidad máxima si la información con el que hacer su trabajo. Por lo que significa ir de C a bc sin optimización. A continuación, combinar todos los archivos bc en un archivo grande aC. Una vez que tenga todo el asunto como un archivo grande bc luego dejar que el optimizador realice su etapa de optimización, la maximización de la información y es de esperar la calidad de la optimización. A continuación, vaya desde el archivo bc optimizado para ARM ensamblador. La configuración predeterminada para el LLC es con la optimización, usted quiere permitir que la optimización, ya que es el único paso que sabe cómo optimizar para el destino. El bc a optimizaciones bc son genéricos y no objetivo específico (AFAIK).

Usted todavía tiene que probar, probar, probar. Seguir adelante y experimentar con optimizaciones entre los pasos, ver si se hace su programa de correr más rápido o más lento.

Otros consejos

Ver este PDF de BRAZO/Pulgar para rendimiento/código de tamaño y consumo de energía trade offs.

Perfil Guiado la Selección de BRAZO y el Pulgar Instrucciones
- Departamento de Ciencias de la computación, de La Universidad de Arizona por Rajiv Gupta

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

Es difícil dar cifras exactas sobre las diferencias de rendimiento, porque es totalmente dependiente de lo que realmente hace su código.

Puede configurar opciones del compilador por la arquitectura en XCode, lo que evitaría la acumulación romper simulador. Consulte la documentación de configuración construcción XCode.

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