Hace unos 3 días Microsoft realizo la presentación sobre el SoC de la Xbox One X en el Hot Chips de este año y dejo ir una serie de detalles muy interesantes sobre el procesador de la iteración más potente de Xbox One. La cual vamos a ver en pocas meses a la venta.

Microsoft-Xbox-One-X-Scorpio-Engine-Hot-Chips-29-01

En primer lugar parece ser que Microsoft ha decidido mantener el tamaño del chip muy cercano al de la Xbox One original, sorprende a simple vista el salto de los 5000 millones de transistores a los 7000 millones cuando la capacidad técnica es mucho mayor. Pero esto tiene una explicación bien simple y es que la Xbox One tenía unos 32MB de memoria SRAM, lo cual son 256Mbits SRAM y hemos de tener en cuenta que esta tipo de RAM consume 6 transistores por celula de almacenamiento por lo que de la Xbox One original unos 3.5 millones de transistores estaban dedicados a la lógica. Es decir, Microsoft ha aumentado la cantidad de transitores lógicos del chip realmente y para poder hacerlo de manera que no sobrepasará los costes ha eliminado la SRAM embebida.

Microsoft-Xbox-One-X-Scorpio-Engine-Hot-Chips-29-02

Lo primero que llama la atención es que la GPU esta desdoblada, en realidad es algo que ocurre también con PS4 Pro pero no es la GPU la que esta desdoblada sino que tenemos 2 Shader Engines en cada bloque, en el caso que nos ocupa cada uno de los Shader Engines esta compuesto por las siguientes especificaciones:

  • 11 Compute Units (4-3-4) de los cuales la última Compute Unit de cada Shader Engine esta desactivada, por lo que tenemos 10 Compute Units por Shader Engine.
  • 2 RBEs/8 ROPS por Shader Engine.
  • 1 Rasterizador y 1 Teselador (Geometry Processor) por Shader Engine

La GPU puede funcionar en dos modos distintos, en modo de compatibilidad hacía atrás solo están activos dos de los Shader Engines (20 CUs, 16 ROPS) y es curioso porque Microsoft ha ido más allá que Sony en este caso. Al contrario que PS4 Pro que se dedica a duplicar los Shader Engines de la GPU, en Xbox One X han aprovechado el espacio adicional dejado por la eliminación de la ESRAM para aumentar el número de Compute Units por Shader Engine. Esto significa que los juegos de Xbox One al funcionar bajo Xbox One X van a funcionar de manera mucho más rapida que en la Xbox One original incluso si estos utilizan solamente 2 Shader Engines.

¿El motivo? Esta claro, no es lo mismo ejecutar un juego con 12 Compute Units que hacerlo con 20.

4xboxonex.png

Ahora bien… ¿Solo ha mejorado en la cantidad de Compute Units en la GPU o la cosa va más allá y existe una evolución? Existen una serie de cambios a nivel de la GPU que conviene matizar.

Microsoft-Xbox-One-X-Scorpio-Engine-Hot-Chips-29-04

El primer punto hace referencia al procesador de comandos de la GPU, parece ser el mismo que en la Xbox One original pero hay dos puntos que llaman poderosamente la atención, el primero de ellos es el DX12 firmware y el new work distribution. ¿Pero no era ya DirectX 12 la Xbox One estandar? Si, pero era su propio sabor de DirectX 12 con las mismas capacidades solo que derivado del DirectX 11X que era exclusivo de Xbox One y que ya podía realizar algunas de las funciones que más tarde se implementarían en DirectX 12 como el hecho de poder múltiples listas de comandos utilizando varios núcleos de la CPU con tal de reducir el tiempo de la CPU a la hora de generar la lista de pantalla, pero han habido una serie de elementos que han sido añadidos en DirectX 12 y que el procesador de comandos de Xbox One no soportaba.

DirectX 12 tiene dos versiones, la versión 12.0 es la que era soportada por la Xbox One pero existe una versión 12.1 que inicialmente era compatible con las GPUs de Nvidia que tenían algunos elementos más avanzados. Como es la Conservative Rasterization y la Rasterización Fuera de Orden (OOO Rasterization) y la Conservative Occlusion Query. Precisamente esto es lo que hace que Microsoft haya tenido que mejorar el procesador de comandos para darle soporte completo a DirectX 12 (12.1) y no parcial.

¿Y que GPU de AMD soporta todas estas funciones nuevas? Pues no las ha soportado hasta el AMD Vega.

VegaConservative2VegaConservative

Obviamente dichas funciones estarían solamente disponibles en los juegos que sean solo para Xbox One X, pero la gran pregunta que nos deberíamos hacer todos de inicio es… ¿Lo siguiente esta soportado por Xbox One X?

siggraph_vega_architecture_41

El problema es que para funcionar requiere que la Cache L2 este conectada al rasterizador también. Si el rasterizador es el de Vega entonces esta ha de rasterizar por Tiles y para ello necesita el acceso a la Cache L2, Microsoft no especifica nada de esto en la presentación del Hotchips pero llama poderosamente la atención el hecho porque la GPU parece ser un híbrido que no tiene implementadas todas las funciones del AMD Vega.

¿Que es lo que no ha sido implementado? En primer lugar las NCU, por lo que Xbox One X conserva el mismo tipo de Compute Unit que había en Xbox One.

kaveri-14b

Esta habiendo mucha polémica con esto, en realidad la NCU del AMD Vega en PS4 Pro no es más rápida pese a duplicar el ratio de operaciones en FP16 realizadas. El truco esta en permitir que cada una de las ALUs en FP32 que componen cada SIMD y su registro correspondiente se puedan desdoblar en 2 ALUs en FP16 con sus registros correspondientes. Todos, absolutamente todos los juegos de Xbox One y PS4 funcionan utilizando precisión en FP32 porque su GPU no soportada precisión en FP16, la cual fue añadida en versiones posteriores de la arquitectura GCN. La capacidad de PS4 Pro de poder realizar 2 instrucciones en FP16 en el espacio de una requiere soporte por parte de la API y del compilador… ¿Que significa esto? Tener un binario exclusivo ya que casi todo el software existente no lo soporta.

Pe… pero… pero si dicen que la PS4 Pro aumenta un 30% la potencia con ello.

¿Sabéis de donde viene esta afirmación? De la siguiente diapositiva del post-mortem de Mass Effect Andromeda.

08888_mass-effect-andromeda-slide-

El 30% es cuando resolvemos el Checkerboard, para entender como funciona el Checkerboard os recomiendo leer la entrada que hice hace unos días. La resolucion se hace al final del pipeline cuando las imagenes ya están calculadas. La diferencia en potencia entre Xbox One X y la PS4 Pro compensa ese 30% ganado por el uso de las NCU en PS4 Pro por lo que como es obvió Microsoft ha prescindido de las mismas.

¿Otra cosa de Vega que no esta? los RBEs con conectividad a la Cache L2, pero estas están mejoradas respecto a las de Xbox One al soportar compresión delta para el Backbuffer (Color+Z), esta función se encuentra en PS4 Pro y es la que permite en dicha consola alcanzar la tasa de relleno máxima.

PS4DCC

En PS4 Pro la GPU se queda con un ancho de banda práctico de solo 160 GB/s que lo que hace es limitar la tasa de relleno en Int8/RGBA8888 a unos 40 Gpixeles/s, utilizando el DCC en dicha consola se consigue llegar a su máximo de 58 Gpixeles/s. Hay que tener en cuenta que en esas circunstancias la cantidad de bytes por pixel es de 4 bytes. En Xbox One X tenemos una GPU con también 4 Shader Engines pero a 1172 Mhz, lo que nos da una cifra de 4688 millones de fragmentos y 75 Gpixeles por segundo.

1172 Mhz * 4 Shader Engines * 16 pixeles por fragmento rasterizado* 4 bytes por pixel= 300 GB/s

En la conferencia dijeron que que el ancho de banda máximo alcanzado por la GPU es de 285 GB/s. Por lo que:

285 GBps/(4 bytes por pixel) = 71.25 Gpixeles/s

71.25 Gpixeles/ 16 pixeles por fragmento rasterizado= 4453 millones de fragmentos

Dicho de otra manera, gracias al ancho de banda de la GDDR5 en Xbox One X (bus de 384 bits) la Xbox One X consiguiría en condiciones estándar (sin utilizar el DCC) cuasi doblar la capacidad visual de la PS4 Pro. ¿Es así no? Pues no, porque he aquí una de las cosas de las que nadie habla y en la que PS4 Pro es superior a Xbox One X y es en el número de ROPS, unos 64 ROPS contra unos 32 ROPS por lo que la capacidad de Xbox One X se queda en los 37.5 Gpixeles/seg realmente… Pero es aquí donde tenemos que aclarar un punto muy pero que muy importante.

La arquitectura GCN puede escribir por ROP unos 8 bytes por ciclo de reloj, el truco que utilizan muchos desarrolladores es empaquetar dos búfers de imagen de 4 bytes por pixel en uno solo de 8 bytes por pixel. En la PS4 estándar que tenemos unos 32 ROPS lo normal es empaquetar en grupos de 4 bytes…¿El motivo? Ancho de banda.

humusps4bw

Pero claro, en la PS4 estandar tenemos unos 1600 millones de fragmentos de 16 pixeles cada uno, por lo que con 102.4 GB/s tenemos suficiente. En Xbox One el planteamiento era distinto, tenemos menos ROPS por lo que nos interesa aumentar la cantidad de datos por ROP.

humusedram

Y es aquí donde la ESRAM tomaba toda la ventaja del mundo en Xbox One porque es lo que permitía renderizar a 8 bytes por ROP. En Xbox One X han mantenido la tradición, solo que la GDDR5 ha absorbido el ancho de banda de ESRAM, la cual tenía un ancho de banda real y combinado entre 140-150 GB/s, justo la mitad que los 285GB/s de Xbox One X, dado que en modo compatibilidad hacía atrás se utilizan solo 2 Shader Engines pues el ancho de banda utilizado es la mitad.

Ahora bien, la eliminación de la ESRAM es algo que conlleva consigo una desventaja en concreto. En Xbox One era posible escribir el búfer de imagen en la ESRAM sin entrar en contención por el uso de la RAM principal (DDR3), dado que eran dos caminos de memoria distintos. Por lo que el mismo tipo de cuello de botella de PS4 Pro y PS4 ahora lo tenemos en Xbox One X por el hecho de tener un solo pozo de memoria y esto nos lleva el tema del uncore que es la parte encargada de comunicar las diferentes partes y obviamente seguimos teniendo un acceso coherente a la memoria y un acceso no-coherente a la misma por parte de la GPU.

XboxOneXEngine

Si hacemos zoom veremos que Microsoft ha mantenido los 4 Move Engines/DMA/Swizzle Copy por motivos de compatibilidad hacía atrás.

2017-08-21_09.33.44-1_575px

Recordemos cual era el funcionamiento de los mismos:

captura-de-pantalla-2013-02-07-a-las-12-38-48

¿Copiar de la RAM a la RAM y de la ESRAM a la ESRAM? ¿Como se explica esto? Bueno, como bien sabréis tanto la familia Xbox One como la familia PS4 tienen un bus llamado Onion que permite husmear en la cache de segundo nivel de la CPU con tal de que exista una coherencia de memoria. No tiene mucho sentido cuando estamos hablando de dos memorias distintas en vez de una memoria única utilizar la ESRAM para los datos en modo coherente ya que la CPU tiene un acceso muy pero que muy lento a la ESRAM, es más, no se recomienda.

¿Pero no sería copia de ESRAM a RAM solamente? Lo dicho, espacio de memoria coherente (sistema) y no-coherente (solo GPU) tanto para la DDR3 como para la ESRAM en Xbox One estándar.

NonFullHSA

Eliminar la ESRAM supondría la eliminación de al menos dos unidades Move Engine/DMA/Swizzle Copy por lo que el código que las usara dejaría de ser compatible al hacer llamadas a un recurso inexistente del sistema. Si Microsoft hubiese obtado por un direccionamiento completamente coherente y unificado entonces la GPU no estaría conectada a la RAM sin tener que pasar por el bus coherente como se ve en el diagrama. Si ese fuese el caso entonces la memoria si que estaría unificada a nivel de direccionamiento ya que tendríamos un solo acceso, el coherente.

FullHSA

Entonces no haría falta ningún Move Engine pero se rompería por completo la compatibilidad hacía atrás del software pensado para la consola. Por el momento la coherencia total en cuanto a la RAM solo se ha conseguido en Carrizo utilizando el bus Onion3.

Carrizo_Tech_Day_Architecture_FINAL_29-pcgh

Pero dicho bus no tiene el suficiente ancho de banda para una GPU de alto rendimiento, quedandose en los 40-50GB/s.

onion3

¿La conclusión? El SoC sigue utilizando el mismo tipo de uncore que el resto de la familia Xbox One y en el caso de que Microsoft hubiese querido un acceso completamente coherente al sistema hubiese necesitado del uso del HBCC, el cual de cara a los SoC esta pensado para combinarse con Ryzen. Pero esto es algo de lo que hablare en la serie «El Futuro» cuando llegue el momento y no toca hablarlo aquí.

¿Que nos queda de importante? Pues nos quedan los cambios en los coprocesadores de audio y video y la CPU. En el primer caso voy a ser muy escueto.

Microsoft-Xbox-One-X-Scorpio-Engine-Hot-Chips-29-06.png

Nada especial y fuera de lo esperado, por lo que lo mejor es ir a la CPU.

Microsoft-Xbox-One-X-Scorpio-Engine-Hot-Chips-29-05.png

Los cambios se han basado principalmente en tocar el sistema de acceso a la memoria de la CPU. En primer lugar tenemos a los Translation Lookaside Buffers que parecen ser la optimización hecha a medida en el núcleo «Jaguar» para Microsoft por por parte de AMD. Los TLB son una memoria cache que se utiliza para reducir el tiempo para acceder a las diferentes partes de la jerarquía de memoria pero no son memoria. Lo que hacen en un sistema que soporta memoria virtual es almacenar las traducciones recientes del direccionamiento de memoria virtual al direccionamiento de memoria física. Pero no es que Microsoft las haya añadido, simple y llanamente ha aumentado su tamaño con tal de reducir el impacto de una Cache Miss en la CPU, pero tampoco se trata de un cambio brutal de arquitectura sino que es un cambio menor con tal de aumentar levemente el rendimiento del AMD Jaguar.

¿Y para que sirven estos cambios a nivel practico? La familia Xbox One funciona con  dos SOs virtualizados funcionando sobre un Hypervisor.

xboxos

Los cambios en la CPU permiten eliminar la carga sobre la CPU (4-5%) de tal manera que ese rendimiento es ganado, no es un salto de rendimiento nada espectacular y es muy leve pero es una mejora que se agradece. En todo caso el sistema se ve altamente limitado por su CPU como ocurre con PS4 Pro y hereda los mismos problemas de rendimiento. Solo que Xbox One X tiene la version más avanzada del Jaguar aunque sea solo un 5% más rapida por ciclo de reloj.

Y con esto termino. En realidad no hay mucho más que comentar.