Optimización de la representación para dispositivos móviles, parte 2. Las principales familias de GPU móviles modernas

¡Saludos, queridos amantes y profesionales, programadores gráficos! Comencemos la segunda parte de nuestra serie de artículos sobre la optimización de renderizado para dispositivos móviles. En esta parte, consideraremos las principales familias de GPU presentadas por los jugadores en dispositivos móviles.


Para comenzar, considere una serie de criterios por los cuales se pueden clasificar las GPU móviles.

Núcleos sombreados unificados o especializados


En la era de las primeras tarjetas de video móviles, antes de la propagación de efectos complejos, había un punto de vista de que para los sombreadores de fragmentos, el soporte para cálculos con precisión reducida es suficiente. De hecho, en un modo de visualización típico, se utilizan 8 o incluso menos bits para cada canal de color. Esta vista ha llevado al uso de núcleos de sombreador especializados. Para los vértices, utilizamos núcleos optimizados para transformaciones matriciales con mayor precisión FP24 / FP32 ( highp ). Para píxeles, núcleos que funcionan de manera más eficiente con una precisión reducida FP16 ( mediump ). Con este highpNo fueron apoyados. A primera vista, esta especialización nos permite lograr una distribución más racional de los transistores en el chip. Sin embargo, en la práctica, esto conduce a dificultades en el desarrollo de efectos complejos, así como al usar texturas de alta resolución. Además, la especialización central puede conducir a un cuello de botella de vértices / fragmentos . Este término se refiere a la situación en la que, debido a la carga asimétrica en los núcleos de vértices y píxeles, algunos de los núcleos estaban "inactivos". 


Por lo tanto, las arquitecturas modernas usan núcleos unificados. Dichos núcleos pueden asumir vértices, píxeles y otras tareas computacionales dependiendo de la carga.


Vector (SIMD) o conjunto de instrucciones escalares


En el espíritu del deseo de ahorrar en los transistores descritos anteriormente, especializados en núcleos, se realizó el diseño de un conjunto de instrucciones de sombreado. Las transformaciones más típicas para gráficos tridimensionales operan con vectores de 4 componentes. Por lo tanto, las primeras GPU trabajaron específicamente con tales operandos. Si el código de sombreador contenía operaciones escalares heterogéneas que el optimizador no podía empaquetar en operaciones vectoriales, no se utilizó parte de la potencia informática. Este fenómeno puede ilustrarse de la siguiente manera:


Hay un sombreador que implementa la operación común Multiply Add: multiplica 2 operandos y luego agrega el tercero. Al compilar en una arquitectura vectorial condicional (Vector ISA = Arquitectura de conjunto de instrucciones vectoriales) obtenemos una instrucción vectorial vMADD , que se ejecuta durante 1 reloj. En la arquitectura escalar condicional, obtenemos 4 instrucciones escalares que, gracias a una tubería mejorada, también se ejecutan en 1 ciclo de reloj. Ahora considere un sombreador sofisticado que realiza 2 operaciones, pero en operandos de 2 componentes.


En el caso de la arquitectura vectorial, ya obtenemos 2 instrucciones que requieren 2 ciclos de reloj para ejecutarse. Sin embargo, no se realiza ninguna acción en los componentes .zw y la potencia de procesamiento está inactiva. En el caso de la arquitectura escalar, estas mismas operaciones se pueden empaquetar en 4 sMADD escalares que se ejecutan en el mismo ciclo de 1 reloj. Por lo tanto, en la arquitectura escalar debido a la mejora de la tubería, se logra una mayor densidad de cálculos. Sin embargo, como se mostrará a continuación, el vector ISA sigue siendo relevante. Por lo tanto, tiene sentido aplicar técnicas de vectorización para el código de sombreador. Le permiten lograr un mayor rendimiento en tarjetas de video con vector ISA . Al mismo tiempo, como regla, esto no daña el rendimiento en escalares más modernos.El ISA .

Según las características anteriores, consideraremos las familias de GPU móviles que son comunes en nuestro tiempo. Comencemos con la familia más común. Mucha gente sabe que estamos hablando de tarjetas gráficas Mali de la compañía británica ARM . ARM no participa directamente en la producción de chips, sino que ofrece propiedad intelectual. Al igual que otras tarjetas de video móviles, Mali es parte de System on Chip (SoC) , es decir funciona con memoria compartida para la CPU y la GPU y el bus. 

Mali utgard


En 2008, nacieron los primeros representantes de la arquitectura Mali Utgard , relevantes hasta nuestros días. Estas tarjetas de video se nombran de acuerdo con el esquema Mali-4 xx MP n , donde xx es el número de modelo yn es el número de núcleos de fragmentos. En la especialidad del núcleo del sombreador Malt Utgard , y todos los modelos vienen con un vértice de solo 1 núcleo.

Otras características de la arquitectura Mali Utgard:

  • OpenGL ES 2.0 
  • Falta de soporte highp en núcleos fragmentados
  • Conjunto de instrucciones vectoriales (tiene sentido vectorizar cálculos)

A pesar de la especificación OpenGL ES , los controladores de la tarjeta de video Mali Utgard compilan con éxito los sombreadores de fragmentos que usan una precisión de alta precisión (por ejemplo, la precisión se establece de manera predeterminada utilizando la flotación de precisión alta ). Pero la precisión de mediump se usa realmente . Por lo tanto, es aconsejable probar adicionalmente todos los sombreadores para juegos móviles en dichas tarjetas de video. Según los datos recopilados por Unity , a fines de 2019, Mali Utgard trabajó en dispositivos para aproximadamente el 10% de los jugadores. Y si configura los filtros apropiados en market.yandex.ru , puede ver que en 2019 se anunciaron más de 10 teléfonos nuevos con tarjetas de video de esta arquitectura.


Si está listo para abandonar esta audiencia, es suficiente establecer el requisito de compatibilidad con OpenGL ES 3.0 en AndroidManifest.xml:

<uses-feature android:glEsVersion="0x00030000" android:required="true"⁄>

Además de Mali Utgard , actualmente no hay GPU móviles generalizadas sin soporte para OpenGL ES 3.0.

De particular interés es el uso de texturas de alta resolución en el Mali Utgard . Diez partes de la mantisa con una precisión media no son suficientes para texturizar de alta calidad con una resolución de textura de más de 1024 en un lado. Sin embargo, a pesar de admitir solo la precisión de mediump en los núcleos de fragmentos Mali Utgard , puede obtener una precisión de coordenadas de textura fp24 cuando se usa la variación directa.

// vertex shader
varying highp vec2 v_texc;
void main()
{
    v_texc = …;
}

//  fragment shader
...
varying highp vec2 v_texc;
void main()
{
    gl_FragColor = texture2D(u_sampler, v_texc); //  v_texc 
                                                 //  
}

Como beneficio adicional en algunas arquitecturas, este enfoque le permite captar previamente el contenido de textura antes de ejecutar un sombreador de fragmentos , lo que minimiza los bloqueos mientras espera resultados de muestreo de textura.

Mali Midgard


El Mali Utgard ha sido reemplazado por la arquitectura Mali Midgard . Hay varias generaciones de esta arquitectura con los nombres de las especies Mali-6xx , Mali-7xx y Mali-8xx . A pesar de la edad de 8 años, Mali Midgard puede llamarse arquitectura moderna que brinda soporte para la mayoría de las nuevas características:

  • núcleos de sombreadores unificados
  • OpenGL ES 3.2 (sombreadores de computación y geometría, teselación ...)

Sin embargo, el Mali Midgard retiene el vector ISA . Dado el uso generalizado de Mali Midgard (aproximadamente el 25% de nuestra audiencia), la vectorización de la informática se vuelve apropiada.

Otra característica de Mali Midgard es la tecnología Forward Pixel Kill . Cada píxel se calcula en una secuencia separada del núcleo del fragmento. Si durante la ejecución de la secuencia se sabe que el píxel resultante será bloqueado por un píxel opaco de otra primitiva, la secuencia termina prematuramente y los recursos liberados se utilizan para otros cálculos.

Mali bifrost


Junto a Midgard, la arquitectura Bifrost destaca por su transición al ISA escalar . En comparación con la arquitectura anterior, se ha aumentado el número máximo de núcleos (de 16 a 32), y se admite una interfaz mejorada con una CPU, que permite un acceso coherente a la memoria compartida: los cambios en el contenido de la memoria de la CPU / GPU se vuelven "visibles" entre sí a pesar de los cachés, que le permite simplificar la sincronización.

De extraoficial


Se han hecho muchos intentos para aplicar ingeniería inversa a las tarjetas de video de Mali para crear controladores de código abierto para Linux . Los trabajos de las personas dedicadas que intentan hacer esto nos permiten echar un vistazo a las características indocumentadas de las tarjetas de video Mali . Por lo tanto, en el proyecto PanFrost hay un desensamblador para Mali Midgard / Bifrost , con el que puede familiarizarse con un conjunto de instrucciones de sombreado (no hay información oficial abierta sobre este tema).


Adreno


La segunda familia más común de GPU móviles es Adreno . Esta tarjeta de video está instalada en el SoC , conocido bajo la marca Snapdragon , de la compañía estadounidense Qualcomm . Snapdragon se instala en los teléfonos inteligentes de gama alta de nuestro tiempo de Samsung , Sony y otros.Las

tarjetas de video Adreno actuales son las familias de las series 3xx - 6xx. Todas estas series combinan las siguientes características:

  • núcleos de sombreadores unificados
  • Pseudo TBR (grandes tamaños de mosaico ubicados en una memoria GPU dedicada tradicional)
  • Cambio automático en modo inmediato Renderizado según la naturaleza de la escena ( FlexRender )
  • Conjunto de instrucciones escalares

Comenzando con Adreno 4xx , se presenta el soporte para OpenGL ES 3.1 , y con Adreno 5xx - Vulkan y OpenGL ES 3.2 .

Renderizado basado en mosaico Adreno


Las tarjetas de video Adreno tienen una GPU "tradicional" llamada GMEM . Se aplican volúmenes de 128 kb a 1536 kb. Esto le permite usar un tamaño de mosaico mayor en comparación con las arquitecturas de otros desarrolladores de GPU móviles. En Adreno, el tamaño de los mosaicos es dinámico y depende del formato de color utilizado, el búfer de profundidad y la plantilla. Cuando se trabaja en modo inmediato, la representación se produce en la memoria del sistema. Existe una extensión GL ES que le permite especificar el modo preferido: QCOM_binning_control . Sin embargo, las últimas recomendaciones de Qualcomm sugieren confiar completamente en los controladores de GPU, que determinan el modo más preferido para el búfer de comandos generado por la aplicación. 

Cuando trabaje en modo TBR Adreno realiza 2 pases de vértice:

  1. Pase binning : distribución de primitivas por bin ( bins , sinónimo de mosaico)
  2. Paso de vértice completo para representar solo aquellas primitivas que caen en el contenedor actual

Durante el pase Binning, Adreno solo calcula las posiciones de vértice. No se calculan otros atributos y el optimizador elimina el código innecesario. En la documentación oficial (9.2 Optimizar el procesamiento de vértices), se recomienda almacenar la información de vértices necesaria para calcular las posiciones por separado del resto de los datos. Esto hace que el almacenamiento en caché de datos de vértices sea más eficiente.

Freedreno


A diferencia de las tecnologías ARM e Imagination, Qualcomm es reacio a compartir los detalles de la estructura interna de sus GPU. Sin embargo, gracias a los esfuerzos del ingeniero inverso Rob Clark, se puede aprender mucho del proyecto Freedreno , el controlador Adreno de código abierto para Linux.

Rob Clark de Freedreno

PowerVR de Imagination Technologies


Imagination Technologies es una compañía británica de fábulas famosa por desarrollar GPU para productos de Apple. La compañía desempeñó este papel hasta la llegada del iPhone 8 / X, que utiliza el desarrollo interno de Apple. Aunque las recomendaciones sobre optimizaciones para estos chips que no han cambiado, así como las reclamaciones de patentes contra Apple de Imagination sugieren que Apple continuó desarrollando la arquitectura PowerVR, un desarrollo original de Imagination. A principios de 2020, Apple volvió a las prácticas de licencia con Imagination Technologies. Además de los dispositivos con iOS / iPadOS, las tarjetas de video PowerVR se instalan en una gran cantidad de teléfonos inteligentes y tabletas con Android.


Considere la familia de tarjetas gráficas PowerVR que todavía se pueden encontrar entre los usuarios.

PowerVR SGX


Las primeras tarjetas gráficas PowerVR SGX aparecieron en 2009. Hay varias generaciones de esta arquitectura: Series5, Series5XT y Series5XE. Apple usó estas GPU hasta el iPAD 4 / iPhone 5 / iPOD Touch 5. Se pueden citar las siguientes características de SGX:

  • núcleos de sombreadores unificados
  • OpenGL ES 2.0
  • conjunto de instrucciones de vector
  • soporte para precisión de lowp de 10 bits en sombreadores
  • bajo rendimiento de lecturas de textura dependientes

Detengámonos en algunos de ellos con más detalle. 

Precisión baja


PowerVR SGX son las únicas GPU móviles actualizadas con
soporte de hardware lowp . Los modelos más nuevos de PowerVR, así como todas las GPU modernas de otros proveedores, en realidad usan precisión de mediump . El uso de
lowp en el PowerVR SXG le permite lograr una mayor densidad de cómputo (más operaciones por ciclo). Al mismo tiempo, la operación de swizzle (permutación de los componentes del vector) para lowp , a diferencia de otra precisión, no es gratuita. Esta característica, así como el rango estrecho de valores que lowp proporciona ([-2,2]), limita su alcance. Al mismo tiempo, el lowp mal configuradoEl resultado de los artefactos en la familia SGX no se verá en todas las otras tarjetas gráficas donde realmente se utilizará la precisión de medición . Por esta razón, debe considerar negarse a usar lowp en sombreadores.

Lecturas de textura dependientes


Como sabe, las operaciones de muestreo de textura son las más lentas debido a la necesidad de esperar los resultados de lectura de memoria. En el caso de SoC móvil, estamos hablando de memoria compartida del sistema con una CPU. Para reducir el número de accesos a la memoria lenta, se utilizan cachés de textura. Para evitar el tiempo de inactividad al comienzo de la rasterización utilizando una textura, tiene sentido almacenar en caché las áreas utilizadas de antemano. Si el sombreador de fragmentos usa la coordenada de textura pasada desde el sombreador de vértices sin cambios, entonces la sección de textura necesaria para el almacenamiento en caché se puede determinar antes de ejecutar el sombreador de fragmentos. Si el sombreador de fragmentos cambia la coordenada de textura o la calcula utilizando datos de otra textura, esto no siempre es posible. Como resultado, la ejecución del sombreador de fragmentos puede ralentizarse.Las tarjetas gráficas PowerVR SGX son particularmente dolorosas en este escenario. Además, incluso el uso de una permutación de los componentes de la coordenada de textura (swizzle) conduce atextura dependiente leída . Aquí hay un ejemplo de programa de sombreado sin lectura de textura dependiente .

programa de vértice

attribute highp vec2 a_texc;
varying highp vec2 v_texc;

void main()
{
	gl_Position = …
	v_texc = a_texc;
}


programa de fragmentos

precision mediump float;
uniform sampler u_sampler;
varying highp vec2 v_texc;

void main()
{
	gl_FragColor = texture2D( u_sampler, v_texc ); //  dependent texture read
}

En este caso:

fragmento de programa

precision mediump float;
uniform sampler u_sampler;
varying highp vec2 v_texc;

void main()
{
	gl_FragColor = texture2D( u_sampler, v_texc.yx ); // dependent texture read!
}

PowerVR Rogue


Las tarjetas de video PowerVR se desarrollaron aún más en la arquitectura Rogue . Hay varias generaciones de esta arquitectura: de Series6 a Series9. Todos los PowerVR Rogue tienen estas características:

  • núcleos de sombreadores unificados
  • arquitectura de instrucción escalar
  • soporte para OpenGL ES 3.0+ (hasta 3.2, así como la API de Vulkan para reglas nuevas) 

PowerVR TBDR


Al igual que todas las GPU móviles comunes, PowerVR usa una tubería en mosaico. Pero a diferencia de sus competidores, Imagination fue más allá e implementó la rasterización diferida de primitivas, lo que permite omitir el sombreado de píxeles invisibles independientemente del orden de representación. Este enfoque se llama Renderizado diferido basado en mosaico , y el proceso de eliminación de píxeles invisibles se llama Eliminación de superficie oculta (HSR).


Eliminación de superficies ocultas

Se recomienda dibujar la geometría opaca en transparente y no usar Z Prepass, que en el caso de las tarjetas de video PowerVR en la mayoría de los escenarios conducirá a un trabajo innecesario. Sin embargo, varios píxeles transparentes consecutivos que se superponen entre sí están completamente sombreados para obtener el color correcto, teniendo en cuenta la mezcla. El último píxel transparente puede descartarse si es seguido por un píxel opaco. 

Tecnologías de imaginación abierta


Los creadores de PowerVR han proporcionado acceso abierto a más documentación que otros desarrolladores de GPU. La arquitectura de la tubería gráfica se describe en detalle, así como un conjunto de instrucciones para la arquitectura Rogue . Hay una herramienta conveniente PVRShaderEditor , que le permite recibir instantáneamente información de perfil en el sombreador, así como su listado desmontado para Rogue.


A pesar de la presencia limitada de las tarjetas de video PowerVR en el entorno de dispositivos basados ​​en Android, tiene sentido estudiar su arquitectura para la programación competente de gráficos para iOS.

GPU móviles en modo inmediato


Examinamos las familias más comunes de tarjetas de video móviles. Todas estas familias utilizaron la arquitectura de representación en mosaico. Sin embargo, hay tarjetas de video móviles que utilizan el enfoque tradicional de modo inmediato . Éstos son algunos de ellos:

  • nVIdia (Tegra SoC)
  • Toda la familia Intel excepto la reciente Gen 11
  • Vivante GCxxxx (+ Arcturus GC8000)

Una característica de las tarjetas de video móviles que funcionan en modo inmediato es la costosa operación de limpieza de FBO. Recuerde que en la arquitectura de mosaico, la limpieza de pantalla completa acelera el renderizado, permitiendo que el controlador no agregue la operación de carga de los contenidos antiguos a la memoria del mosaico. En las GPU de modo inmediato móvil , la limpieza de pantalla completa es una operación que requiere mucho tiempo y permite, entre otras cosas, que estas GPU se "calculen". Si agregar limpieza no acelera, pero ralentiza el renderizado, lo más probable es que estemos trabajando con GPU en modo inmediato . Bueno, por supuesto, no olvidemos mencionar que en las GPU en modo inmediato, cambiar un objetivo es un procedimiento "condicionalmente libre".

Distribución de diferentes familias de GPU móviles entre nuestros jugadores.


Estas son las estadísticas sobre las GPU móviles recopiladas de nuestros jugadores a finales de 2019:


A continuación abrimos el segmento "Otros"


En base a estos datos, observamos la distribución de la GPU en términos de sus características principales.


Las ALU de vector (unidad de lógica aritmética) se vuelven obsoletas y se reemplazan por otras escalares. Hoy, la mayor parte de las GPU móviles con un conjunto de instrucciones vectoriales es Mali Midgard , que puede considerarse promedio en rendimiento. Porque La vectorización, como regla, no ralentiza la ejecución en ALU escalares; vale la pena considerar la vectorización como una técnica real para optimizar los sombreadores para dispositivos móviles. 

Los núcleos de sombreadores especializados están en desuso y son reemplazados por otros unificados. El cuello de botella del vértice en la malla esquelética ya no da miedo. Los núcleos especializados se utilizan solo en la familia Mali-4xx (Utgard) . Recuerde que estas GPU solo son compatibles con OpenGL ES 2.0 . Nuestra audiencia tiene alrededor del 3.5% de ellos.

Finalmente, la gran mayoría de las GPU móviles utilizan el enfoque de mosaico. El modo inmediato se ha marginado y se está exprimiendo rápidamente junto con las tarjetas de video que lo usan. La proporción de GPU en modo inmediato en nuestros jugadores es de aproximadamente 0.7%.

Enlaces útiles:


¡Gracias por la atención! En el próximo artículo de la serie, consideraremos técnicas para optimizar sombreadores para dispositivos móviles.

All Articles