APIs gráficas y equilibrio CPU-GPU

Gráficamente un juego puede estar limitado por varios factores a nivel de hardware:

fig28-02

Pero de lo que me gustaría hablar hoy es de la limitación por CPU y es que si una CPU no es lo suficientemente rápida esta se convierte en un cuello de botella para la GPU. ¿Pero que tiene que ver la CPU con el rendimiento de la GPU? Mucho, por los siguientes motivos:

  • El tiempo de un fotograma no es solo el tiempo de renderizado que se toma la GPU sino también es el tiempo que se toma la CPU en calcular que hace cada objeto en pantalla, donde se encuentra y luego enviarle los datos a la GPU en forma de comandos para que dibuje la escena.
  • El pipeline gráfico simplificado para cualquier sistema contemporáneo de gráficos en 3D a tiempo real es el siguiente:Captura de pantalla 2014-11-15 a la(s) 11.22.14
  • Se ha de tener en cuenta que las etapas son sucesivas y por lo tanto el mal rendimiento en una etapa acaba afectando al rendimiento de la siguiente.
  • La etapa de aplicación corre en exclusiva en la CPU y es la parte de la API gráfica, una vez que lo datos llegan a la GPU esta ejecuta las instrucciones de sus listas de comandos y realiza las tareas correspondientes. El nivel de control de los desarrolladores sobre la GPU excepto en algunos procesos (Shaders) es ciertamente limitado en comparación con una CPU.

¿Que significa todo esto? Sabemos que las CPUs tanto de PS4 como de la de Xbox One son la misma, obviamente si no me queréis creer pese a las evidencias que mejor que recordar que lo dijo Nick Baker en la famosa entrevista a Digital Foundry:

Digital Foundry: Por el lado de la CPU, me llama la atención. ¿Por qué habéis escogido ocho núcleos Jaguar, en vez de, digamos cuatro núcleos Piledriver? ¿Es todo sobre el rendimiento por watt?

Nick Baker: El consumo adicional y el area ocupada asociada con conseguir el IPC adicional del Piledriver respecto al Jaguar… no es la mejor decisión a hacer para una consola. Ser capaz de alcanzar el punto de equilibrio entre consumo y rendimiento por area y convertirlo en un problema más paralelo. Esto es de lo que se trata, de como estamos particionando los núcleos entre el juego y el sistema operativo y de como funciona todo al respecto.

Digital Foundry: ¿Es este un núcleo Jaguar tal como es este o lo habéis modificado a medida?

Nick Baker: No ha habido ninguna configuración con dos clusters de Jagiar antes que la Xbox One (Nota de Urian: 1 Cluster Jaguar= 4 núcleos, el único procesador con Jaguar fue el AMD Kabini que tenía un solo Cluster, luego vinieron PS4 y Xbox One que utilizan dos tal y como se puede ver en las litografías de los procesadores) así que había cosas que teníamos que realizar para que esto funcionara. Queríamos una mejor coherencia entre la CPU y la GPU y esto es algo que teníamos que hacer, por lo que tocamos la construcción alrededor de la CPU (Nota de Urian: No habla de la CPU en si) y entonces miramos en como los núcleos Jaguar implementaban la virtualización, hicimos algunos cambios, pero nada fundamental a la ISA o añadir instrucciones.

Como inciso, si miráis la litografia del procesador de ambas consolas veréis que la zona alrededor de los módulos Jaguar es distinta:

Teardown-Xbox-One-processor-die-2

ps4-reverse-engineered-apu

Esa es la parte que los ingenieros de Microsoft han tocado, y se puede ver que en ambos procesadores se han tocado y en cuanto a la famosa discrepancia entre núcleos en el caso de PS4 y Xbox One resulta que Nick Baker nos ha resuelto la duda:

Discrepency

El elemento adicional es para la mejorar la virtualización, no hay más y el resto de la CPU es exactamente igual. No olvidemos tampoco la presentación de la conferencia conjunta entre Microsoft y AMD durante el pasado mes de Junio y lo que decían de la CPU, lo cual concuerda, como es obvió, con lo de más arriba:

inside-xbox-one-CPU-martin-fuller-microsoft-dev-day-1024x554

Ahora bien… ¿cual es el rendimiento de los núcleos AMD Jaguar? El único procesador que conocemos como he dicho antes es el AMD Kabini con cuatro núcleos (1 cluster) cuya versión comercial a 1.6Ghz (la misma velocidad de reloj que en PS4) es el AMD Athlon 5150:

Captura de pantalla 2014-11-15 a la(s) 12.00.04

Unos 2076  de resultado con cuatro núcleos, lo normal sería pensar en que ambas consolas utilizan los ocho núcleos para los juegos, pero no es así. Teniendo en cuenta la presentación de Naughty Dog de hace unos meses podemos ver como los desarrolladores solo tienen acceso a 6 núcleos:

NDPS4_1-568x425 NDPS4_3-567x425 NDPS4_2-571x425

En cuanto a Xbox One la situación es más o menos la misma aunque han habido cambios recientes:

El juego es cargado en memoria y funcionando al completo, tiene acceso completo a la parte de recursos reservados del sistema, los cuales son seis núcleos CPU, el 90% del procesamiento de la GPU y 5GB de memoria. El juego se renderiza a pantalla completa y el usuario puede interactuar con este.

Los cambios recientes significa que ahora el 100% de la GPU esta disponible a los desarrolladores al eliminar el Kinect. Pero en ambos casos tenemos que los juegos solo tienen acceso a seis de los ocho núcleos de la CPU por lo que por regla de tres el indice resultante debería ser: 3114 para PlayStation 4 y 3406 para Xbox One debido a que la CPU funciona a una mayor velocidad de reloj. Comparados ambos con el Core i3 que montan las supuestas Steam Machines como el Alienware Alpha:

Captura de pantalla 2014-11-15 a la(s) 12.25.40

Y estamos hablando de un Core i3, no de un i5 siquiera y ya no digamos un i7. Por lo que en conclusión la CPU de Xbox One y la de PS4 es bastante peor de lo que cabría esperarse aunque no es sorprendente desde el momento en que en cuanto a CPU las consolas siempre han dado pena en comparación con las de PC.

Una vez dejado claro este punto volvamos al punto que nos interesa que es la etapa de Aplicación en el renderizado, desde el momento en que una CPU puede resultar en cuello de botella para una GPU nos encontramos con que si la CPU es poco potente y vamos aumentando la potencia de la GPU entonces el porcentaje de rendimiento de la GPU empezara a bajar y no escalará tan rápidamente. La clave esta en las 14 Compute Units que es lo que lleva a nivel de hardware la GPU de Xbox One (se ve en la litografía de arriba) pero solo hay activas 12, lo curioso es la respuesta que dieron los ingenieros sobre el hecho de activar 12 compute units en la GPU+subida de vueltas en vez de las 14 compute units:

Cada uno de los kits de desarrollo de la Xbox One tiene 14 CUs en el chip. Dos de ellos se reservan para redundancia en la fabricación. Pero pudimos ir y experimentar, ¿sí utilizáramos las 14 CU cual es el nivel de rendimiento que utilizaríamos? ¿Y si subiésemos la velocidad de reloj de la GPU que tipo de rendimiento obtendríamos? Al final miramos a los títulos de lanzamiento y los estudiamos profundamente. Encontramos que 14 CUs no eran tan efectivos como la subida de un 6.6% a la velocidad de reloj que hicimos. Ahora todo el mundo en internet sabe que ir a las 14 CUs habría dado un 17% más de rendimiento pero en términos de los juegos que actualmente hemos medido, lo que actualmente cuenta, es que la mejor decisión en cuanto a ingeniería fue subir la velocidad de reloj. Hay varios cuellos de botella en el pipeline que pueden causar que no obtengas el rendimiento que quieres si tu diseño esta desequilibrado.

¿Por qué 14 CUs en la configuración y no más? Mi hipotesis es que AMD sabía que con la configuración de CPU y GPU escogida a partir de las 14 CU el rendimiento de la GPU no escalaba tan bien y empezaba a decaer. ¿Entonces como es que PS4 utiliza 18 CUs? Hay una diapositiva del año 2012, unos meses antes de que Sony revelara oficialmente la consola que es cuanto menos curiosa y reveladora:

tormentos

Hardware equilibrado para gráficos a las 14 CUs y se comenta en la diapositiva que si se utilizan las otras 4 CUs adicionales entonces en gráficos el rendimiento adicional resulta ser menor, que es precisamente lo mismo que comenta Microsoft en su entrevista a Digital Foundry. Por lo que podemos deducir que hay un elemento que resulta en un cuello de botella en ambos sistemas que hace que cuando se superan las 14 CUs (ambas GPUs utilizan la misma arquitectura) entonces el rendimiento baja y esta claro que el problema esta en la CPU. Ahora bien, la CPU lo que hace es ejecutar la API… ¿esta en el caso de Xbox One la API actual pensada para aprovechar bien la CPU de la misma? La respuesta es simple y llanamente no.

La API gráfica de la primera generación de juegos de Xbox One es una versión a medida del DirectX 11 que tiene un cuello de botella particular en su naturaleza:

DirectX 11 introdujo la habilidad de poner juntas secuencia de instrucciones para la GPU en hilos múltiples. Sin embargo, el envío a la GPU aún se realiza en un solo hilo (de la CPU) y el diseño de DirectX 11 significa que algo del trabajo se tiene que realizar en un solo hilo. Por otra parte, no todos los controladores de GPU soportan esta capacidad. DirectX 12 incrementará la cantidad de trabajo que se puede realizar en los diferentes núcleos y similarmente reducirá la carga en el hilo principal.

Si miráis los resultados del CPUbenchmark que he puesto más arriba veréis el rendimiento cuando se trabaja con un solo núcleo Jaguar (no cluster) a 1.6Ghz es de 631 mientras que el del i3 es de 1694. En Xbox One por regla de tres sería de 690 aproximadamente, ¿esto significa que a simple vista el DirectX 12 en Xbox One debería aumentar el rendimiento de la parte de la CPU y con ello la GPU no? Pues no, por el hecho que la consola de Microsoft se diseño teniendo en cuenta el DirectX 11 y su rendimiento, se busco la configuración de CUs que resultaba el punto de equilibrio entre el rendimiento de la CPU y el de la GPU. Dicho de otra manera, aunque la CPU aumente su rendimiento esto no hará crecer el rendimiento de la GPU más allá del que ya tiene dado que esa potencia adicional solo se notaría más allá del actual punto de equilibrio con DirectX 11 que es la configuración actual que tiene Xbox One y dado que la configuración no va a mutar mágicamente y va a estar así no vamos a ver el famoso aumento de rendimiento del que hablan muchos sin llegar a analizar la situación.

no-no-its-not-true-thats-29495-1310426776-3_1_

No es imposible desde el momento en que Xbox One se ha diseñado alrededor de DirectX 11. ¿Y que hay de PS4? Bueno, no sabemos si su API soporta el envío de comandos a la GPU desde un hilo o desde varios pero la naturaleza de la API es cuanto menos similar a la de Xbox One actualmente:

2442356-8487857728-Direc

Dado que PS4 se encuentra en la misma situación que Xbox One (ver diapositiva de más arriba respecto al equilibrio en PS4) entonces podemos concluir que la situación en la que se encuentra PS4 es la misma actualmente que la de Xbox One y si Sony hiciese su propio DirectX 12 debido a tener una mayor cantidad de CUs en la GPU entonces los juegos aprovecharían y escalarían mejor en cuanto a gráficos esas 6 CUs adicionales. ¿Las puede escalar bien en Xbox One? No, porque no están disponibles y por tanto como he dicho antes no se puede ir más allá del actual punto de equilibrio.

Espero que con esto hayan quedado algunas cosas claras.

Saludos.

Anuncios