Todas las otras respuestas populares presentadas aquí hablan de diferencias literales entre FPGA y CPU. Señalan la naturaleza paralela de la FPGA frente a la naturaleza secuencial de una CPU, o dan ejemplos de por qué ciertos algoritmos podrían funcionar bien en una FPGA. Todos estos son buenos y verdaderos, pero sugeriría sin embargo que hay una diferencia más fundamental entre CPU y FPGA.
¿Cuál es el denominador común entre un FPGA y una CPU? Es que ambos están construidos sobre silicio. Y en algunos casos, literalmente, los mismos procesos de silicio.
La diferencia fundamental son las abstracciones que acumulamos sobre ese silicio. No es posible que un humano comprenda todos los detalles de un diseño de CPU moderno único, desde silicio hasta IC empaquetado. Entonces, como parte del proceso de ingeniería, dividimos ese problema complejo en problemas manejables más pequeños que los humanos pueden resolver.
Considere lo que se necesita para convertir ese silicio en una CPU que funcione. Aquí hay una vista algo simplificada de las capas de abstracción necesarias para ese objetivo:
Primero tenemos ingenieros que saben cómo crear transistores a partir de silicio. Saben cómo diseñar transistores pequeños que consumen energía y cambian a una velocidad de 10 o incluso 100 gigahercios, y saben cómo diseñar transistores robustos que pueden conducir señales con suficiente potencia para enviarlos desde un paquete IC y a través de una PCB a otro chip.
Luego tenemos diseñadores de lógica digital que saben cómo juntar esos transistores en bibliotecas con cientos de celdas lógicas diferentes. Puertas lógicas, chanclas, muxes y sumadores, por nombrar algunos. Todo en una variedad de configuraciones.
A continuación, tenemos varios grupos de ingenieros que saben cómo juntar esos bloques digitales (y a veces analógicos) para formar bloques funcionales de nivel superior, como transceptores de alta velocidad, controladores de memoria, predictores de rama, ALU, etc.
Luego tenemos diseñadores de CPU para diseñar diseños de CPU de gama alta al reunir esas unidades funcionales en un sistema completo.
Y no se detiene ahí. En este punto, tenemos una CPU en funcionamiento que ejecuta código de ensamblaje, pero ese no es un lenguaje al que la mayoría de los programadores escriben en estos días.
- Podríamos tener un compilador de C que compila el código de ensamblaje (probablemente a través de alguna representación intermedia)
- Podríamos agregar otra abstracción sobre C para obtener un lenguaje orientado a objetos
- Incluso podríamos escribir una máquina virtual encima de C o C ++ para poder interpretar cosas como el código de bytes de Java
Y las capas de abstracción pueden continuar desde allí. El punto importante aquí es que esas capas de abstracción se combinan para producir un sistema basado en CPU que se escala masivamente y cuesta una pequeña fracción de un diseño de silicio personalizado.
SIN EMBARGO, el punto importante a destacar aquí es que cada abstracción también conlleva un costo en sí mismo. El diseñador de transistores no construye el transistor perfecto para cada caso de uso. Construye una biblioteca razonable, por lo que a veces se usa un transistor que consume un poco más de energía o un poco más de silicio del que realmente se necesita para el trabajo en cuestión. Y de manera similar, los diseñadores lógicos no construyen todas las celdas lógicas posibles. Pueden construir una compuerta NAND de 4 entradas y una compuerta NAND de 8 entradas, pero ¿qué sucede cuando otro ingeniero necesita una compuerta NAND de 6 entradas? Utiliza una compuerta NAND de 8 entradas y conecta 2 entradas no utilizadas, lo que da como resultado la pérdida de recursos de silicio y la potencia de la energía. Y así sube la cadena de abstracciones. Cada capa nos brinda una forma de manejar la complejidad,
Ahora compare esas abstracciones con lo que se necesita para un FPGA. Esencialmente, las abstracciones FPGA se detienen en el n. ° 2 en la lista anterior. El FPGA permite a los desarrolladores trabajar en la capa de lógica digital. Es algo más sofisticado que eso porque las CPU están 'codificadas' en esta capa y los FPGA deben configurarse en tiempo de ejecución (lo que, por cierto, es por eso que las CPU suelen ejecutar frecuencias mucho más altas), pero la verdad esencial es que están lejos pocas abstracciones para FPGAs que para CPUs.
Entonces, ¿por qué un FPGA puede ser más rápido que una CPU? En esencia, es porque el FPGA usa muchas menos abstracciones que una CPU, lo que significa que el diseñador trabaja más cerca del silicio. No paga los costos de todas las capas de abstracción que se requieren para las CPU. Codifica en un nivel inferior y tiene que trabajar más para lograr una funcionalidad determinada, pero la recompensa que obtiene es un mayor rendimiento.
Pero, por supuesto, también hay un lado negativo para menos abstracciones. Todas esas abstracciones de CPU están ahí por una buena razón. Nos dan un paradigma de codificación mucho más simple, lo que significa que más personas pueden desarrollar fácilmente para ellos. Eso a su vez significa que existen muchos más diseños de CPU y, por lo tanto, tenemos beneficios masivos de precio / escala / tiempo de comercialización de las CPU.
Entonces ahí lo tienes. Los FPGA tienen menos abstracciones, por lo que pueden ser más rápidos y más eficientes, pero difíciles de programar. Las CPU tienen muchas abstracciones diseñadas para facilitar su desarrollo, escalabilidad y bajo costo. Pero abandonan la velocidad y el poder en el comercio por esos beneficios.