EL TERCO DE URIAN SIGUE CON QUE DX12 ES UN PORT DEL DX11 MONO DE XBOX ONE (II)

Al menos hay gente que me ha entendido.

 Hilando las diferentes anotaciones de Urian sobre el tema(si estoy equivocado disculpen)….es que XboxOne ya venia con la base de DirectX12 y que lo que han hecho es un desarrollo mejorado (por las caracteristicas de hardware posibles) en PC, por lo que se podría concluir que, mejoras como tal en XboxOne por DirectX12 no serán tan notorias y si muy minimas dado que de fábrica la consola de base yá traía un DirectX12……(yá esta esto es mio) imagino que lo que están haciendo ahora con la consola en relación con, actualizaciones del sistema, desbloqueo de procesadores y demás son el pulimiento de dicha API y por consiguiente una búsqueda de mejorar el rendimiento.

owgls2

Por fin alguien lo ha entendido que Microsoft lo que ha hecho es desarrollar el D3D de Xbox One primero y luego lo ha portado al PC para crear a partir de este el D3D 12, como es mejor llamarlo D3D 12 por motivos de marketing lo que ha hecho es renombrarlo como tal y desde el momento en que la base es la de Xbox One esto les ha permitido unificar la API. Dicho de otra manera desde Marzo de 2014 que los desarrolladores de Xbox utilizan dicha API de cara al desarrollo. En serio, me alegra mucho que la gente lo haya entendido.

Pero mi terquedad viene principalmente por esto:

Andrew Goossen: En gran medida hemos heredado mucho del diseño de DX11. Cuando fuimos a AMD, este era el requisito base. Cuando empezamos el proyecto AMD ya tenia un buen diseño DX11. La API encima de todo, si, creo que veremos un gran beneficio. Hemos hecho un gran trabajo para quitar todas las sobrecargas en terminos de la implementación y para una consola nosotros podemos hacerlo de tal manera que la API D3D escriba directamente en el búfer de comandos para actualizar los registros de la GPU desde las funciones de la API sin realizar ninguna otra llamada de función. No hay capas y capas de software, hemos hecho un montón de trabajo respecto a esto.

También hemos tomado la oportunidad de ir y modificar en gran medida el procesador de comandos en la GPU. De nuevo concentrándonos en el vencimiento de la CPU… el procesador de comandos es una pieza clave para hacer que la sobrecarga de la CPU en los gráficos sea bastante eficiente. Conocemos la arquitectura de AMD bastante bien, tuvimos sus gráficos en la xbox 360 y hay un montón de carácteristicas que utilizamos. Tuvimos características como los búfers de comandos pre-compilados donde los desarrolladores podían ir y per-construir un montón de los estados (gráficos) a nivel de objeto de tal manera que solo tenían que decir, “ejecuta esto”. Lo implementamos en Xbox 360 y tuvimos un  montón de ideas para hacer una API más limpía, así que tomamos la oportunidad con la Xbox One y con nuestro procesador de comandos a medida hemos creado extensiones encima de D3D que se ajustan muy bien en el modelo D3D y es algo que nos gustaría integrar en la linea principal en el PC también. Este envío de tus comandos de dibujado orientados a objetos y a muy bajo nivel.

Microsoft ya tenia planes para implementar DX12 en PC, ¿que es lo que cambia entre DX12 y el hecho de un DX11 con más funciones? Pues precisamente la forma en la que la aplicación se comunica con el procesador de comandos de la gráfica que es el único punto de comunicación que tenemos con la GPU. ¿Pero DX 12 es un port de DX 11? No, más bien es una versión preliminar de este ya que durante el proceso de desarrollo de DX12 se han añadido cosas nuevas, pero la idea principal es la universalización del procesador de comandos por uno estandar que permite evitar el uso de controladores por software y llamadas al sistema que solo añaden latencia al renderizado.

¿Sabéis el motivo porque no solo DX12 sino porque Vulkan también tiene esta característica?

Captura de pantalla 2015-04-25 a las 11.10.10

Esto es porque el procesador de comandos se ha universalizado y con ello es posible que las APIs en general y no solo DX12 puedan escribir directamente sobre el búfer de comandos.

A mi la gente me ha venido a crucificar para echarme piedros cuando he defendido todo este tiempo que DX12 ya existía en forma de DX11 Mono.

En fin, sigamos.

Me perdí un poco
Tenemos el direct de Xbox one que es el direct mono
por otro lado, tenemos el PC con su direct 11 y su direct 12
Xbox one mono, se basa en su mayoria en direct 11 confunciones de direct 12
La direct 12 de PC, resulta que ahora te das cuenta que es era al revez y se porteaban funciones de direc mono para direct 12 ?

El DX11 con funciones de DX12 es el DX 11.3 que aparecerá en PC.

En lo que se parecen el DX12 y el DX 11 Mono de Xbox One es en la forma con la que se comunican con la GPU, ese es el punto donde el DX 11 estándar de PC es distinto.

  • DX11 trabaja con una sola lista de comandos que es manejada por una sola CPU o un solo hilo de ejecución de esta (sí esta soporta multiplico), en cambio DX11 Mono y DX12 pueden manejar múltiples listas de forma paralela utilizando diferentes hilos de ejecución.
  • DX12 hace bypass de los controladores e interpretes por la universalización y estandarización de un modelo de procesador de comandos en las GPUs.

En el primer caso se beneficiaran en PC todas las GPUs DX11, mientras que en el segundo caso solo las que tengan un procesador de comandos que permita a la API comunicarse con el búfer de comandos de la gráfica de forma directa. No obstante DX11 Mono podemos considerarlo una versión beta o preliminar de DX12 ya que hay ciertas funciones, las del feature level 12.1 que por el momento se encuentran solamente en las Maxwell de segunda generación de Nvidia.

No obstante Xbox One que tiene una GPU GCN 1.1 soporta el Feature Level 12.0, por lo que aunque no soporta la versión completa de DX12 si que lo soporta:

DX Feature Levels_1

 

Diría que Feature Level 12.0 es la misma que el DX11 Mono.

Siguiente:

En las imagenes de las pipelines de DX11 y DX12 da la impresion que con DX12 se gana tiempo, pero esto solo será así con GPUs muy muy potentes, que no llegaban a ser el cuello de botella, no ?

Es un tema de la API, dado que DX11 hacía una sola lista lo que ocurría es que dicha era la única que se ejecutaba y desde el momento en que la unidad encargada de repartir tareas lo hace de forma correlativa llega al punto en que una GPU muy potente con muchos shaders cuando dicha unidad este repartiendo al bloque de shaders n resulta que los bloques de shaders 1, 2 y 3 por ejemplo estarían desocupados porque no reciben tareas. ¿Solución? Pues haces que se puedan correr varias listas de forma simultánea y de forma asíncrona respecto al hilo principal de renderizado y para ejecutarlas se usan las listas de shaders desocupadas.

Hubo una polémica en la que se decía que el punto de equilibrio se alcanzaba con las 14 CUs en la arquitectura de Xbox One y PS4, lo que ocurre es que más allá de 14 CUs el hecho de utilizar una sola lista de comandos para la GPU es contraproducente ya que se producen rendimientos decrecientes, es decir, la media de rendimiento por bloque de shaders empieza a disminuir y por eso se recomienda crear listas de comandos que funcionen e forma asíncrona y en paralelo para aumentar el rendimiento de la GPU.

Así pues la capacidad para crear múltiples listas de comandos desde la CPU no solo disminuye el tiempo de la CPU sino que ademas permite disminuir el tiempo de la GPU, ayer precisamente puse una diapositiva de una presentación de Q Games en el mismo sentido por esto, lastima que la gente no se haya dado cuenta del detalle:

AsyncQGames

Es en PS4 pero el concepto es el mismo, a base de utilizar varias listas de comandos asincronas para las tareas de computación se acaban ganando 5ms de tiempo de renderizado. Al fin y al cabo toda optimización gráfica es esa, la de intentar conseguir generar los fotogramas de la escena en el menor tiempo posible.

El caso es que con el DX11 estándar de PC no se puede realizar listas asíncronas porque trabaja con una sola lista y como he dicho antes el DX11 Mono si, de ahí a que lo hayan utilizado como “base” del DX12.

Anuncios