Realidad o ficción: aplicaciones de Android sólo utilizan un núcleo CPU

brazo-corteza-chip-die

Hemos tenido procesadores multi-core en nuestros ordenadores durante más de una década, y hoy se consideran la norma. Al principio era de doble núcleo, luego de cuatro núcleos, y hoy en día empresas como Intel y AMD ofrecen los procesadores de escritorio de gama alta con 6 o incluso 8 núcleos. Procesadores de teléfonos inteligentes tienen una historia similar. Procesadores energéticamente eficientes de doble núcleo de ARM llegaron hace unos 5 años, y desde entonces hemos visto el lanzamiento de ARM basado en 4, 6 y 8 procesadores de núcleo. Sin embargo hay una gran diferencia entre los procesadores de 6 y 8 núcleos de escritorio de Intel y AMD y el 6, y 8 procesadores de núcleo basado en la arquitectura ARM - la mayoría de los procesadores basados ​​en ARM con más de 4 núcleos utilizan al menos dos diseños básicos diferentes.

Si bien hay algunas excepciones, en general, un procesador basado en ARM 8 núcleo utiliza un sistema conocido como heterogénea Multi-Processing (HMP) lo que significa que no todos los núcleos son iguales (por lo tanto heterogénea). En un procesador moderno 64-bit esto significaría que un grupo de núcleos Cortex-A57 o A72 Cortex-sería utilizado en conjunción con un conjunto de núcleos Cortex-A53. El A72 es un núcleo de alto rendimiento, mientras que el A53 tiene una mayor eficiencia energética. Este arreglo se conoce como Big.little donde grandes núcleos de procesador (Cortex-A72) se combinan con núcleos de procesador PEQUEÑOS (Cortex-A53). Esto es muy diferente a los procesadores de 6 u 8 núcleos de escritorio que vemos de Intel y AMD, como en el consumo de energía del escritorio no es tan crítico como lo es en el móvil.

La clave a recordar es que un procesador octa-core Big.little tiene ocho núcleos para la eficiencia energética, no para el rendimiento.

Cuando los procesadores multi-core primero llegaron al escritorio, un montón de preguntas se plantearon sobre los beneficios de un procesador de doble núcleo de más de un procesador de núcleo único. Fue un procesador de doble núcleo de 1.6GHz "mejor" que un procesador de un solo núcleo de 3.2GHz, y así sucesivamente. ¿Qué acerca de Windows? ¿Podría utilizar un procesador de doble núcleo a su máximo potencial. ¿Qué pasa con los juegos - no son mejores en los procesadores de un solo núcleo? No las aplicaciones necesitan ser escritas de una manera especial para utilizar los núcleos de más? Etcétera.

Imprimación de procesamiento de Multi

Estas son preguntas legítimas, y por supuesto se han hecho las mismas preguntas acerca de los procesadores multi-core en los teléfonos inteligentes. Antes de examinar la cuestión de los procesadores multi-núcleo y Android, vamos a dar un paso atrás y mirar a la tecnología multi-core en general.

Las computadoras son muy buenas una sola cosa hacer. Usted desea calcular los primeros 100 millones de números primos? No hay problema, un equipo puede bucle una y todo el día crujido de esos números. Pero el momento en que quieren una computadora para hacer dos cosas a la vez, como el cálculo de los números primos mientras se ejecuta una interfaz gráfica de usuario por lo que también puede navegar por la web, y de repente todo se vuelve un poco más difícil.

Yo no quiero ir demasiado profundo aquí, pero básicamente hay una técnica conocida como preventivo multitarea que permite que el tiempo de CPU disponible para ser dividido entre múltiples tareas. Una "porción" de tiempo de CPU se dará a una tarea (un proceso) y luego una rebanada al proceso siguiente, y así sucesivamente. En el corazón de los sistemas operativos como Linux, Windows, OS X y Android es un poco de tecnología llamada un programador. Su trabajo consiste en averiguar qué proceso debe recibir la siguiente porción de tiempo de CPU.

ARM Cortex A72

Los programadores pueden escribir de diferentes maneras, en el servidor el programador puede ser sintonizado para dar prioridad a la realización de tareas de E / S (como escribir en el disco, o la lectura de la red), mientras que en un escritorio del programador estará más preocupado por manteniendo la interfaz gráfica de respuesta.

Cuando hay más de un núcleo disponible el planificador puede dar un solo proceso una rebanada de tiempo en CPU0, mientras que otro proceso obtiene una rebanada de tiempo de ejecución en la CPU1. De esta manera un procesador de doble núcleo, junto con el programador, puede permitir que dos cosas que suceden a la vez. Si a continuación, añadir más núcleos, a continuación, más procesos se pueden ejecutar simultáneamente.

Usted habrá notado que el programador es bueno en la corte de los recursos de la CPU entre las diferentes tareas como el cálculo de números primos, corriendo el escritorio, y el uso de un navegador web. Sin embargo, un solo proceso, como el cálculo de números primos no se puede dividir en varios núcleos. O puede?

Algunas tareas son secuenciales por la naturaleza. Para hacer un pastel que necesita para romper algunos huevos, añadir un poco de harina, hacer la mezcla para pastel, etc, y luego, al final lo puso en el horno. No se puede poner la lata de la torta en el horno hasta que la mezcla de pastel está listo. Así que incluso si usted tenía dos chefs en una cocina no puede necesariamente ahorrar tiempo en una tarea. Hay pasos a seguir y el orden no puede ser quebrantada. Puede realizar varias tareas, en que siendo un chef está haciendo la tarta de la otra puede preparar una ensalada, pero las tareas que tienen una secuencia predefinida no puede beneficiarse de los procesadores de doble núcleo o incluso 12 procesadores de núcleo.

Si todavía escucha a la gente decir cosas como, 'sino un teléfono inteligente no necesita 8 núcleos' luego simplemente tirar las manos en la desesperación.

Sin embargo no todas las tareas son así. Muchas de las operaciones que lleva a cabo una computadora pueden dividir en tareas independientes. Para ello el proceso principal puede crear otro proceso y la granja a cabo algunos de los trabajos a la misma. Por ejemplo, si está utilizando un algoritmo para encontrar números primos, que no se basa en los resultados anteriores (es decir, no una criba de Eratóstenes), entonces usted podría dividir el trabajo en dos. Un proceso podría comprobar los primeros 50 millones de números y el segundo proceso podría marcar la segunda 50 millones. Si usted tiene un procesador de cuatro núcleos, entonces usted podría dividir el trabajo en cuatro, y así sucesivamente.

Pero para que eso funcione el programa debe ser escrito de una manera especial. En otras palabras, el programa debe ser diseñado para dividir la carga de trabajo en partes más pequeñas en lugar de hacerlo en un solo bulto. Existen varias técnicas de programación para hacer esto, y usted puede haber oído expresiones como "single-hilo" y "multi-hilo." Estos términos significan en términos generales los programas que están escritas con un solo programa (de un único subproceso, todos agrupados) o con tareas individuales (hilos) que se pueden programar de manera independiente para obtener el tiempo de la CPU de ejecución. En resumen, un programa de un único subproceso no se beneficiará de que se ejecuta en un procesador multi-núcleo, mientras que un programa multi-hilo hará.

android_graphics_pipeline_surfaceflinger

OK, estamos casi ahí, sólo una cosa más antes de que nos fijamos en Android. Dependiendo de cómo un sistema operativo ha sido escrito, algunas acciones que un programa se lleva a cabo puede ser multi-hilo por la naturaleza. A menudo los diferentes bits de un sistema operativo son en sí mismas tareas independientes y cuando el programa realiza algunas de E / S o tal vez atrae algo a la pantalla que la acción se lleva a cabo de hecho por otro proceso en el sistema. Mediante el uso de lo que se conoce como "llamadas no bloqueantes" es posible conseguir un nivel de multi-threading en un programa sin tener que crear específicamente hilos.

Este es un aspecto importante para Android. Una de las tareas a nivel de sistema en la arquitectura de Android es la SurfaceFlinger. Es una parte fundamental de la forma en que Android envía gráficos para la pantalla. Es una tarea independiente que necesita ser programado y teniendo en cuenta una rebanada de tiempo de CPU. Lo que esto significa es que ciertas operaciones gráficas necesitan otro proceso para ejecutar antes de que se han completado.

Androide

Debido a procesos como la SurfaceFlinger, beneficios Android de procesadores multi-core sin una aplicación específica realidad de ser multi-hilo por diseño. También porque hay un montón de cosas siempre suceden en el fondo, como la sincronización y widgets, a continuación, Android en general se beneficia del uso de un procesador multi-core. Como era de esperar Android tiene la capacidad de crear aplicaciones de subprocesos múltiples. Para obtener más información sobre este ver el Procesos y subprocesos sección en la documentación Android. También hay algo de ejemplos multi-roscados de Google, y Qualcomm tiene un interesante artículo sobre programación de aplicaciones de Android para los procesadores multi-core.

Sin embargo, la pregunta sigue siendo, son la mayoría de las aplicaciones de Android de un único subproceso, y como tal, sólo utilizar un núcleo de la CPU? Esta es una pregunta importante porque si las aplicaciones de Android mayoría son de un único subproceso, entonces usted podría tener un smartphone con procesador de monstruo multi-core, pero en realidad se llevará a cabo el mismo que un procesador de doble núcleo!

En todas mis pruebas no vi ninguna de las aplicaciones del mundo real que utilizan los 8 núcleos a 100%, y así es como debe ser.

Parece haber cierta confusión acerca de la diferencia entre los cuatro núcleos y procesadores octa-core. En el mundo de escritorio y servidor procesadores octa-core están construidos con el mismo diseño de la base replicado a través del chip. Sin embargo, para la mayoría de los procesadores octa-core basados ​​ARM hay núcleos de alto rendimiento y el núcleo con una mejor eficiencia energética. La idea es que los más núcleos de energía eficiente se utilizan para tareas más serviles, mientras que los núcleos de alto rendimiento se utilizan para el trabajo pesado. Sin embargo, también es cierto que todos los núcleos se pueden utilizar simultáneamente, como en un procesador de escritorio.

La clave a recordar es que un procesador octa-core Big.little tiene ocho núcleos para la eficiencia energética, no para el rendimiento.

Pruebas

Aplicaciones de Android son capaces de tomar ventaja de los procesadores multi-núcleo y Big.little permite al programador elegir la mejor combinación de núcleo para la carga de trabajo actual.

Es posible obtener datos de Android en lo mucho que se ha utilizado en el núcleo del procesador. Para aquellos que están técnicamente bien, la información se puede encontrar en el archivo / proc / stat. Escribí una herramienta que toma la información de uso por núcleo de Android, mientras que una aplicación se está ejecutando. Para aumentar la eficiencia, y disminuir el impacto en el rendimiento del seguimiento, los datos sólo se recogen mientras que la aplicación de prueba está activa. El análisis de los datos recogidos se realiza "fuera de línea".

El uso de esta herramienta, que no tiene nombre, me encontré con una serie de diferentes tipos de aplicaciones (juegos, navegación web, etc) en un teléfono con un procesador quad-core Qualcomm Snapdragon 801 y otra vez en un teléfono con una octa- núcleo Qualcomm Snapdragon procesador 615. He recopilado los datos de estas pruebas de funcionamiento y con la ayuda de la Autoridad Android Robert Triggs, he generado algunos gráficos que muestran cómo se está utilizando el procesador.

Vamos a empezar con un caso de uso fácil. Aquí es un gráfico de cómo se utilizan los núcleos en el Snapdragon 801 al navegar por la web utilizando Chrome:

Chrome - núcleos activos en un teléfono de cuatro núcleos.

Chrome - núcleos activos en un teléfono de cuatro núcleos.

El gráfico muestra el número de núcleos están siendo utilizados por Android y el navegador web. No muestra cuánto se está utilizando el núcleo (que viene en un momento) pero muestra si el núcleo está siendo utilizado en absoluto. Si Chrome fue de un único subproceso entonces que se puede esperar para ver uno o dos núcleos en uso y tal vez un bache hasta 3 o 4 núcleos de vez en cuando. Sin embargo no vemos eso. Lo que vemos es lo contrario, se están utilizando cuatro núcleos y de vez en cuando se sumerge a dos. En la prueba de navegación que no pasamos tiempo leyendo las páginas que cargan, ya que habría dado lugar a ningún uso de la CPU. Sin embargo Esperé hasta que la página se carga y se rindió, y luego pasé a la siguiente página.

Aquí es un gráfico que muestra cuánto se utilizó cada núcleo. Este es un gráfico de un promedio de salida (como el real es un garabato miedo de líneas). Esto significa que los usos de los picos se muestran como menos. Por ejemplo el pico en este gráfico es de poco más del 90%, sin embargo los datos en bruto muestra que algunos de los núcleos de vida 100% varias veces durante la prueba de funcionamiento. Sin embargo, todavía nos da una buena representación de lo que estaba sucediendo.

Chrome - el uso de Core en el teléfono de cuádruple núcleo.

Chrome - el uso de Core en el teléfono de cuádruple núcleo.

¿Qué pasa con un núcleo octa? ¿Va a mostrar el mismo patrón? Como se puede ver en el siguiente gráfico, no, no lo hace. Siete núcleos constantemente se están utilizando con el pico ocasional a 8, y un par de veces cuando salsas para 6 y 4 núcleos.

Chrome - núcleos activos en un teléfono octa-core.

Chrome - núcleos activos en un teléfono octa-core.

También el gráfico de uso básico promedio muestra que el programador se comportó de manera muy diferente ya que el Snapdragon 615 es un procesador Big.little.

Chrome - el uso de Core en el teléfono octa-core.

Chrome - el uso de Core en el teléfono octa-core.

Se puede ver que hay dos o tres núcleos que corren más que los otros, sin embargo, todos los núcleos están siendo utilizados de alguna u otra manera. Lo que estamos viendo es cómo la arquitectura Big.little es capaz de cambiar los hilos de un núcleo a otro dependiendo de la carga. Recuerde los núcleos adicionales están aquí para la eficiencia energética, no el rendimiento.

Es un mito que Android sólo aplicaciones utilizan un núcleo.

Sin embargo, creo que podemos decir con seguridad que es un mito que sólo aplicaciones Android utiliza un núcleo. Por supuesto esto es de esperarse ya que Chrome está diseñado para ser multi-hilo, en Android, así como en las PC.

Otras aplicaciones

Así que eso fue Chrome, una aplicación que está diseñado para ser multi-hilo, ¿qué pasa con otras aplicaciones? Corrí algunas pruebas en otras aplicaciones y brevemente esto es lo que descubrí:

  • Gmail - En un teléfono de cuatro núcleos del uso de los núcleos se dividirá en partes iguales entre los 2 y 4 núcleos. Sin embargo la utilización media del núcleo nunca fue superior al 50%, lo que es de esperar, ya que es una aplicación relativamente ligero. En un procesador octa-core el uso de los núcleos rebotó entre los 4 y 8 núcleos, pero con una utilización del núcleo promedio mucho más baja de menos de 35%.
  • YouTube - En un teléfono de cuatro núcleos se utilizaron sólo 2 núcleos, y en promedio a menos de 50% de utilización. En un teléfono octa-core YouTube utiliza principalmente 4 núcleos con el pico ocasional a 6, y soltar a 3. Sin embargo, el promedio de utilización del núcleo era sólo del 30%. Curiosamente el planificador en gran medida favoreció a los grandes núcleos y los núcleos PEQUEÑOS fueron prácticamente no se utiliza.
  • Riptide GP2 - En un teléfono con un procesador quad-core Qualcomm este juego utiliza dos núcleos de la mayoría de las veces con los otros dos núcleos haciendo muy poco. Sin embargo en un teléfono con un procesador octa-core, entre seis y siete núcleos donde utiliza constantemente, sin embargo la mayor parte del trabajo fue realizado por sólo tres de esos núcleos.
  • Templerun 2 - Este juego probablemente presenta el problema de un único subproceso más de las otras aplicaciones que he probado. En un teléfono octa-core del juego utiliza entre 4 y 5 núcleos consistente y alcanzó un máximo de 7 núcleos. Sin embargo en realidad sólo un núcleo estaba haciendo todo el trabajo duro. En un quad-core Qualcomm Snapdragon 801 teléfono, dos núcleos comparten el trabajo en forma bastante pareja, y dos núcleos hicieron muy poco. En un teléfono de cuatro núcleos MediaTek los cuatro núcleos comparten la carga de trabajo. Esto pone de relieve cómo un programador diferente y diferentes diseños básicos pueden alterar drásticamente la forma en que se utiliza la CPU.

He aquí una selección de gráficos para consultar libremente. He incluido un gráfico que muestra el teléfono inactivo octa-core, como una referencia de base:

Una aplicación interesante fue AnTuTu. Corrí la aplicación en el teléfono octa-core y esto es lo que vi:

AnTuTu se ejecuta en un teléfono octa-core.

AnTuTu se ejecuta en un teléfono octa-core.

Como puede ver, la última parte de la prueba maxes completamente fuera todos los núcleos de la CPU. Está claro que el punto de referencia está creando artificialmente una alta carga de trabajo, y desde casi todos los núcleos están funcionando a toda velocidad luego SoC con más núcleos marcará mejor para esa parte de la prueba. Nunca he visto este tipo de carga de trabajo en las aplicaciones normales.

De una manera que es los puntos de referencia que están inflando artificialmente los beneficios de rendimiento de los teléfonos octa-core (en lugar de las ventajas de eficiencia de energía). Para una mirada más completa en el registro de evaluación comparativa a cabo Tenga cuidado con los puntos de referencia, ¿cómo saber qué buscar.

¿Por qué las aplicaciones de luz utilizando 8 núcleos?

Si nos fijamos en una aplicación como Gmail te darás cuenta y fenómeno interesante. En un teléfono de cuatro núcleos del uso de los núcleos se dividirá en partes iguales entre los 2 y 4 núcleos, pero en un teléfono octa-core de la aplicación utilizada entre los 4 y 8 núcleos. ¿Cómo es que Gmail se puede ejecutar en 2 a 4 núcleos en un teléfono de cuatro núcleos, pero necesita al menos cuatro núcleos en un teléfono octa-core? Eso no tiene sentido!

La tecla de nuevo es recordar que en los teléfonos Big.little no todos los núcleos son iguales. Lo que en realidad estamos viendo es cómo el planificador está utilizando los núcleos PEQUEÑOS entonces como la carga de trabajo aumenta el gran núcleo se ponen en juego. Durante un tiempo, hay una pequeña cantidad de cruce y luego los núcleos PEQUEÑOS ir a dormir. Entonces, cuando disminuye la carga de trabajo ocurre lo contrario. Por supuesto todo esto está sucediendo muy rápido, miles de veces por segundo. Mira este gráfico que muestra la utilización de grandes vs núcleos poco durante mi prueba de épica Ciudadela:

Epopeya Ciudadela - grande vs uso de los núcleos POCO en el teléfono octa-core.

Epopeya Ciudadela - grande vs uso de los núcleos POCO en el teléfono octa-core.

Observe cómo en un principio se utilizan los grandes núcleos y los núcleos PEQUEÑOS están inactivos. Luego, a la vuelta de la segunda marca de 12, los grandes núcleos comienzan a utilizar menos y los núcleos de pequeño manantial de vida. En la segunda marca de los 20 a los grandes núcleos aumentan su actividad de nuevo y los núcleos PEQUEÑOS remontan a casi cero uso. Esto se puede ver de nuevo en la segunda marca de 30, la segunda marca de 45, y en la segunda marca de 52.

En estos puntos el número de núcleos que se utiliza fluctúa. Por ejemplo, en los primeros 10 segundos sólo 3 o 4 núcleos están siendo utilizados (grandes núcleos), y luego en la segunda marca de 12 los picos de uso para núcleos en 6 y luego cae de nuevo a 4, y así sucesivamente.

Esta es Big.little en acción. Un procesador Big.little no está diseñado como los procesadores octa-core para PCs. Los núcleos adicionales permiten al programador para recoger el núcleo adecuado para el trabajo adecuado. En todas mis pruebas no vi ninguna de las aplicaciones del mundo real que utilizan los 8 núcleos a 100%, y así es como debe ser.

Advertencias y recapitulación

Lo primero a destacar es que estas pruebas no comparar el rendimiento de los teléfonos. Mi prueba sólo muestra si ejecuta aplicaciones de Android a través de múltiples núcleos. Las ventajas o desventajas de atropellar núcleo múltiple, o correr en una Big.little SoC, no están cubiertos. Ni son los beneficios o inconvenientes de ejecutar partes de una aplicación en dos núcleos a la utilización del 25%, en lugar de en un núcleo a 50%, y así sucesivamente.

En segundo lugar, aún no he tenido la oportunidad de realizar estas pruebas en una configuración Cortex-A53 / A57 Cortex-o una configuración Cortex-A53 / A72 Cortex-. El Qualcomm Snapdragon 615 tiene un ARM Cortex A53 1.7GHz racimo de cuatro núcleos y un grupo A53 1.0GHz quad-core.

En tercer lugar, el intervalo de exploración de estas estadísticas es de alrededor de un tercio de segundo (es decir, alrededor de 330 milisegundos). Si un núcleo reporta su uso es del 25% en que los 300 milisegundos y otro núcleo reporta su uso es 25%, entonces las gráficas mostrará ambos núcleos se ejecutan simultáneamente en el 25%. Sin embargo, es posible que el primer núcleo corrió a la utilización 25% durante 150 milisegundos y luego el segundo núcleo corrió a la utilización 25% durante 150 milisegundos. Esto significa que los núcleos se utilizaron consecutivamente y no simultáneamente. Por el momento mi configuración de la prueba no me permite que ningún mayor resolución.

Pero habiendo dicho todo eso. Claramente aplicaciones de Android son capaces de tomar ventaja de los procesadores multi-núcleo y Big.little permite al programador elegir la mejor combinación de núcleo para la carga de trabajo actual. Si todavía escucha a la gente decir cosas como "más que un teléfono inteligente no necesita 8 núcleos" a continuación, sólo lanzan sus manos arriba en la desesperación, ya que significa que no entienden heterogénea Multi-Procesamiento y no entienden tan grande. Poco se acerca la eficiencia energética y el rendimiento no global.


» » » Realidad o ficción: aplicaciones de Android sólo utilizan un núcleo CPU