APIs gráficas y equilibrio CPU-GPU (II)

Comentario original:

Por lo que he entendido: – Xbox One no mejorara sus graficos con Directx12 por que estara limitada por sus 12 Cu y su Cpu, los cuales estan en equilibrio cuando se usa Directx11 y todo el Gameloop (que ayer me entere de lo que es) se ejecuta en un solo nucleo.

No, el Gameloop es una cosa y el hecho de enviar comandos  a la GPU para que haga tareas es otra, tu puedes tener el Gameloop en un núcleo, el audio en otro (si se realiza por CPU), etc. Pero el envío de comandos a la GPU en otro pero en Direct3D 11 (en alto nivel y utilizando un controlador en el chip) solo puedes utilizar un núcleo para la tarea de enviar comandos a la GPU y la creación de listas de comandos (ya que lo hace el propio controlador por ti) y no se reparte entre diversos núcleos. Aunque el quid de la cuestión es que esa configuración se tomo teniendo en cuenta la primera generación de juegos de la consola, la siguiente cita ya la he puesto varias veces pero es importante para entenderlo todo:

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.

Los títulos de lanzamiento utilizaban el DirectX 11 de PC portado a Xbox One sin optimización de ningún tipo de cara a la consola, es más, utilizarón una versión optimizada del controlador de DirectX 11 para Xbox One, el llamado Mono Driver:

“Desde el E3, un ejemplo es que nosotros hemos caído en lo que llamamos internamente nuestro controlador mono. Es nuestro controlador gráfico que esta 100% optimizado para el hardware de la Xbox One. Empiezas con el controlador base [DirectX] y vas eliminando las partes que no parecen ser de Xbox One y añades todo lo necesario para optimizar la experiencia. Casí todos nuestros socios lo están utilizando, pienso que realmente hace una mejora importante.”

¿Que importancia tiene el Mono Driver? En una entrevista concedida por Oles Shishkovstov a Digital Foundry sobre el desarrollo de Metro Redux encontramos la respuesta:

Digital Foundry: DirectX 11 vs GNMX vs GNM, ¿cual es tu opinión sobre las forzalezas y debilidades de las APIs disponibles para los desarrolladores de Xbox One y PlaytStation 4? Cerca del lanzamiento habían algunas quejas acerca del rendimiento del controlador de XO y la carga a la CPU en el caso del GNMX.

Oles Shishkovstov: Vamos a ponerlo de la siguiente manera, hemos visto escenarios conde un solo núcleo de la CPU estaba completamente cargado enviando draw calls  en la Xbox One (y esto era seguramente en en el mono driver utilizando varias fast-path calls)…

En otras palabras, la primera generación de juegos utilizaba un controlador gráfico intermedio que era derivado del DX11 y que tiene el mismo problema que DX11 para PC, utilizar un solo núcleo para el envío de comandos a la GPU. Precisamente Corrine Yu se quejo del tema cuando se fue de 343 Studios a Naughty Dog:

EDIT: GAZAPO MIO, NO ES RELAVANTE EN LO QUE A XBOX ONE SE REFIERE.

En fin, continuemos con las palabras de Oles respecto a Xbox One:

Oles Shishkovstov… En general no entiendo porque escogieron el DX11 como punto de inicio de la consola. ¡Esa es una consola! ¿Por qué se preocupan cosas heredadas? En PS4, muchos de los comandos de la GPU son unas pocas DWORDS escritas en el búfer de comando, digamos que son unos pocos ciclos de reloj de la CPU. En Xbox One fácilmente puede ser millones de veces más lento por toda la contabilidad que realiza la API.

Realmente Microsoft no esta dormida. Con cada XDK que han lanzado tanto antes y después del lanzamiento de Xbox One han colocado encima de la mesa draw-calls más rápidas. Han añadido un sinfín de características con tal de poder evitar las limitaciones del modelo de la API de DX11 Incluso han hecho una API al estilo hazlo tu mismo DX12/GNM, pese a que no hemos podido utilizarla en Redux debido al limite de tiempo.

O sea que actualmente Xbox One tiene su propia API de bajo nivel disponible para los desarrolladores pero los arquitectos de la consola decidieron medir el rendimiento de los juego de primera generación que funcionan con una API que solo utiliza un núcleo para el envío de datos y un controlador por el medio y concluyen que la mejor configuración es la que colocaron. Teniendo en cuenta esos resultados y no de obtener los resultados utilizando una API de bajo nivel y no digamos ya DX12. ¿Y cuando aparece la API de bajo nivel? Pues básicamente unos meses después del lanzamiento de la consola y esto me hace preguntar: ¿Que hubiese ocurrido si la API de bajo nivel y por tanto la capacidad de escribir directamente al búfer de comandos hubiese estado disponible desde el principio? ¿Habrían tomado los ingenieros de Xbox One la misma decisión? El hecho de utilizar un controlador tiene sentido cuando tienes para una misma API hardware distinto, pero con un único hardware no lo tiene y resulta además un paso atrás respecto a Xbox 360 donde los juegos podían escribir directamente en el búfer de comandos de la GPU sin un controlador por el medio.

EDIT: Mirando la famosa entrevista a los arquitectos me encuentro con esto:

En gran medida hemos heredado mucho del diseño de DX11. Cuando fuimos con AMD, este fue nuestro requerimiento base cuando empezamos el proyecto. AMD tenía ya un buen diseño DX11

La cosa se pone más interesante a continuación:

Hemos hecho mucho trabajo para quitar un montón de sobrecarga en términos de la implementación y para una consola podemos hacerlo de tal manera que cuando haces una llamada a la API D3D esta escribe directamente sobre el búfer de comandos para actualizar los registros de la GPU sin que haya ninguna otra llamada de funciones. No hay capas y capas de software. Hemos hecho un montón de trabajo en ese aspecto.

¿Entonces cual es la API de Xbox One? Por lo visto tiene dos:

inside-xbox-one-DX11-Graphics-API-martin-fuller-microsoft-dev-day-1024x554

Si tenemos en cuenta lo que dice el desarrollador de Metro Redux la API de bajo nivel no se lanzo junto a la consola sino meses después aunque estuvieran trabajando en ella desde el principio. Claro, que algunos pensarán que estoy diciendo que la consola es una mierda y al contrario. Estoy explicando a través de fuentes primarias porque Microsoft tomo las decisiones que tomo y que les llevo a tomar tales decisiones en lo que al diseño del sistema se refiere. El problema es que Microsoft se contradice continuamente, por un lado ellos nos dicen que no hay controlador (se escribe directamente al Command Buffer) y por otro lado tenemos lo del Mono Driver. te quedas un poco…

1313346644283

La única respuesta que se me ocurre es que el Mono Driver sea para cuando los desarrolladores no quieran tocar las cosas a bajo nivel y quieran que la CPU lo gestione solo gracias a un controlador. No es diferente a la situación de PS4 con el GNM y el GNMX, es más, diría que es la misma exactamente. Vamos, que una API que aproveche Xbox One ya existe pero es de bajo nivel y requiere que ciertas cosas se hagan manualmente, no todos los desarrolladores se quieren mojar, y aunque la ventaja de rendimiento con DX12 será nula debido a esto su principal ventaja será la de poder aprovechar la GPU como si fuese la API de bajo nivel sin las complicaciones de esta.

-Ps4 podria mejorar su Api y en ese caso si aprovechar sus 18Cu, cosa que comentas que ahora no esta haciendo.

Es falso que no lo este haciendo y creo que tengo que aclarar el embrollo de lo del punto de equilibrio. Lo que precisamente el punto de equilibrio es donde el porcentaje de utilización de una GPU esta en el punto más alto respecto a una CPU dada de cara a renderizar una escena. Pero esto no significa que el aumentar el número de CUs en la GPU no sirva para nada sino que el rendimiento dado por cada una de ellas disminuye. Es más, la confusión viene por la siguiente diapositiva: tormentos En ningún lado se dice que las 18 CUs no se utilicen, lo que dice es que si se utilizan las cuatro últimas para el renderizado entonces la mejora en cuanto al renderizado será menor que en el resto, no es otra cosa que la ley de rendimientos decrecientes funcionando por lo que es mejor dedicar esa potencia adicional para tareas de computación y por lo tanto no significa que estén en desuso. Por ejemplo hay tareas que tienen que ver con los gráficos que se realizan en la parte de computación (efectos de post-procesado, la etapa de iluminación en el Forward+, pre-culling) y otros que sirven para liberar a la CPU de tareas pesadas y ganar tiempo de la misma (detección de colisiones, física de los objetos en pantalla). El caso es que PlayStation 4 tiene dos APIs, una es derivada de la otra siendo GNM la API principal de bajo nivel y GNMX la API principal de alto nivel y una parte de esta y la diferencia entre una API de alto nivel y una de bajo nivel es la existencia de un controlador/interprete que bien facilita las cosas a los desarrolladores al automatizar ciertas tareas lo hace con el coste de la perdida de rendimiento. Captura de pantalla 2014-11-16 a la(s) 13.14.31 Captura de pantalla 2014-11-16 a la(s) 13.16.33   La diferencia es que Sony ha tenido la API de bajo nivel disponible desde un principio y no ha tomado un camino tan conservador en lo que es la configuración de la GPU. Es más, no creo que el desarrollo de Xbox One haya sido cordial, lo que me hace pensar eso es que Dean Takahashi no ha escrito el libro sobre el desarrollo de la consola por lo que en el caso de Microsoft hay mucha mierda que tapar. Y no es que no la haya en el caso de Sony, simplemente que la situación es distinta y todo gracias al desarrollo del GNM. ¿Pero que hay del GNMX? Sabemos poco del mismo:

“Mucha gente empieza con la API GNMX la cual se envuelve alrededor del GNM y e encarga de los detalles más esotéricos de la GPU de una forma que es mucho más familiar si te has acostumbrado a plataformas como el D3D11 (DirectX 11).” … GNMX, el cual es el motor gráfico de Sony, tiene un componente llamado Constant Update Engine el cual se encarga de manejar las constantes que necesitan ir a la GPU. Esto es más lento de lo que nos gustaría, se tomaba para si mismo una buena parte del tiempo de la la CPU.

Esto significa que existe un controlador por el medio que afecta el rendimiento del sistema cuando se utiliza el GNMX, aquí ya entramos en el terreno de la especulación pero es posible que el GNMX tenga las mismas limitaciones que el OpenGL 4.x y el DirectX 11 en que solo se utiliza un núcleo para enviar datos a la GPU. La diferencia es que Sony al no tener la ESRAM como parche a la falta de ancho de banda de la DDR3 tenían margen para añadir más CUs a la GPU sin afectar el rendimiento en la fabricación del chip. Esto les permite ir más allá del punto de equilibrio inicial que eran las 14 CUs mencionadas en la diapositiva de arriba.

Creo que Directx12 si sera una mejora importante de cara a liberar o repartir mejor el trabajo de la cpu y que en ese caso el limite estara en la gpu lo cual deja el sistema en una buena posicion, al menos el limite esta al final del proceso y no al principio.

No les hace falta esperar a DirectX 12 cuando ya tienen disponible los desarrolladores la API de bajo nivel para la consola, toda la parafernalia del DX12 en Xbox One es inútil desde el momento en que lo que pretende solucionar ya esta solucionado a través de la API de bajo nivel de la consola.

Comparativamente a Xbox la veo mas fuerte en la parte de aplicacion, no solo la velocidad es superior, que en un entorno cerrado puede ser relativamente relevante, tambien es la parte de la latencia al tirar de ddr3, ademas hay por ahi una diapositiva de Sony en la que se ve como en Ps4 cae el ancho de banda de su Gpu conforme la Cpu hace crecer el suyo, este caso en Xbox no debe suceder al tener memorias separadas.

¿Te refieres a esta diapositiva? PS4-GPU-Bandwidth-140-not-176 No sabemos como afecta realmente a Xbox One ya que no se han dado datos aparte de la mención por parte de los arquitectos que el controlador de memoria de la consola es a medida y de ahí que no haya soporte hUMA en Xbox One. Pero el motivo por el cual ocurre dicha perdida en PS4 es debido al tema de la coherencia entre CPU y GPU, en realidad tienes tres modos de acceso en ambos sistemas:

  • Solo CPU (a esa porción solo accede la CPU).
  • Solo GPU (a esa porción solo accede la GPU)
  • Coherente (ambas partes acceden a la memoria).

En los dos primeros casos sí la CPU necesita acceder a un dato de la GPU y viceversa independientemente de que la memoria este unificada a nivel físico, pero en PS4 y gracias al soporte hUMA todo el acceso es coherente y la ventaja es que tanto la CPU como la GPU acceden al mismo espacio de memoria pero esto tiene un coste y la perdida de ancho de banda por el hecho de que se crean tiempos muertos ya que el controlador tiene que informar a ambos procesadores de la situación actúal de la memoria y no se pongan a buscar un dato que ha sido modificado recientemente sin saberlo. En todo caso las cifras de la diapositiva están por encima en lo que a ancho de banda se refiere que el máximo teórico de Xbox One y Microsoft no ha dado información en ese aspecto. No tengo acceso a la documentación del SDK.

Indudablemente las dos tienen cpus bastante limitadas pero supongo que sera el precio a pagar cuando quieres consolas entre 110-130w y tienes que tirar de Amd que es quien fabrica cpus+gpus con la parte grafica fuerte, Intel a priori habria proporcionado lo mismo al reves.

Completamente de acuerdo.

Luego esta el tema de la thirds y de como se la suda todo lo que no sea sacar un producto para todas las plataformas sin tener en cuenta sus particularidades, en la fecha que toca y con la minima inversion, es gracioso como Ubisoft levanta a la comunidad con unas diaspositivas sobre ropajes haciendo uso de GPGPU para luego sacar un juego en la plataforma dominante en ese aspecto en el que el mayor obstaculo es la cpu, y hablamos de caidas de frames por debajo del umbral asumible, supongo que en algun momento lo usaran pero si habia un momento en el que esto era necesario era precisamente con uno de sus huevos de oro como es Assasins.

Lo del Assassin’s Unity tiene tela, más que nada por esto: playstation-4-directx-11-HLSL Es de la presentación de las bailarinas. ¿DirectX 11 en PS4? Obviamente tienen que estar utilizando un interprete de DirectX 11 e interprete+controlador(GNMX)= rendimiento de la CPU tirado por la borda y nivel de aprovechamiento de la GPU también. Obviamente aquí Xbox One tiene ventaja al no tener que tirar de interprete, pero diría que en ninguna de las dos consolas Ubi Soft utiliza una API de bajo nivel.

Eso es todo.

Anuncios