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.
Ooh Random -1 voto sin explicación. Buena esa. – Justicle
Wow otro. Personas de esfuerzo con clase: todos estamos aprendiendo mucho. – Justicle
+1 - Parece una pregunta razonable para mí (solo te devuelve a cero aunque temo ...) –