El misterio del doble procesador de comandos para gráficos en Xbox One

La siguiente entrada ha estado en borrador por mucho tiempo, pensaba que estaba publicada por lo que es completamente anacrónica ya que es sobre un tema que se toco hace un tiempo. Dicho esto allá vamos allá.

_________________________________________________________________________________

La GPU utilizada en Xbox One es una del tipo GCN 1.1, Sea Islands, esto lo sabemos de boca de Andrew Goosen, en la entrevista concedida a Digital Foundry:

Andrew Goosen: Justo como nuestros amigos nos hemos basado en la familia Sea Islands.

Hay dos modelos de GPU de AMD que han aparecido en el mercado y son GCN 1.1/Sea Islands, son la Bonaire XT y la Bonaire Pro, ambas tienen 14 Compute Units, que son los que fisicamente se encuentran en el SoC de Xbox One:

Teardown-Xbox-One-processor-die-2

No obstante hay 2 que se encuentran desactivadas:

Cada kit de desarrollo de Xbox One tiene unos 14 CU en el chip. Dos de las cuales están reservadas para redundancia en la fabricación,

Lo cual coincide con la Bonaire Pro, aka R7 260:

BonairePro-GPU

Si miráis dicha GPU veréis que tiene un solo Command Processor y 2 ACEs, los ACEs son los motores asíncronos de computación. Lo que realizan los ACEs es gestionar la planificación de todo aquello que no tiene que ir sincronizado con el renderizado de la escena, por lo que el procesador de comandos separa aquello que va de cara a la computación de propósito general de lo que va a los gráficos ya que la GPU es utilizada no solo para renderizar la escena a tiempo real sino también para ciertas tareas ajenas a esta y por tanto completamente independientes. Es decir, los ACEs son también procesadores de comandos pero que se encargan de gestionar lo hilos pensados para la computación, cada uno de estos ACEs pueden manejar hasta 8 colas distintas cada uno, de la misma manera el procesador de comandos gráficos pueden manejar también 8 colas.

¿Que es lo que hace especial a Xbox One? El hecho de tener un doble procesador para comandos gráficos, lo cual es una rareza incluso en PC.

vh26w9eddxy3brz9kfkc

El procesador de comandos no hace más o menos potente el sistema sino que se encarga de manejar la lista o las diferentes listas que la CPU envía la GPU para su procesamiento. Dado que hay una sola imagen que renderizar en cada momento al haber una sola pantalla lo habitual es que haya un solo procesador de comandos que controle una serie de listas de tarea de dibujado sincronizadas, una inmediata y principal y las otras en diferido que son ejecutadas una vez la principal ha sido ejecutada. En cuanto a los procesadores de comandos para la computación estos no van sincronizados con el pipeline gráfico por lo que son asíncronos y por tanto funcionan independientemente.

Después de muchos meses preguntando por fin tengo una respuesta concisa y clara de cual es la utilidad del doble procesador de comandos para gráficos y el motivo por el cual esta ahí, la respuesta es una que os sorprenderá.

Alta Prioridad y Baja Prioridad

Esto me ha provocado enormes dolores de cabeza para hacer que el puzzle pueda llegar a funcionar por completo, para entenderlo hay que tener en cuenta que no es lo mismo la preferencia a nivel de hardware que la preferencia a nivel de software. Son dos cosas completamente distintas por lo que lo primero que haré será hablar de la preferencia a nivel de software… ¿En que consiste? Pues básicamente es la forma en la que se hacen las listas de comandos, pero las listas de comandos para la computación pueden tener dos preferencias distintas respecto a la lista de comandos para gráficos. Si son de Alta Preferencia entonces se colocaran antes en la generación de las listas de comandos gráficos, si son de baja preferencia se colocaran después de la listas de comandos gráficos.

El SDK de Xbox One nos dice que podemos crear 3 contextos de computación distintos en alta preferencia, es decir, se resolverán antes de generar el siguiente fotograma. Luego después de generar el fotograma la GPU pasa a ejecutar otros 6 contextos de computación, cada una de estos contextos son listas de comandos autoconclusivas cuya longitud no tienen nada que ver con la longitud de las colas de Wavefronts que veremos más tarde sino que son completamente independientes.

¿Y que hay de los gráficos? Veamos lo que nos dicen los arquitectos de la consola sobre el tema:

Los dos pipes de renderizado permiten que el hardware renderice el contenido título (juego) en una alta prioridad mientras que el renderizado contenido del sistema lo hace con baja prioridad. El planificador en el hardware de la GPU esta diseñado para llenar agujeros en el procesamiento de alta prioridad.

¿Suena a chino? Antes de todo tenemos que concretar más información:

La GPU de Xbox One tiene ocho contextos gráficos, siete de lo cuales están disponibles para los juegos.

Hay que tener en cuenta que tenemos unos 8 núcleos, 7 de los cuales dedicados al renderizado del juego y 1 para el sistema por lo que se deduce que cada uno de los contextos gráficos puede ser manejado por uno de los núcleos de la CPU. En el caso de DX11.1 se crea una sola lista de comandos enorme y lo que se hace es que se envía toda de golpe, en el caso de DX11.x (Mono) y DX12 las listas que se envían es una por núcleo, lo que ocurre es que la primera es inmediata y las otras son diferidas. Es como escribir una lista de una sola página en el primer caso y en el segundo caso la misma lista en diversas páginas.

¿Pero que ocurre con la interfaz gráfica del sistema? Esta es independiente por completo de la GPU y tiene que haber la suficiente velocidad como para volver de nuevo al juego sin problemas. Pues el octavo núcleo de la CPU es quien la controla y no es accesible para los desarrolladores pero este se ejecuta de forma inmediata en el otro procesador de comandos. Algo que ya sabíamos pero lo que voy a comentar a continuación os hará bastante gracia… Los de cierto foro tenían razón desde cierto punto de vista, hay doble GPU en Xbox One pero no de la forma en lo que muchos se imaginan.

oh-noes-everybody-panic

En el SDK de Xbox One nos dicen que como estándar todo lo que pase por baja prioridad acaba utilizando como mucho 4 CUs en exclusiva dejando el resto para la alta prioridad, aunque es posible adaptar la cifra a más o menos ese es el funcionamiento estándar y sin cambios. Por lo que a nivel técnico tenemos dos pipelines separados distintos que funcionan de manera diferida el uno del otro. Es lo mismo que ocurre con las dobles GPUs pero donde la segunda imagen es generada para mostrar la interfaz del sistema. Es decir, la interfaz del sistema siempre se esta renderizando como segundo fotograma utilizando el bus de baja prioridad para ello.

display_planes1

¿Pero de donde viene lo de la alta y la baja prioridad? En los SoC/APU de AMD los caminos que pueden tomarlo datos desde y hacía la memoria que pueden son dos distintos; uno coherente con la CPU y el otro no-coherente:

AMDUncore

Este diagrama tiene equivalencia en Xbox One, por lo que no estoy hablando de dos temas distintos:

XBox_One_SoC_diagram

La parte no-coherente tiene una alta preferencia de acceso a memoria y es la que primero se ejecuta, mientras que coherente tiene una baja preferencia de acceso a la memoria principal. El problema es que el orden de preferencia en el hardware no es el orden de preferencia en el software por un motivo muy simple. Al bus coherente no están conectados los ROPS porque la computación de propósito general no los utiliza en su pipeline y dado que funciona de forma asíncrona al renderizado de la escena tiene que tener acceso a memoria en cualquier momento, de ahí que utilice el canal de acceso coherente mientras que los ROPS de la GPU están conectados a la ESRAM y al bus de memoria no-coherente.

La realidad es que tenemos 2 pipelines gráficos, la explicación de los gráficos en el bus no-coherente y la computación en el bus coherente no explica el doble procesador para comandos gráficos porque es algo que se da también en los SoC/APU de PC. El hecho de tener que presentar el sistema tampoco por el hecho que es tan fácil como hacer que la interfaz del sistema se renderice en una de las listas en diferido y convertirla en inmediata con un simple cambio de lista desde un simple procesador de comandos gráficos por lo que no es necesario el doble procesador de comandos gráficos en realidad y no explica el motivo de su existencia.

Pero si que hay algo que explica el motivo de su existencia y es DirectX 12… ¿El motivo? Como ya he comentado varias veces dicha API derivada de la API de bajo nivel de Xbox One (El DX 11 Mono) y es una extensión de la misma. Pues bien, una de las cosas que trae consigo DX12 es el Split Frame Rendering o lo que es lo mismo, el hecho de poder renderizar dos o más fotogramas de manera simultánea en vez de manera intercalada, lo cual es ideal para la Realidad Virtual.

amd-dx12-crossfire-4

En PC obviamente necesitas 2 GPUs distintas porque cada una tiene un procesador de comandos… ¿Pero que hay de una sola GPU? ¿Puede funcionar como si fuesen dos distintas? Claro que pueden si tienen dos procesadores de comandos gráficos y aquí entramos como he dicho en una de las novedades de DX12 derivadas del DX11.x de Xbox One, el hecho de poder tener múltiples contextos gráficos en paralelo.

DX11 to DX12_zpsj4qm3yiy

En DX11 nos permiten tener múltiples contextos pero solo un contexto gráfico, en DX12 nos permiten varios contextos gráficos para poder utilizar varias GPUs al mismo tiempo para hacer el Split-Frame Rendering. Ahora bien, el doble procesador de comandos de la GPU no duplica la potencia sino que lo que hace es desdoblar el pipeline gráfico cuando se utilizan dos procesadores de comandos… ¿Como? Si miráis el diagrama que os he puesto arriba de la GPU de AMD veréis como hay dos partes simétricas:

Captura de pantalla 2016-02-10 a las 12.13.48

Lo único que tiene de diferente respecto a la GPU del R7 260 es el doble procesador de comandos, en el caso de que este exista entonces hay un desdoble porque entonces la parte superior de la GPU pasa de esto:

Captura de pantalla 2016-02-10 a las 12.17.18

A esto:

export-1

Esto permite que la GPU pueda funcionar como dos GPUs distintas funcionando en paralelo pero no se trata de que GPU duplique la potencia. ¿La utilidad de ello? En DX12 se esta comentando que es ideal de cara a la Realidad Virtual pero no tenemos oficialmente ningún producto anunciado en ese sentido. Bueno, teníamos uno que se encontraba en el viejo mapa de ruta, una unidad HMD llamada Fortaleza pero no para la Realidad Virtual sino para la Realidad Aumentada.

720-gl14

Captura de pantalla 2016-02-07 a las 12.41.27

Fortaleza eran unas gafas HMD inalámbricas, mucha gente las confunde con las Hololens cuando son dos proyectos distintos. En realidad esto de la RA ya la vimos en 3DS con no muy buenos resultados a nivel de aceptación del mercado, al ser un dispositivo HMD esto significa que hay una visión para cada ojo por lo que se han de renderizar dos imágenes al mismo tiempo, es decir, al igual que con la RV es necesario el Split Frame Rendering y Microsoft habría preparado los dos pipes de la GPU Xbox One para ello, quedando como apéndice vestigial.

¿Pero es posible que Microsoft lance su propia unidad HMD de Realidad Virtual? En primer lugar hay que tener en cuenta que la experiencia y la calidad de imagen que se pueden obtener pueden acabar siendo peores que el PlayStation VR de PS4. Se sabe que Microsoft es una de las mentes financieras de FOVE, un proyecto Japonés de HMD que tiene la particularidad de añadir el seguimiento de los ojos en la unidad HMD.

DSC_0107_w_600

El interés de Microsoft por FOVE es posterior a que Xbox One estuviese terminada, pero el doble procesador de comandos es algo que de lo que se puede beneficiar la RV en Xbox One… ¿Se va a sumar Microsoft a la locura de la RV o en su defecto la dejara pasar por completo? Lo que no sería normal es que independientemente de su éxito no tuviesen algo en la recamara siendo desarrollado por si acaso la idea se acaba estandarizando, también puede ser que se convierta en un enorme fracaso todo esto de la Realidad Virtual, en todo caso el doble procesador de comandos gráficos que tiene la GPU de Xbox One parece estar mas relacionado con el cancelado proyecto Fortaleza que no con la Realidad Virtual.

Anuncios