La idea de tener un FPGA integrado dentro de un procesador como si fuese una unidad más no es una novedad, hace años que existen los eFPGA, pero la compra hace unas semanas de Xilinx por parte de AMD junto a la de Altera hace ya un par de años por parte de Intel abren la posibilidad de uno o varios FPGA dentro de SoCs, CPU y GPU.
Los FPGA son un tipo de unidad que no es muy común en CPUs y GPUs, pero estos ya empiezan a integrarse dentro de los SoCs, CPU y GPU. ¿El motivo? El área de los chips es cada vez más cara y se necesita optimizar el espacio. Es por ello que los arquitectos han de pensar formas en las que cada transistor cuente y que no existen espacios muertos sin utilizar, especialmente en lo que a las interfaces de E/S se refiere.
Es aquí donde entran los eFPGA, una solución que consiste en integrar lógica programa en forma de un FPGA dentro de un SoC, una CPU o una GPU, con la idea de maximizar el área del chip en cada momento y poder adaptarlo a las necesidades de cada configuración en concreto.
¿Qué es un FPGA?
Un FPGA es una matriz de puertas lógicas programables, la cual se puede configurar de cualquier manera para que dicha matriz funcione como un chip en concreto. Son utilizados en entornos donde es necesario hardware dedicado pero son tan especializados que no sale rentable la fabricación en masa, así como también para prototipaje de nuevas funciones de futuros procesadores.
Los FPGA se componen por varios bloques de lógica configurable, los cuales están interconectados entre sí. Estos difieren del resto de procesadores por el hecho que la lógica de su circuitería no se puede cambiar en el resto. No se puede transformar una CPU en una GPU después de su fabricación, pero sí que se puede realizar con un FPGA a través de cargarle un archivo de configuración que reprograme sus puertas lógicas.
Obviamente esta capacidad de programación tiene varias contrapartidas, la primera de ellas es que no puede alcanzar las velocidades de reloj de los chips que son FPGA, la segunda es que el exceso de circuitería por el nivel de configuración de estos hace que se necesite una mayor cantidad de transistores y con ello de área.
¿Cómo se implementa un eFPGA?
Al concepto se le llama eFPGA o embedded FPGA. Consiste en integrar una FPGA como parte de un SoC y por tanto no como un chip aparte, lo que abre la posibilidad de la adopción de este tipo unidades por parte del mercado general.
Al igual que ocurre en una GPU integrada, el anillo exterior que comunica el FPGA dedicado con el exterior se pierde al ser común este para todo el SoC. Lo cual reduce el tamaño del SoC en un 25% en comparación con su versión dedicada.
La ventaja de los eFPGA es que al utilizar la misma velocidad de comunicación que el resto de elementos del SoC esta gana en velocidad a la hora de comunicarse. Un eFPGA al estar en el mismo procesador y utilizar el mismo cableado para comunicarse va a funcionar de manera mucho más rápida que teniendo un FPGA estándar separado de la CPU, lo cual supone un aumento de rendimiento de cara al eFPGA no un FPGA dedicado, esto nos permite hacer cosas que no son posibles con un FPGA estándar, pero al mismo tiempo nos vemos limitados acerca de lo que se puede realizar en un eFPGA al no haber tanto espacio como en un FPGA.
Esto lleva a que en estos momentos de cara a implementar un FPGA como parte integral de un sistema existan dos escenarios. El primero es el de eFPGA, el segundo es el de la FPGA como chiplet, el cual es un tema aparte y abarca mercados muy diferenciados. Por ejemplo te puedes plantear crear una red neural para la IA con un FPGA no embebido, cosa que no puedes hacer en un eFPGA.
eFPGA para la E/S en las CPU y GPU para PC.
La aplicación más obvia son las interfaces de E/S, por ejemplo podemos implementar una interfaz USB con un FPGA y un SerDES y reconfigurar ambos para que funcionen como una interfaz SATA. También podemos hacer lo mismo con un FPGA y una radio conectada al mismo para por ejemplo convertir una interfaz WiFi Direct en una Bluetooth según cuál sea la necesidad de la configuración. La idea no es que el usuario final realice esos cambios, sino que sea en ensamblador o fabricante del componente de hardware que realice estos cambios.
También es posible su implementación en una GPU, por ejemplo puede ser que aparezcan pantallas con soporte DP 2.0 y vuestra GPU tiene soporte solo para DP 1.4, pero gracias a que han implementado el controlador de video en un FPGA este se puede reprogramar y ganar soporte para la nueva salida de video. También puede ser que hayáis adquirido la GPU para minería y no os interese mostrar gráficos, en ese caso podéis reconfigurar el FPGA de la salida de pantalla en un procesador criptográfico o incluso un pequeño ASIC para acelerar el minado.
En general los eFPGA se pueden utilizar para reemplazar interfaces externas en un procesador y que se suelen encontrar en la perifería sin tener que rehacer el chip. No solo interfaces de entrada y salida, sino también de memoria RAM, por ejemplo pasar de una interfaz DDR4 a una LPDDR4 sin tener que fabricar dos chips distintos.
eFPGA integrado en el núcleo de una CPU
Una de las formas en las que en el futuro los procesadores van a aumentar su rendimiento va a ser a través de centrar esta en partes comunas y reiterativas del código. Otra solución sería la aceleración de las partes pesadas del código que serían ejecutadas por unidades especializadas.
Justo de manera casi simultánea a la compra de Xilinx, AMD publicaba una patente en la que hablaba del uso de FPGAs para la aceleración de ciertas instrucciones, lo cual iría a un nivel de integración más allá. La del FPGA ya dentro de la CPU y no como un elemento adicional del SoC.
- Una CPU puede incluir una o varias unidades de ejecución programables, las cuales pueden ser reconfiguradas para ejecutar todo tipo de instrucciones.
- Dichas unidades de ejecución son eFPGA, la parte de la CPU encargada de las etapas del captación de datos y de descodificación son comunes para toda las CPUs y se encargan de distribuir las instrucciones a ejecutar a los eFPGA que hacen de unidad de ejecución.
- Cuando el procesador carga un hilo de ejecución, este también carga el tipo de unidades de ejecución que requiere para ejecutar esto, entonces los eFPGA se configuran como dichas unidades gracias a los archivos de configuración internos.
- Los eFPGA pueden ser reprogramados al vuelo y cada uno para una función distinta.
Por ejemplo, puede que un programa utilice mucho las unidades de enteros pero no la unidad SIMD, pues si las unidades de ejecución están implementadas como eFPGA podemos reconfigurar la que estaba como unidad SIMD para que actúa como una unidad de enteros adicional.