• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

[DX11/DX12] Shaders síncronos y asíncronos

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.






¿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:


db2L2VR.jpg



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.


wUBWy6t.jpg


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):


w2MgrMS.gif



4H7ekRq.gif


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:


 
Buen trabajo :sisi3:
 
Por fin alguien lo explica bien, con sus clari oscuros. Lo que no me queda claro es:

-1º-Los sadhers async ssi suponen rendiento en d12, como ya se demuestra en la gen actual.
-2º-Si Maxwell no obtiene mejora respecto a d11 en d12 usando colas por software, Pascal tampoco deberia o almenos no obtener lo mismo que por hardware.
-3º-Todo esto me deja decepcionado, pues ya se ve porque se adelanto el lanzamiento.

PD: A todo esto todo lo que podamos hablar de rendimiento son suposiciones hasta ver bench reales. Pero el hecho de que no soporte async por hardware me hace pensar que el rendimiento en d12 no va a ser tan exagerado como plantean.
 
Por fin alguien lo explica bien, con sus clari oscuros. Lo que no me queda claro es:

-1º-Los sadhers async ssi suponen rendiento en d12, como ya se demuestra en la gen actual.
-2º-Si Maxwell no obtiene mejora respecto a d11 en d12 usando colas por software, Pascal tampoco deberia o almenos no obtener lo mismo que por hardware.
-3º-Todo esto me deja decepcionado, pues ya se ve porque se adelanto el lanzamiento.

PD: A todo esto todo lo que podamos hablar de rendimiento son suposiciones hasta ver bench reales. Pero el hecho de que no soporte async por hardware me hace pensar que el rendimiento en d12 no va a ser tan exagerado como plantean.

Gracias por tu opinion :)

1.- Lo siento, no entiendo la pregunta.
2.- Pero partimos de una tarjeta grafica hasta el momento bastante mas potente que las Maxwell ademas de que habran afinado mejor el driver que se encarga de las colas, distribución de trabajo y prioridades.
3.- Si, esa es otra forma de compensar esa decadencia, adelantando las graficas. No lo veo como mal movimiento ni una decepcion.

De momento por lo que tenemos delante Pascal y Maxwell aun haciendolo por soft y hw no hay gran diferencia. O gana AMD por unos fps mas o pierde Nvidia por unos fps mas. Hasta que no salgan las dos gamas de gpus no tendremos nada claro.
 
Gracias por tu opinion :)

1.- Lo siento, no entiendo la pregunta.
2.- Pero partimos de una tarjeta grafica hasta el momento bastante mas potente que las Maxwell ademas de que habran afinado mejor el driver que se encarga de las colas, distribución de trabajo y prioridades.
3.- Si, esa es otra forma de compensar esa decadencia, adelantando las graficas. No lo veo como mal movimiento ni una decepcion.

De momento por lo que tenemos delante Pascal y Maxwell aun haciendolo por soft y hw no hay gran diferencia. O gana AMD por unos fps mas o pierde Nvidia por unos fps mas. Hasta que no salgan las dos gamas de gpus no tendremos nada claro.

Exactamente hasta que no veamos bench nanai. A la espera estaremos de ambas compañias, yo no tengo especial prisa :D. De todas maneras gracias por tu post.
 
Arriba