Miniji5
Chapuzas Senior
- Registrado
- 6 Mar 2014
- Mensajes
- 1.303
- Puntos
- 38
Llevo un montón de tiempo sin comentar ni aportan ningún tipo de contenido y bueno, ya era hora de desempolvar la cuenta y decir que os echo algo de menos :gaydude::gaydude:. Sin mas dilación, os dejo con el post.
Como siempre hay lio sobre dx12 y el tema de utilizar shaders asíncronos he decidido explicar en que consiste. Decir que esto lo he hecho ayer, cuando al despertarme he puesto el pie derecho en el suelo no tenia ni idea de nada de lo que viene a continuación por lo que os pido comprensión si veis alguna burrada. También os animo que si veis algún error me lo comuniquéis y así poder arreglarlo.
Hay varias formas de procesar mediante shaders; de forma sincronía y de forma asíncrona. Pero realmente, que es cada una? Antes de nada tenemos que saber que hay 3 tipos de colas de instrucciones; la cola de gráficos, la de computación y la de copia. A su vez todas estas colas de instrucciones se tienen que unir a la cola principal de procesamiento de shaders.
La forma de procesar las colas es síncrono. Principalmente se basa en alternar distintos comandos de cada cola a la cola principal de procesamiento. Seria algo como primero un cola, después la segunda y por ultimo la tercera de forma síncrona. El problema viene en que algunos comandos solo se pueden procesar después de que otro comando de otra cola de procesamiento sea procesado. Esto genera espacios de espera en la cola de procesamiento por lo que se perdería bastante rendimiento. Aquí os dejo una imagen y así es mas fácil entenderlo:
DirectX 12 asíncrono
En dx12 se usa el procesamiento asíncrono, cambiando por completo como se añaden comandos de las distintas colas a la cola de procesamiento. En que consiste este cambio? Pues muy sencillo, en vez de ir metiendo las colas síncronamente una detrás de la otra tenemos un sistema asíncrono que lo que hace es intercalar los comandos de las colas en los espacios que quedan en la cola de procesamiento mezclando entre si los diferentes comandos y colas.
Con esto generamos que las diferentes colas puedan introducir comandos a la cola de procesamiento sin tener que esperar a que otros comandos de otras colas se ejecuten ya que, ademas, habría una unidad encargada de establecer prioridades sobre los comandos y colas reduciendo los espacios vacíos generados por esperar a que comandos de otras colas se procesen. Obviamente esto mejora notablemente el rendimiento de la gpu como podéis ver en estas imágenes (OJO, Fuente: AMD):
También añado como apunte que el procesamiento de shaders asíncronos ya estaba en dx11 y no es nada nuevo. Incluso las gpus Maxwellv2 tienen capacidad para procesar los comandos de forma asíncrona, aun que no es muy recomendable usarlo.
Ahora viene el problema. Por que nvidia pierde un montón de fps mientras amd los gana? Pues muy fácil. En dx11 entran todos los comandos de las diferentes colas uno tras otro a la cola de procesamiento. Recordareis que dije anteriormente que muchos comandos no se podían procesar sin antes haber procesado un comando de otra cola produciendo que se formansen espacios entre los comandos de la cola de procesamiento, haciendo necesario delimitar prioridades entre comandos y cola. Si esto resulta algo complicado de entender, es como si yo estoy haciendo una casa, no puedo empezar el tejado sin antes hacer las paredes y no puedo hacer las paredes sin antes tener una base solida donde construir la casa por lo que hacer el suelo es lo primero mas importante, las paredes lo segundos importante y el tejado lo tercero mas importante. Por eso en dx11 la gama de tarjetas gráficas Maxwell es superior a las de AMD por que Maxwell reparte de manera muy eficiente las prioridades de los comandos de las diferentes colas por lo que casi no quedan espacios libres.
Que pasa en dx12? Que los comandos de las colas se procesan asíncronamente produciendo que entren todos a la vez, a cañón, a la cola de procesamiento sin ningún tipo de identificación ni nada y es aquí donde AMD saca ventaja por tener una unidad de computación llamada ACE por sus siglas en ingles Asynchronous Compute Engine que es invención de AMD. Esta unidad de computación ordena los comandos de las diferentes colas y los procesa. Lo que pasa con Nvidia es que no tiene ninguna unidad de computación con shaders asíncronos por lo que no puede organizar tal cantidad masiva de datos desordenados a la vez. Que soluciones ha introducido nvidia a este problema? Una es crear una tarjeta gráfica muy potente para intentar contrarrestar el problema. Esa solución no valdría para nada sin un driver que cogiera todos los comandos de las colas y antes de mandarlos a procesar les inserta una cabecera identificando que comando es y a que cola pertenece para luego enviarlo a procesar.
Ahora os estaréis pensando, puto Miniji5 que puto pesado, vete al grano ya! Por que nos cuentas esta historia? La primera razón de el por que de esta historia interminable es por que me gusta explicar las cosas y dejarlas bien claras. La segunda es para poder explicar bien que es eso de procesar con shaders asíncronos a nivel hardware y por que AMD esta algo por delante de Nvidia en lo que computar se refiere. Si habéis leído el tocho os habréis dado cuenta que AMD tiene una unidad de computación con shaders asíncronos a nivel hardware y es por eso se dice que AMD procesa con shaders asíncronos a nivel hardware. Por que tiene hasta 8 ACEs (dependiendo del modelo) con dentro por ejemplo, 256 shaders asíncronos que hacen el trabajo de identificar y procesar los comandos que le entran.
Por otro lado Nvidia al no tener una unidad de computación con shaders asíncronos no puede hacer eso de identificar y computar a la vez por lo que creo unos drivers que lo que hacen es, como ya he dicho anteriormente, añadir una cabecera a los comandos a computar y enviarlos a la cola de procesamiento. Por eso se dice que nvidia procesa asíncronamente por software y hardware a la vez. Es tan eficiente como el método de AMD? No, pierde mucho tiempo ordenando los diferentes comandos por lo que siempre se van a perder algo de fps aunque lo intenta compensar con fuerza bruta y de momento eso es una realidad y si no, aun que no sea concluyente ya que repito hay que esperar a las reviews, pasaros por esta noticia.
Como podéis comprobar AMD tiene un rendimiento bastante bajo comparado con la 1080 aun computando con shaders asíncronos por hardware.
Muchas gracias si te has leído todo el post que me he currado.
Resumen:
Maxwell 2 (se aplica también a pascal aun que con algunas mejoras): colas por Software, prioridades y asignación de trabajo por software (cambio de contexto), Warps Asincronos en hardware, acceso directo a memoria (DMA) por hardware, nucleos CUDA por hardware.
GCN: colas/prioridades y asignación de trabajo/ACEs/procesador gráfico en hardware, Copia (acceso directo a memoria (DMA)) por hardware, CUs por hardware.
Otra cosa y esta prometo que es la ultima, todo el mundo critica a Nvidia por tener implementados shaders asíncronos pero de peor rendimiento que los de AMD, pero por tener los tiene. Pero mucha de esa gente no sabe que AMD directamente no tiene funciones como VXGI/VXAO y Hybrid Ray Traced Shadows y Nvidia si. No os equivoqueis, este post no es subjetivo. Entonces, ¿por que defiendo a Nvidia? Por que se esta poniendo como inútil a Maxwell y a Pascal por utilizar shaders asíncronos mediante software y hardware cuando realmente no es verdad.
Por aqui mas funcionalidades de Nvidia la verdad muy chulas y algunas muy interesantes y útiles:
Como siempre hay lio sobre dx12 y el tema de utilizar shaders asíncronos he decidido explicar en que consiste. Decir que esto lo he hecho ayer, cuando al despertarme he puesto el pie derecho en el suelo no tenia ni idea de nada de lo que viene a continuación por lo que os pido comprensión si veis alguna burrada. También os animo que si veis algún error me lo comuniquéis y así poder arreglarlo.
¿Que son shaders síncronos y asíncronos?
Hay varias formas de procesar mediante shaders; de forma sincronía y de forma asíncrona. Pero realmente, que es cada una? Antes de nada tenemos que saber que hay 3 tipos de colas de instrucciones; la cola de gráficos, la de computación y la de copia. A su vez todas estas colas de instrucciones se tienen que unir a la cola principal de procesamiento de shaders.
DirectX 11 síncrono
La forma de procesar las colas es síncrono. Principalmente se basa en alternar distintos comandos de cada cola a la cola principal de procesamiento. Seria algo como primero un cola, después la segunda y por ultimo la tercera de forma síncrona. El problema viene en que algunos comandos solo se pueden procesar después de que otro comando de otra cola de procesamiento sea procesado. Esto genera espacios de espera en la cola de procesamiento por lo que se perdería bastante rendimiento. Aquí os dejo una imagen y así es mas fácil entenderlo:

DirectX 12 asíncrono
En dx12 se usa el procesamiento asíncrono, cambiando por completo como se añaden comandos de las distintas colas a la cola de procesamiento. En que consiste este cambio? Pues muy sencillo, en vez de ir metiendo las colas síncronamente una detrás de la otra tenemos un sistema asíncrono que lo que hace es intercalar los comandos de las colas en los espacios que quedan en la cola de procesamiento mezclando entre si los diferentes comandos y colas.

Con esto generamos que las diferentes colas puedan introducir comandos a la cola de procesamiento sin tener que esperar a que otros comandos de otras colas se ejecuten ya que, ademas, habría una unidad encargada de establecer prioridades sobre los comandos y colas reduciendo los espacios vacíos generados por esperar a que comandos de otras colas se procesen. Obviamente esto mejora notablemente el rendimiento de la gpu como podéis ver en estas imágenes (OJO, Fuente: AMD):


También añado como apunte que el procesamiento de shaders asíncronos ya estaba en dx11 y no es nada nuevo. Incluso las gpus Maxwellv2 tienen capacidad para procesar los comandos de forma asíncrona, aun que no es muy recomendable usarlo.
Ahora viene el problema. Por que nvidia pierde un montón de fps mientras amd los gana? Pues muy fácil. En dx11 entran todos los comandos de las diferentes colas uno tras otro a la cola de procesamiento. Recordareis que dije anteriormente que muchos comandos no se podían procesar sin antes haber procesado un comando de otra cola produciendo que se formansen espacios entre los comandos de la cola de procesamiento, haciendo necesario delimitar prioridades entre comandos y cola. Si esto resulta algo complicado de entender, es como si yo estoy haciendo una casa, no puedo empezar el tejado sin antes hacer las paredes y no puedo hacer las paredes sin antes tener una base solida donde construir la casa por lo que hacer el suelo es lo primero mas importante, las paredes lo segundos importante y el tejado lo tercero mas importante. Por eso en dx11 la gama de tarjetas gráficas Maxwell es superior a las de AMD por que Maxwell reparte de manera muy eficiente las prioridades de los comandos de las diferentes colas por lo que casi no quedan espacios libres.
Que pasa en dx12? Que los comandos de las colas se procesan asíncronamente produciendo que entren todos a la vez, a cañón, a la cola de procesamiento sin ningún tipo de identificación ni nada y es aquí donde AMD saca ventaja por tener una unidad de computación llamada ACE por sus siglas en ingles Asynchronous Compute Engine que es invención de AMD. Esta unidad de computación ordena los comandos de las diferentes colas y los procesa. Lo que pasa con Nvidia es que no tiene ninguna unidad de computación con shaders asíncronos por lo que no puede organizar tal cantidad masiva de datos desordenados a la vez. Que soluciones ha introducido nvidia a este problema? Una es crear una tarjeta gráfica muy potente para intentar contrarrestar el problema. Esa solución no valdría para nada sin un driver que cogiera todos los comandos de las colas y antes de mandarlos a procesar les inserta una cabecera identificando que comando es y a que cola pertenece para luego enviarlo a procesar.
Explicación y resultado final
Ahora os estaréis pensando, puto Miniji5 que puto pesado, vete al grano ya! Por que nos cuentas esta historia? La primera razón de el por que de esta historia interminable es por que me gusta explicar las cosas y dejarlas bien claras. La segunda es para poder explicar bien que es eso de procesar con shaders asíncronos a nivel hardware y por que AMD esta algo por delante de Nvidia en lo que computar se refiere. Si habéis leído el tocho os habréis dado cuenta que AMD tiene una unidad de computación con shaders asíncronos a nivel hardware y es por eso se dice que AMD procesa con shaders asíncronos a nivel hardware. Por que tiene hasta 8 ACEs (dependiendo del modelo) con dentro por ejemplo, 256 shaders asíncronos que hacen el trabajo de identificar y procesar los comandos que le entran.
Por otro lado Nvidia al no tener una unidad de computación con shaders asíncronos no puede hacer eso de identificar y computar a la vez por lo que creo unos drivers que lo que hacen es, como ya he dicho anteriormente, añadir una cabecera a los comandos a computar y enviarlos a la cola de procesamiento. Por eso se dice que nvidia procesa asíncronamente por software y hardware a la vez. Es tan eficiente como el método de AMD? No, pierde mucho tiempo ordenando los diferentes comandos por lo que siempre se van a perder algo de fps aunque lo intenta compensar con fuerza bruta y de momento eso es una realidad y si no, aun que no sea concluyente ya que repito hay que esperar a las reviews, pasaros por esta noticia.
Como podéis comprobar AMD tiene un rendimiento bastante bajo comparado con la 1080 aun computando con shaders asíncronos por hardware.
Muchas gracias si te has leído todo el post que me he currado.
Resumen:
Maxwell 2 (se aplica también a pascal aun que con algunas mejoras): colas por Software, prioridades y asignación de trabajo por software (cambio de contexto), Warps Asincronos en hardware, acceso directo a memoria (DMA) por hardware, nucleos CUDA por hardware.
GCN: colas/prioridades y asignación de trabajo/ACEs/procesador gráfico en hardware, Copia (acceso directo a memoria (DMA)) por hardware, CUs por hardware.
Otra cosa y esta prometo que es la ultima, todo el mundo critica a Nvidia por tener implementados shaders asíncronos pero de peor rendimiento que los de AMD, pero por tener los tiene. Pero mucha de esa gente no sabe que AMD directamente no tiene funciones como VXGI/VXAO y Hybrid Ray Traced Shadows y Nvidia si. No os equivoqueis, este post no es subjetivo. Entonces, ¿por que defiendo a Nvidia? Por que se esta poniendo como inútil a Maxwell y a Pascal por utilizar shaders asíncronos mediante software y hardware cuando realmente no es verdad.
Por aqui mas funcionalidades de Nvidia la verdad muy chulas y algunas muy interesantes y útiles: