Blog Personal.

Conceptos Básicos

Procesadores de Comandos en la GPU

El Micro Engine o ME es el nombre que AMD le da a su Procesador de Comandos Gráficos. Se trata de un microcontrolador encargado de de dirigir todos los elementos de la GPU y es por ello que se encuentra en la parte central del chip. Ejecuta un anillo de comandos, el cual es una cola, que es el anillo 0 y el que tiene más privilegio a la hora de utilizar las Compute Units.

Su funcionamiento es el mismo que una enorme unidad de control que se encarga de tomar las instrucciones+datos en memoria (Fetch), decodificarlas (Decode) pero no las ejecuta sino que las envía directamente a través de las diferentes unidades de la GPU.

El proceso es el siguiente:

  • El Procesador de Comandos copia de una parte de la RAM del sistema (no de la GPU) la lista de comandos escrita por la CPU.
  • El Procesador de Comandos Gráficos almacena en su memoria interna en forma de una lista FIFO los comandos de la lista.
  • El Procesador de Comandos Gráficos decodifica desde su memoria interna y envia las instrucciones a las unidades correspondientes.
  • No se debe confundir con el planificador dentro de cada Compute Unit.

Antes de DirectX 11/OpenGL 4 solo había un solo procesador de comandos, el cual ejecutaba una lista común.

En DX11/OGL4 pasamos a tener varias listas pero todas ellas terminaban en una lista en común porque la GPU tenía un solo procesador de comandos. Al ser una lista FIFO (First In, First Out) los comandos de las listas posteriores tardaban más en solventarse y eso era un problema para el pipeline de computación que funcionaba de manera completamente asíncrona y no necesitaba por tanto de los resultados del pipeline gráfico al funcionar en paralelo o simplemente se buscaba que mientras el pipeline gráfico renderizaba un fotograma el pipeline de computación se encargase de hacer pre-procesado del siguiente fotograma o post-procesado del anterior aprovechando las Compute Units libres para ello.

Es por ello que AMD lanzo GCN cuya novedad principal fueron lo que en marketing se llamaron ACE pero cuyo nombre real es Micro-Engine Compute, con ello ya fue posible separar por completo el pipeline de computación del gráfico y que estos funcionarán en paralelo. Para ello crearon una API llamada Mantle de la que deriva Vulkan y Microsoft actualizo DirectX para adaptarlo a esta capacidad.

La diferencia entre el ME y el MEC es que el primero tiene preferencia a la hora de utilizar los recursos de la GPU. En general el MEC se coloca a los lados del ME dentro de la organización de la GPU.

  • Se trata de una unidad multihilo al contrario del ME. Mientras que el ME ejecuta 1 sola lista de manera simultanea, el MEC ejecuta 4 listas.
  • 4 ACE en el diagrama de AMD= 1 MEC
  • El MEC solo tiene acceso a las Compute Units pero no tiene acceso a las unidades de función fija fuera de estas. (ROPS/RBE, Unidad de Rasterizado, Unidad de Culling, Unidad de Teselación).
  • Cada hilo del MEC tiene unos 8 anillos asociados, pero solo se puede ejecutar uno solo a la vez, es el driver dirigido por la CPU el encargado de gestionar el salto de un anillo a otro.

El problema existente es que si trabajamos con una API cercana al metal y por tanto de bajo nivel nos encontramos con el engorro de tener que controlar todos esos hilos de computación y gestionarlos manualmente. Este es el motivo por el cual hay tanto juego DX11 en plena era DX12 por el hecho que es una pesadilla para muchos programadores. En el caso de PlayStation tenemos el llamado GNMX que utiliza un controlador para gestionar los hilos de computación de manera automática a cambio de perder potencia de la CPU en ello.

Actualmente en AMD se hacen uso de 2 MEC, esto son 8 ACE y por tanto 64 anillos, esto es lo que marca el limite de Compute Units a 64 precisamente. Curiosamente la primera GPU de PC con 2 MEC fue la AMD Hawaii, pero la primera comercial fue la del SoC Liverpool/Thebe para PlayStation 4 donde el procesador de comandos tiene unos 2 MEC= 8 ACE pese a tener solo 18 CUs.

Es decir, pese que Xbox One tiene una configuración más simple a PS4 no les ninguna ventaja tenerlas pero si a PS4 Pro porque su cantidad de CUs >32.

Y si os habéis fijado existe otro anillo adicional que es el VShell Ring… Este anillo no es exclusivo de PlayStation 4 sino que también se encuentra en PC. Digamos que dentro de cada GPU e independientemente de cual sea el fabricante existe otro procesador de comandos gráficos en la GPU, este solo se activa durante el arranque del sistema. Se trata de una unidad 2D muy simple que es equivalente a una unidad VGA avanzada sin florituras de ningún tipo para garantizar una interfaz gráfica y de texto.

Por ejemplo cuando ejecutamos Linux en modo texto…

… en realidad estamos utilizando la GPU teniendo como director de orquesta al ME secundario. ¿Pero en que se diferencian? Basicamente los procesadores de comandos estándar que se utilizan normalmente tiene un set de registros e instrucciones propietario de cada marca y luego hay otro genérico para estos casos concretos que sobretodo se basa en los estándares VGA (ampliados por el uso de intefaces como HDMI, Display Port).

En realidad en PC el ME no tomaría el control de los gráficos hasta que no se cargase la interfaz gráfica del Sistema Operativo, es por eso que a veces se ve un fundido en negro como si hubiese un apagón ya que es producto del cambio de gráfica.

Cuando el Sistema Operativo se ejecuta en un modo especial que no utiliza la GPU de manera normal invoca este modo pero el Sistema Operativo lo desactiva tan pronto como toma el control. En el caso de PlayStation 4,concretamente en el SDK existe un modo texto que se puede activar y que no esta disponible en la consola comercial, la forma en la que Sony impide el modo texto es que PlayStation 4 al contrario del SDK es que en la consola comercial la interfaz HDMI de la GPU no se usa…

Pe… pero Urian, si todas las PlayStation 4 tienen salida HDMI…

Digamos que la salida HDMI esta conectada a la interfaz Display Port y hay un conversor DP a HDMI en la placa que es de marca Panasonic.

El anillo del VShell transmite solamente a la interfaz HDMI de la GPU, la cual no esta conectada a nada en la consola comercial mientras que el anillo GFX que es el ME que utiliza la consola para los juegos transmite al Display Port y el conversor a HDMI de Panasonic hace su trabajo.

Microsoft en cambio hizo un cambio distinto, Windows invoca el anillo del VShell al principio de su ejecución desde el arranque pero si alguien es lo suficientemente inteligente puede utilizarlo para reventar la seguridad del sistema colocando una interfaz simple de texto para controlar el sistema. ¿Solución para Microsoft? Crear su propio ME extendido y eliminar el anillo de VShell. Xbox One no es un PC para Windows ni esta pensado para ejecutar nada de PC. Pero en Microsoft dependiendo de la API que hagamos uso se utiliza el ME de AMD sin cambios o el extendido de Microsoft.

  • DirectX 11 y DirectX 12 estándar de PC en Xbox hacen uso del ME.
  • DirectX 11.x y DirectX 12 para Xbox hacen uso del ME++ o ME extendido.

Pero la cosa no termina ahí y ahora deberíamos volver al MEC. Al cual a partir de cierto punto en PC añádieron una unidad llamada HWS, no se trata de una pieza de hardware adicional sino que es posible reservar uno o varios de los 4 hilos del MEC para que gestione a los otros. De otra manera ha de ser el código del juego el que gestione las listas de manera manual como he comentado antes. Las GPUs de AMD con soporte HWS simplemente tienen la capacidad de utilizar una de las colas para almacenar y restaurar comandos en su FIFO de los otros 3 hilos del MEC, de tal manera que pueden cambiar de anillo fácilmente, luego el hilo gestor se encarga de restaurar esos hilos cuando hay recursos y es necesario pero los desarrolladores se pueden olvidar de ello por completo y se descarga a la GPU de ello. PlayStation 4, PlayStation 4 Pro y Xbox One S carecen del HWS pero se encuentra en Xbox One X y obviamente en la next gen (PlayStation 5 y las Xbox Series).

Una vez hecha la explicación.. ¿A que viene esta entrada? En la última versión de Windows 10 podemos ver lo siguiente entre las opciones:

Básicamente la idea es que no sea el controlador por software el encargado de gestionar los hilos liberando a la CPU y facilitando el trabajo. ¿La contrapartida? Resulta más cómodo pero más lento que hacerlo manualmente debido a que la velocidad del planificador es menor que la de un núcleo de la CPU que es mucho más rápido haciendo el mismo trabajo pero simplifica enormemente las cosas para los desarrolladores a la hora de utilizar los recursos.

Esto es todo, tenéis los comentarios de esta misma entrada para comentar y no olvideis que tenemos Discord.

4 1 vote
Article Rating
5 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Tokra_Kree

Muy interesante Urian.

ram

hola urian,que opinas de esta una extraña cpu llamada a9 9820 para pc,dicen que
es la misma de la xbox one

https://www.chuwi.com/product/items/Chuwi-AeroBox.html

https://www.weibo.com/ttarticle/p/show?id=2309404385267275422530

Nitupensis

que minipc mas raro, que use ddr3 o que no soporte disco M.2 Pci-e (solo e modo sata) tiene toda la pinta de que AMD esta vendiendo algún diseño que en su dia no lanzaron basado en los Puma/Jaguar para alimentar a equipos low cost. Usa el SOC «Cato» de 8 nucleos/hilos @ 2.35Ghz, iGPU R7 350 a 935 MHz, 4 Slots de memoria sodim DDR3. puerto M.2 solo compatible con modo sata. el diseño externo incluso recuerda a la one https://www.chuwi.com/product/items/Chuwi-AeroBox.html Otra curiosidad es que un producto que chuwi solo va a lanzar para el mercado occidental y de… Read more »

Last edited 2 months ago by Nitupensis
Nitupensis

uff ni siquiera ofrece salida hdmi, solo dvi, esto lo mata para uso de htpc mas teniendo el Herobox del mismo fabricante aunque sea menos potente.La memoria usada son las antiguas ddr3-1600, este soc parece ser una version vitaminada de los Athlon 5370, A6-5200, el GX-420CA o los Opteron Kyoto como el X2170 que sacaron hace unos años pero con el doble de núcleos y una igpu con 512sp (los que he indicado anteriomente solo tenian 4 nucleos y una igpu con 128sp). Tiene toda la pinta de ser algo que AMD fabrico para darle algun uso hace unos años… Read more »

Last edited 2 months ago by Nitupensis
Steven

Hola interesante no sabía que hay un procesador de comando solo para arrancar