Tutte le altre risposte popolari presentate qui parlano di differenze letterali tra FPGA e CPU. Indicano la natura parallela dell'FPGA rispetto alla natura sequenziale di una CPU o forniscono esempi del motivo per cui alcuni algoritmi potrebbero funzionare bene su un FPGA. Tutti questi sono buoni e veri, ma suggerirei comunque che c'è una differenza più fondamentale tra CPU e FPGA.
Qual è il comune denominatore tra un FPGA e una CPU? È che sono entrambi costruiti sulla parte superiore del silicio. E in alcuni casi letteralmente gli stessi processi di silicio.
La differenza fondamentale sono le astrazioni che accumuliamo su quel silicio. Per un essere umano non è possibile comprendere tutti i dettagli di un singolo design moderno della CPU dal silicio all'IC confezionato. Quindi, come parte del processo di ingegneria, suddividiamo quel problema complesso in problemi più piccoli gestibili che gli umani possono avvolgere la testa.
Considera cosa serve per trasformare quel silicio in una CPU funzionante. Ecco una visione in qualche modo semplificata degli strati di astrazione necessari per tale obiettivo:
Innanzitutto abbiamo ingegneri che sanno come creare transistor dal silicio. Sanno come progettare piccoli transistor che assorbono potenza e commutano alla velocità di 10 o addirittura 100 di gigahertz e sanno progettare transistor robusti che possono pilotare segnali con potenza sufficiente per inviarli da un pacchetto IC e attraverso un PCB ad un altro chip.
Quindi abbiamo progettisti di logica digitale che sanno come unire quei transistor a librerie con centinaia di celle logiche diverse. Porte logiche, infradito, mux e additivi, per citarne alcuni. Tutto in una varietà di configurazioni.
Successivamente abbiamo vari gruppi di ingegneri che sanno come mettere insieme quei blocchi digitali (e talvolta analogici) per formare blocchi funzionali di livello superiore come ricetrasmettitori ad alta velocità, controller di memoria, predittori di rami, ALU, ecc.
Quindi abbiamo progettisti di CPU per progettare progetti di CPU di fascia alta riunendo le unità funzionali in un sistema completo.
E non si ferma qui. A questo punto abbiamo una CPU funzionante che esegue il codice assembly ma non è un linguaggio a cui la maggior parte dei programmatori scrive in questi giorni.
- Potremmo avere un compilatore C che compila il codice assembly (probabilmente attraverso una rappresentazione intermedia)
- Potremmo aggiungere un'altra astrazione sopra C per ottenere un linguaggio orientato agli oggetti
- Potremmo persino scrivere una macchina virtuale su C o C ++ in modo da poter interpretare cose come il codice byte Java
E gli strati di astrazione possono continuare da lì. Il punto importante qui è che quegli strati di astrazione si combinano per produrre un sistema basato su CPU che si ridimensiona in modo massiccio e costa una piccola frazione di un design personalizzato di silicio.
TUTTAVIA, il punto importante da sottolineare qui è che ogni astrazione comporta anche un costo stesso. Il progettista di transistor non costruisce il transistor perfetto per ogni caso d'uso. Costruisce una libreria ragionevole, e quindi a volte viene utilizzato un transistor che consuma un po 'più di energia o un po' più di silicio di quanto sia realmente necessario per il lavoro da svolgere. Allo stesso modo i progettisti della logica non costruiscono ogni possibile cella logica. Potrebbero costruire una porta NAND a 4 ingressi e una porta NAND a 8 ingressi ma cosa succede quando un altro ingegnere ha bisogno di una NAND a 6 ingressi? Usa un gate NAND a 8 input e lega 2 input inutilizzati che si traducono in perdita di risorse di silicio e potenza a vita. E così sale la catena delle astrazioni. Ogni strato ci dà un modo per gestire la complessità,
Ora confronta quelle astrazioni con ciò che è necessario per un FPGA. In sostanza, le astrazioni FPGA si fermano al n. 2 nell'elenco sopra. L'FPGA consente agli sviluppatori di lavorare a livello di logica digitale. È un po 'più sofisticato di questo perché le CPU sono' hard coded 'a questo livello e gli FPGA devono essere configurati in fase di esecuzione (il che, a proposito, è il motivo per cui le CPU in genere eseguono frequenze molto più alte), ma la verità essenziale e essenziale è che sono lontani poche astrazioni per FPGA rispetto alle CPU.
Quindi, perché un FPGA può essere più veloce di una CPU? In sostanza è perché l'FPGA utilizza molte meno astrazioni rispetto a una CPU, il che significa che il progettista lavora più vicino al silicio. Non paga i costi di tutti i molti livelli di astrazione richiesti per le CPU. Codifica a un livello inferiore e deve lavorare di più per raggiungere un determinato livello di funzionalità, ma la ricompensa ottiene prestazioni più elevate.
Ma ovviamente c'è anche un lato negativo per un minor numero di astrazioni. Tutte quelle astrazioni della CPU sono lì per una buona ragione. Ci danno un paradigma di codifica molto più semplice, il che significa che più persone possono facilmente svilupparsi per loro. Ciò a sua volta significa che esistono molti più design di CPU esistenti e quindi abbiamo enormi vantaggi in termini di prezzo / scala / time-to-market delle CPU.
Così il gioco è fatto. Gli FPGA hanno meno astrazioni e quindi possono essere più veloci e più efficienti dal punto di vista energetico ma difficili da programmare. Le CPU hanno molte astrazioni progettate per renderle facili da sviluppare, scalabili ed economiche. Ma rinunciano a velocità e potere negli scambi per quei benefici.