Comentario Original:

¿Por que todos los juegos pegan tirones a su tasa media de fps con las explosiones y que podrian hacer para evitarlo tanto en hw como en sw?

Es una buena pregunta… La respuesta simple es que existe un cuello de botella en el hardware de las consolas actuales y ese cuello de botella es la CPU que tanto en la familia PS4 como en la familia Xbox One no es lo suficientemente potente como para poder realizar todos los cálculos necesarios con soltura. Ahora bien, muchos se preguntaran… ¿Las explosiones en la CPU? Pues si, por un motivo bien simple, todo elemento en la escena es animado directamente por la CPU, la GPU solo lo dibuja en ese momento exacto pero por lo general es la CPU encargada de hacer el cálculo de la animación de cada uno de los elementos.

¿Y como se calculan las animaciones? Por suerte no todos los elementos de la escena se tienen que animar porque muchos de ellos son estáticos pero otros si y el cálculo de la animación es llevado utilizando los Skeletal Meshes… Los cuales permiten animar grupos vertices/polígonos en conjunto en vez de tenerlos que calcular uno por uno.

hand-bbw.jpg

Imaginaos la necesidad de cálculo si tuviesemos que animar cada uno de los vertices de la escena y no solo eso, sino que además tenemos que comprobar la detección de colisiones por cada uno de lo objetos animados en escena. ¿Y que tiene que ver todo esto con las explosiones? Oh, es muy sencillo.

502806-uncharted-4-a-thief-s-end

Las explosiones son nubes de partículas por lo que son decenas de miles de vertices a los que se ha de calcular la animación y la detección de colisiones correspondiente uno a uno por lo que aumenta la complejidad de la física de la escena. ¿La mejor solución de eso a nivel de hardware? Hacer que no sea la CPU sino otro sistema el que se encargue de hacer dicha tarea pero ese componente por el marketing de los fabricantes de GPUs, especialmente Nvidia que compro a los que propusieron dicha solución acabo en el olvido e integrado en el mundo de las GPUs, pero antes fue presentado un chip pensado para las físicas de los juegos.

chip.jpg

Su arquitectura general a simple vista puede recordar a la del Cell Broadband Engine, pero con una diferencia, no esta pensado para actuar como CPU y más bien se parece a una GPU pero sin el uso de componentes de función fija de las GPUs como el Rasterizador, unidades de texturas, ROPS… Por lo que si lo pensamos bien podemos llegar a la conclusión que esto se puede hacer con una GPU, pero por aquel entonces las APIs utilizadas (DX9 y DX10) a nivel de PC solo podían ejecutar un contexto que era el gráfico, el hecho de colocar las físicas en la GPU significaba que el rendimiento gráfico tenía que bajar en picado.

Pero las PPU apenás se utilizaron porque obligaban a adaptar la física de los juegos a estos chips, cosa que no se hizo, no hubo un juego que apareciese marcando las diferencias utilizando este tipo de hardware pero marco las bases para que en DirectX 11/OpenGL 4 apareciese por fin la capacidad de las GPUs para trabajar tanto en contexto gráfico y también para otro tipo de tareas, en general el cálculo de las animaciones y de las físicas de los juegos. Para que la gente lo entienda mejor, llamo cambio contexto al hecho de que la GPU aprovecha el tiempo libre que no esta renderizando para encargarse de otra tareas y maximizar su rendimiento. Pensar en ello como el multihilo de las GPUs, tecnicamente es lo mismo, es basicamente duplicar la unidad de control o colocar una en paralelo pero donde el renderizado tiene preferencia.

En Direct3D 11/OpenGL 4 en adelante el pipeline gráfico no ha evolucionado y es el siguiente:

pipeline-dx11

Pero se añadio el Pipeline de Computación, que prescinde de todos los pasos y unidades de función fija

pipeline-compute

Por lo que la función de la PPU quedo integrada en las GPUs. En el caso concreto de las consolas se utilizaba en la generación pasada la propia CPU, la cual ejecutaba múltiples hilos, uno de ellos siendo el cálculo de la física de la escena. En esta generación actual lo que se ha hecho es por lo general trasladar dicho trabajo a la GPU descargando a la CPU, bueno… No exactamente, depende de cada juego pero por lo general los Compute Shaders se inventaron para eso.

your-game-needs-direct3d-11-so-get-started-now-22-728.jpg

Los Compute Shaders se utilizan hoy en día a nivel gráfico para los efectos de post-procesado por un lado y el cálculo de la etapa de iluminación en el renderizado por diferido, pero también se utilizan para el cálculo de las físicas de la escena, así como la animación de los personajes. El hecho de trasladar el trabajo de la CPU a la GPU es altamente necesario por un motivo, para este tipo de tareas la CPU no es mucho mejor que en la anterior generación, es más… En realidad es mucho peor.

2918553-old_xdk_ubisoft_benchmarkubisoft-cloth-simulation-ps4-vs-ps3

En la generación pasada Sony tenía un procesador que para este tipo de tareas era una bestía parda, el Cell Broadband Engine pero por suerte los juegos se hacían con el mínimo común múltiple que era la potencia de la CPU de Xbox 360, de ahí a que Jaguar en muchos casos no sea un problema porque la complejidad no es tan alta pero… ¿Que ocurre si somos realmente exigentes en ese aspecto? Pues que no es suficiente y tenemos que quitarle potencia a la GPU para poder realizar las físicas empeorando los gráficos en consecuencia respecto a lo que se podría conseguir utilizando el 100% de esta para ello. Para que la gente lo entienda, las GPUs pueden hacer de todo mientras tengan fuelle para hacer todo lo que tienen que hacer.

¿El otro punto que me gustaría comentar? Bueno, tiene que ver con esto pero es la capacidad que tiene la GPU de comportarse como una unidad aceleradora de la CPU. ¿Como se hace esto? Pues se requiere que la GPU tenga acceso directo al espacio de memoria de la CPU, como los sistemas actuales por lo general utilizan un mecanismo de memoria que no es totalmente coherente y tenemos dos espacios de memoria…

NonFullHSA

Se requiere un segundo bus por parte de la GPU para acceder al espacio de memoria de la CPU y de ahí la necesidad de dos Northbridge, uno exclusivo de la GPU y sus aceleradores y el otro más general donde esta conectado la CPU y el resto de componentes del sistema. Por ejemplo si tomamos la arquitectura de Xbox One X

XboxOneXEngine

El elemento en verde donde pone Hub es el Northbridge de la GPU pero si os daís cuenta la GPU accede de manera directa a la RAM y al Hub de la GPU no esta enlazada la CPU por lo que no hay una coherencia pero el camino de datos de la memoria de la GPU tiene un camino alternativo al XBAR que es el Northbridge coherente donde esta conectada la CPU también, cuando los datos desde la GPU van hacía el XBAR toman el otro camino que es el coherente. La arquitectura es exactamente la misma en PS4 y PS4 Pro por el hechoq que esta parte que es el uncore es exactamente igual, pero en el diagrama el XBAR recibe el nombre de UNB.

PS4SocMemory

En realidad este diagrama sirve para todos los sistemas de la actual generación… ¿Y que ocurre con Xbox One? Bueno…

XBox_One_SoC_diagram

La ESRAM esta pensada para utilizarse como parte del espacio de memoria no-coherente, no en vano en la litografia se encuentra en las antipodas de donde esta la CPU lo que significa una latencia enorme, aparte de que no esta cableada por lo tanto al CPU-Cache-Coherent-Memory Access/UNB/XBAR y la CPU requiere de la GPU para obtener los datos por lo que la latencia es enorme.

XboxSoC

Xbox-One-ESRAM

«No CPU Access to SRAM». Lo que se ha hecho en Xbox One X ha sido eliminarla de la ecuación trasladando su espacio de memoria al de la GDDR5 ya que ahora existe el suficiente ancho de banda para prescindir de ella pero se han mantenido las unidades DMA que se utilizan para ir accediendo y moviendo dato entre espacios de memoria y son invocados continuamente. En PS4 y en PC también hay unidad DMA pero en PC lo que se hace es acceder a la RAM principal utilizando el bus PCI Express que es la memoria coherente ya que en PC no tenemos un solo pozo de memoria como bien sabréis, pero el concepto general es exactamente el mismo.

¿Que mejoras podemos obtener para la siguiente generación a nivel de físicas y que entren dentro de lo que es posible? Esa es una muy buena pregunta y lo primero que se me viene a la cabeza es el Rapid Packed Math que AMD ha integrado en las AMD Vega, es la capacidad de poder hacer que una ALU FP32 con su registro correspondiente puede trabajar como dos sub-ALU FP16 dividiendo además el registro, reduciendo la precisión a la mitad pero permitiendo aplicar la instrucción a la mayor cantidad de elementos posibles. A nivel de gráficos tiene el handicap de reducir enormemente la precisión visual de estos pero a nivel de físicas es suficiente para una gran cantidad de operaciones por lo que su uso estandarizado en la siguiente generación puede acelerar la física de los juegos.

RPM

Esta es la tecnología que le permite a PS4 Pro alcanzar los 8.4 TFLOPS pero en precisión FP16 en teoría. No obstante tengo mis dudas acerca de su inclusión en PS4 Pro aunque fuese anunciada por Mark Cerny como uno de los puntales de la versión mejorada de PS4. Pero sabemos que se van a estandarizar a partir de la AMD Vega en las GPUs de AMD para PC, aunque claro, el problema con el que se encuentra dicha tecnología es que el RPM que es muy útil en físicas apenás es utilizado en PC porque a nivel de PC las otras GPUs no lo utilizan y especialmente Nvidia, que utiliza el mismo concepto en las versiones de sus GPUs para los Tegra pero no en las GeForce y en consolas hemos de tener en cuenta que Xbox One X no tiene soporte para el Rapid Packet Math.

El problema principal es el espacio dentro del chip, es decir, los ingenieros no pueden colocar todo lo que quieren en el espacio limitado del procesador o de los procesadores y además tenemos que tener en cuenta que el resto de componentes también tienen que evolucionar y aumentar en potencia y no sabemos realmente si la potencia de estas unidades tensor va a ser suficientemente buena como para permitir un renderizado rápido de las escenas incluyendo lo que es el cálculo de las físicas. ¿Unas físicas más complejas cuando tenemos el enorme problema con las actuales? Obviamente el camino será hacer que la física actual funcione con la velocidad que es debido y dejar de lado lo que es un aumento de la complejidad. Si existe un consenso claro de cara a una siguiente generación no es otro que el de intentar hacer que las cosas de la actual que no funcionan del todo bien funcionen como es debido y esto incluye la física de las explosiones y que estas no se conviertan en una carga a la hora de renderizar cada una de las escenas a una velocidad adecuada para poder jugar bien en condiciones.

Si las especificaciones del Project Epsilon/PS5 se acaban confirmando de manera oficial por parte de Sony oficializando el proyecto más allá de ciertos círculos entonces estaríamos hablando de 28.2 TFLOPS en FP16 de ratio, esto es un aumento enorme de cara al cálculo de las físicas de la escena y sin sobrecomplicar demasiado el hardware. Personalmente no creo en cosas como la inclusión de cosas tipo Tensor Cores en las GPUs de las consolas de siguiente generación sino que creo en soluciones mucho más viables a nivel de costes y el soporte nativo de lo que AMD llama RPM creo que es lo más viable que vamos a ver en una futura PS5 y quien sabe si una futura Xbox de siguiente generación.

Y con esto creo que es suficiente para esta entrada, nos vemos.