Blog Personal.

Intel

El mito de la GPU Asíncrona

Me gustaría comentar una noticia que os la voy a citar íntegra:

Intel se ha dado cuenta de que hay muchísimos usuarios que tienen un procesador con iGPU integrada pero que utilizan una gráfica dedicada en su lugar. Mediante lo que han llamado «Multi-Adapter Integrated + Discrete GPUs», se han propuesto aprovechar esta iGPU que no se utiliza para mejorar el rendimiento, y de hecho ya han presentado una prueba de concepto funcional combinando una Intel HD 530 con una Radeon RX 480.

Dado que el GDC 2020 se ha retrasado por lo menos hasta el verano, Intel ha realizado algunas presentaciones online a través de streaming y ha creado un repositorio donde ha puesto a disposición de todos sus presentaciones. Entre éstas podemos ver la llamada «Multi-Adapter Integrated + Discrete GPUs», que de momento solo es una prueba de concepto pero en la que Intel pretende descargar el trabajo de una tarjeta gráfica dedicada con la potencia que no se usa en la iGPU, mejorando el rendimiento.

La iGPU y la gráfica dedicada, funcionando en conjunto

Utilizar esta técnica implica el uso de cargas de trabajo asíncronas, ya que implican una iGPU y una GPU dedicada de diferentes arquitecturas y potencias.

Por este motivo, la idea que Intel propone utiliza la API gráfica Direct3D 12 de DirectX, lo cual también implicaría post procesamiento, así que lo han solucionado simplemente haciendo que la gráfica dedicada «delegue» parte de la carga de trabajo en la iGPU, y más concretamente en la prueba de concepto hicieron que la iGPU se encargara del compute shader mientras que la GPU dedicada podía dedicarse más a fondo en renderizar los gráficos.

Aunque en la captura de arriba veáis una RTX 2080 Ti con una Intel UHD 630, en realidad en la prueba de concepto Intel logró hacer funcionar una Intel HD 530 con una Radeon RX 480. Intel no mencionó cómo era el rendimiento solo con la iGPU o solo con la gráfica -es decir, mostró solo el rendimiento combinado-, y determinó que esta metodología puede llevarse a cabo de dos formas posibles:

  • La primera es con un LDA (Linked Display Adapter). Aquí necesitaríamos un adaptador (D3D Device) con múltiples nodos y con los recursos siendo copiados en todos ellos. Intel dijo que esto lo haría simétrico, lo que significa que se usarían GPUs idénticas, algo que no es posible salvo que ahora empiecen a lanzar sus iGPU como gráficas dedicadas.
  • La segunda es con un multi-adapter explícito, que es precisamente lo que Intel mostró durante el ejemplo, utilizando recursos compartidos y computación asimétrica.

Intel también habló de tres posibles usos para este multi-adapter, siendo el más importante de ellos el renderizado, si bien dijo que no es viable con computación asimétrica. Otra de las posibilidades es realizar el post-procesado en la iGPU, pero esto requiere atravesar el bus PCIe dos veces (ida y vuelta).

La tercera opción, que parece la más viable, es para cargas de trabajo asíncronas como Inteligencia Artificial, cálculos físicos, simulación de partículas, sombreados, etc. Según Intel esta es la mejor opción porque mantiene el modelo productor-consumidor, donde el bus PCIe solo se recorre una vez: uno produce el contenido que el otro consume. Además, dice que estas tareas pueden ser delegadas perfectamente, es decir, como hemos explicado antes ciertas tareas se delegan en la iGPU mientras que la GPU dedicada sigue haciendo el trabajo «gordo».

Cuando tu CPU es mala para realizar ciertas tareas tiras de aceleradores para que hagan ciertas tareas mucho más rápido en paralelo y liberen el trabajo de esa misma CPU, la idea de que se utilice la GPU integada para tareas de computación de apoyo a la CPU es algo muy pero que muy viejo, como se dice… ¡Gol de Socrates a pase de Arquimedes!

El problema es que utilizar la GPU integrada de manera explicita como acelerador de la CPU requiere que el código se adapte de manera explicita a ello, lo cual es algo ampliamente odiado por los programadores que prefieren tener suficiente potencia en la CPU en vez de estar sacando humo por la cabeza con la solución que plantea Intel más conocida como… «Mirad, nuestras CPUs son menos potentes y os planteamos una solución absurda que realmente nadie utiliza».

Y aquí entramos en el tema de las llamadas GPGPU en videojuegos, se que se utilizan ampliamente en otros mercados pero en videojuegos durante años tuvimos el hype de los Compute Shaders acelerando el trabajo de la CPU y que por ejemplo que el uso de los AMD Jaguar en PS4 y Xbox One no sería problema si se utilizaba parte de la potencia de la GPU para paliar a la CPU.

La idea de la computación asíncrona es el uso de la potencia sobrante de la GPU para realizar tareas fuera del pipeline gráfico tradicional. Por ejemplo puedes utilizar dicha potencia para calcular las físicas y la detección de colisiones de los juegos.

Es algo que se lleva tiempo comentando y es algo que es siempre presentado como el Santo Grial para aumentar rendimiento pero hay que tener en cuenta que los desarrolladores en general:

  • Quieren toda la potencia de la GPU para alcanzar la mayor definición gráfica, fotogramas y resolución posible, los huecos son cuanto menos casi inexistentes.
  • No quieren complicarse la vida, especialmente con los limitados presupuestos de tiempo que tienen y su estresante trabajo.

Lo peor es que han descubierto la polvora, esto hace años que se puede hacer en PC y casi nadie lo utiliza realmente pero va Intel y te lo vende como una novedad y te quedas…

Llevamos años con GPUs integradas en PC, años pudiendo utilizar estas para la computación asíncrona (fuera del pipeline gráfico) y nadie lo ha hecho y no es por las diferentes arquitecturas ya que por DirectCompute se podría haber hecho de manera general pero no se hace porque es un engorro para los desarrolladores y para ellos es mejor que les des una buena CPU que haga bien su trabajo sin complicaciones adicionales de ningún tipo.

El problema con la solución asincrona es que existen un montón de tareas que forman parte del procesamiento gráfico, especialmente los efectos de post-procesado pero que no se ejecutan en ninguna de las etapas del pipeline gráfico. Por eso se llaman «Post»-Procesado y «Pre»-Procesado porque literalmente ocurren antes. Pues bien, dichas tareas es recomendable que se realicen en el espacio de memoria donde se renderiza la escena porque si no es un enorme engorro el ir copiando los datos de una sección de memoria a otra. Es más, una de las cosas que pretende conseguir AMD en un futuro es quitarles a los desarrolladores este problema de tener que trabajar con dos búfers e ir copiando de un lado a otro la información.

En un SoC donde tienes memoria unificada aunque tengas dos visiones distintas de la misma memoria (Coherente y No-Coherente) puedes crear con el tiempo una solucion plenamente unificada gracias a que la memoria ya esta unificada… ¿Pero en PC? En PC donde la memoria esta físicamente en pozos distintos es imposible hacerlo y es tan engorroso de programar que si un juego tirando de CPU y GPU de manera tradicional puede ejecutar el juego sin problemas de rendimientos técnicos no pierden el tiempo, y es que la solución de Intel requiere estar copiando los datos de un pozo a otro.

¿Entonces como es que Intel juega a esto? ¿Tan desesperada esta por el hecho que AMD les pase la mano por la cara? En parte si, pero más bien AMD ha capitalizado de problemas internos de Intel con su nodo de 10nm y las CPUs de Intel precisamente no son anémicas en cuanto a capacidades para que tengan que estar promocionando esto. ¿Se trata de una solución única de Intel? Tampoco y hace años que esto se podría haber aplicado y los desarrolladores saben que existe.

¿Entonces? La idea de Intel es que si tienes una GPU modesta no te actualices a una más potente sino que te compres sus CPU para paliar el problema que además están con sobreprecio. El motivo de ello es que este planteamiento solo es útil si la GPU esta ahogada. ¿Y cual es el consenso universal cuando se ahoga la GPU de tu sistema por falta de potencia? ¡Comprate otra mejor! Y es lo que hace todo el mundo, pero Intel parece auto-engañada en ese aspecto o al menos quien ha presentado esta tecnología.

Si mi GPU se satura voy a bajar los gráficos para que no se sature o me comprare una GPU nueva. Los desarrolladores además cobran ingentes cantidades de Nvidia sobretodo para que las capacidades de las GPUs integradas no se utilicen en detrenimiento de una GPU normal. AMD que debería tener interés en que las GPUs integradas se utlizarán como dice Intel hace tiempo que acepto el paradigma y dado que vende también tarjetas gráficas como Nvidia esta alineada a la idea de que si tu gráfica no da la actualices.

En fin, todo esto es una perdida de tiempo en el fondo… y…

Esto es todo, tenéis el Discord y los comentarios de esta entrada para comentarla.

0 0 vote
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Steven

Hola no se bien pero pueden hacer que el compilador de c++ de Intel lo haga automático