In che modo un FPGA può superare una CPU?


55

Ho sentito parlare di persone che usano FPGA per migliorare le prestazioni di sistemi che fanno cose come il mining di bit-coin, il commercio elettronico e il ripiegamento delle proteine.

Come può un FPGA competere con una CPU in termini di prestazioni quando in genere la CPU esegue almeno un ordine di grandezza (in termini di velocità di clock)?


13
L'FPGA fa tutto in una volta.
Ignacio Vazquez-Abrams

Risposte:


48

Le CPU sono dispositivi di elaborazione sequenziale. Rompono un algoritmo in una sequenza di operazioni ed eseguono uno alla volta.

Gli FPGA sono (o possono essere configurati come) dispositivi di elaborazione parallela. Un intero algoritmo potrebbe essere eseguito in un singolo tick del clock o, nel peggiore dei casi, molto meno tick di clock rispetto a un processore sequenziale. Uno dei costi per la maggiore complessità logica è in genere un limite inferiore al quale è possibile sincronizzare il dispositivo.

Tenendo presente quanto sopra, gli FPGA possono superare le prestazioni della CPU in determinate attività perché possono svolgere la stessa attività con meno tick di clock, sebbene con una frequenza di clock complessiva inferiore. I guadagni che possono essere ottenuti dipendono fortemente dall'algoritmo, ma almeno un ordine di grandezza non è atipico per qualcosa come un FFT.

Inoltre, poiché è possibile creare più unità di esecuzione parallele in un FPGA, se si dispone di un grande volume di dati che si desidera passare attraverso lo stesso algoritmo, è possibile distribuire i dati tra le unità di esecuzione parallele e ottenere ulteriori ordini di grandezza con una velocità maggiore di quanto si possa ottenere anche con una CPU multi-core.

Il prezzo da pagare per i vantaggi è il consumo di energia e quello di $$$.


2
+1; Gli FPGA tuttavia non sono così dinamici come le CPU, motivo per cui le CPU sono in genere più adatte ai PC
Nick Williams

17
"Il prezzo da pagare per i vantaggi è il consumo di energia e quello di $$$". - Questo è spesso vero, ma puoi battere perfettamente una macchina Intel Xeon multi-$ 1000 di fascia alta con un Xilinx Spartan-6 $ 50 di fascia bassa per molti algoritmi. Ma ciò richiede in genere molto tempo di progettazione e potresti finire con un design molto personalizzato che funziona solo per un'applicazione ed è difficile da modificare. Quindi il compromesso non è solo potere e denaro, ma tempo di sviluppo dell'algoritmo, riusabilità e flessibilità. (Anche se puoi discutere tempo == denaro.)
wjl

markt, circa la tua ultima frase, gli FPGA non hanno una potenza molto inferiore rispetto alle CPU? Esiste una vasta gamma di dispositivi sia per CPU che per FPGA, ma se consideriamo quelli che vengono utilizzati per cose come il mining di bit-coin, non sono le CPU utilizzate per quelle attività molto più assetate di energia rispetto agli FPGA che sarebbero Usato?
David Gardner,

4
@David: quando si parla di mining Bitcoin, la metrica pertinente è il numero di hash per watt. Markt sta parlando del consumo energetico complessivo. Cioè, un determinato FPGA può consumare 3 volte la potenza di una CPU tipica, ma essere molto più di 3 volte più veloce nel mining di Bitcoin; quindi per Bitcoin è una vittoria.
Billy ONeal

2
@Billy: il numero di hash per watt · secondo, non per watt.
Paŭlo Ebermann,

34

Markt ha questo per lo più giusto, ma ho intenzione di aggiungere i miei 2 centesimi qui:

Immagina di averti detto che volevo scrivere un programma che invertisse l'ordine dei bit all'interno di un numero intero a 32 bit. Qualcosa come questo:

int reverseBits(int input) {
    output = 0;
    for(int i = 0;i < 32;i++) {
        // Check if the lowest bit is set
        if(input & 1 != 0) {
            output = output | 1; // set the lowest bit to match in the output!
        }

        input = input >> 1;
        output = output << 1;
    }
    return output;
}

Ora la mia implementazione non è elegante, ma sono sicuro che sei d'accordo sul fatto che ci sarebbe un certo numero di operazioni coinvolte nel fare questo, e probabilmente una sorta di ciclo. Ciò significa che nella CPU sono stati spesi molti più di 1 ciclo per implementare questa operazione.

In un FPGA, puoi semplicemente collegarlo come una coppia di chiavistelli. Ottieni i tuoi dati in alcuni registri, quindi li colleghi nei diversi registri in ordine di bit inverso. Ciò significa che l'operazione verrà completata in un singolo ciclo di clock nell'FPGA. Pertanto, in un singolo ciclo, FPGS ha completato un'operazione che ha portato alla tua CPU per uso generale molte migliaia di cicli per essere completato! Inoltre, è possibile collegare in parallelo probabilmente alcune centinaia di questi registri. Quindi, se è possibile spostarsi di alcune centinaia di numeri sull'FPGA, in un singolo ciclo finirà quelle migliaia di operazioni centinaia di volte, tutto in 1 ciclo di clock FPGA.

Esistono molte cose che una CPU per scopi generici può fare, ma come limitazione abbiamo impostato istruzioni generali e semplici che devono necessariamente espandersi in elenchi di istruzioni semplici per completare alcune attività. Quindi potrei fare in modo che la CPU per scopi generici abbia un'istruzione come "ordine bit inverso per registro a 32 bit" e dare alla CPU la stessa capacità dell'FPGA che abbiamo appena creato, ma ci sono un numero infinito di tali possibili istruzioni utili, e quindi noi inserire solo quelli che giustificano il costo nelle CPU popolari.

FPGA, CPLD e ASIC offrono tutti l'accesso all'hardware non elaborato, che consente di definire operazioni folli come "decodifica i byte crittografati AES256 con chiave" o "decodifica il frame del video h.264". Questi hanno latenze di più di un ciclo di clock in un FPGA, ma possono essere implementati in modi molto più efficienti rispetto alla scrittura dell'operazione in milioni di righe di codice assembly per scopi generici. Ciò ha anche il vantaggio di rendere l'FPGA / ASIC a scopo fisso per molte di queste operazioni più efficiente dal punto di vista energetico poiché non devono svolgere altrettanto lavoro estraneo!

Il parallelismo è l'altra parte che ha messo in evidenza, e sebbene ciò sia anche importante, la cosa principale è quando un FPGA mette in parallelo qualcosa che era già costoso nella CPU in termini di cicli necessari per eseguire l'operazione. Una volta che inizi a dire "Posso eseguire in 10 cicli FPGA un'attività che richiede 100.000 cicli della mia CPU e posso eseguire questa operazione in parallelo 4 elementi alla volta", puoi facilmente capire perché un FPGA potrebbe essere un casino di molto più veloce di una CPU!

Quindi perché non usare FPGA, CPLD e ASIC per tutto? Perché in generale è un intero chip che non fa altro che un'operazione. Ciò significa che sebbene sia possibile ottenere un processo per eseguire molti ordini di grandezza più velocemente nel FPGA / ASIC, non è possibile modificarlo in seguito quando tale operazione non è più utile. Il motivo per cui non è possibile (in genere) cambiare un FPGA una volta che si trova in un circuito è che il cablaggio dell'interfaccia è fisso e normalmente il circuito non include componenti che consentirebbero di riprogrammare l'FPGA in una configurazione più utile. Alcuni ricercatori stanno cercando di costruire moduli ibridi FPGA-CPU, dove esiste una sezione della CPU che è in grado di essere ricablata / riprogrammata come una FPGA, permettendoti di "caricare" una sezione efficace della CPU,


2
Per l'esempio dell'inversione dei bit (e di tutte le altre attività di scambio / selezione di bit) non richiede realmente 1 ciclo di clock, ma impiega 0. Nel tuo esempio, richiede 1 ciclo di clock per memorizzare i dati in un latch , che non è il stessa operazione. Richiede 1 ciclo di clock indipendentemente dal fatto che si invertano o meno i bit. L'operazione di inversione dei bit è di 0 cicli di clock; nessun sovraccarico, solo un percorso diverso. La differenza non è solo la semantica, specialmente quando inizi ad aggiungere cose. Ad esempio, quanto tempo ci vuole per spostare una parola di 32 bit in basso di 3 bit, quindi scambiare ogni altro bocconcino, quindi invertirlo?
giovedì

1
"modulo ibrido FPGA-CPU" - questi sono sul mercato da molto tempo (vedi xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm per un successo moderno), ma anche senza il supporto speciale, che combina software e HDL, viene comunemente realizzato implementando una CPU soft all'interno dell'FPGA sul fabric.
giovedì

@wjl Hai ragione sul fatto che tecnicamente non ci vogliono cicli per eseguire l'operazione stessa. Direi che il tuo esempio è solo semanticamente diverso, principalmente perché fare queste tre operazioni si traduce logicamente in un modello di bit fisso (cioè inizio con b1b2b3b4 e finisco con b3b1b4b2). Questo è stato il mio punto in tutta la risposta. Stavo cercando di sottolineare che la descrizione di un'operazione come una serie di passaggi è spesso necessaria solo quando si dispone di un set di istruzioni / disposizione di gate fisso.
Kit Scuzz

@wjl: Nel modo in cui David Gardner ha posto la domanda, sembra dire che "CPU" equivale a una CPU Intel o AMD x86 / x86_64 con clock, pipeline e ottimizzazione altamente ottimizzata. Esistono molte "CPU" morbide, ma nessuna di quelle progettate per alloggiare in un FPGA può essere sincronizzata come un i7, né sono quasi altrettanto ottimizzate o capaci. Per quanto riguarda gli ibridi, intendevo più qualcosa del genere: newsroom.intel.com/docs/DOC-1512 che apparentemente esiste
Kit Scuzz

1
lo Zynq non è davvero un cattivo processore (ARM Cortex-A9 - la stessa cosa che fa funzionare tablet, ecc.), ma sono d'accordo che sarebbe molto più bello avere un FPGA integrato con un x86_64 ad alta velocità. =)
wjl

25

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  1. Potremmo avere un compilatore C che compila il codice assembly (probabilmente attraverso una rappresentazione intermedia)
  2. Potremmo aggiungere un'altra astrazione sopra C per ottenere un linguaggio orientato agli oggetti
  3. 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.


Inoltre, gli FPGA sono progettati utilizzando semplici blocchi ripetitivi che devono svolgere semplici compiti logici. Sono fatti su misura per determinati tipi di attività. Le CPU, OTOH, hanno molte parti funzionali complesse che fanno tutte cose diverse. Si potrebbe considerare che una CPU è un gruppo di molti diversi dispositivi simili a FPGA (dopo tutto, è tutto solo silicio, elettronica e matematica). Quindi non si tratta solo di astrazioni, ma di complessità. Le CPU sono dispositivi complessi costituiti da molti tipi diversi di dispositivi elettrici mentre un FPGA è composto da pochi. Una CPU è un fucile da caccia mentre un FPGA è un fucile.
AbstractDissonance,

21

Mentre le altre risposte sono tutte corrette, nessuna di esse affronta ancora l'esempio del mining di bitcoin dalla tua domanda, che è davvero un esempio decente. Il mining di bitcoin comporta il calcolo ripetuto di una funzione di crittografia crittografica, SHA-256 del risultato di un altro calcolo SHA-256, di dati in cui cambia un solo numero intero a 32 bit, fino a quando l'hash risultante ha determinate proprietà. Ogni SHA-256 è composto da 64 ripetizioni dello stesso algoritmo che coinvolge aggiunte a 32 bit, spostamenti di bit e alcune altre operazioni di manipolazione dei bit.

Se programmate questo loop su una CPU a 32 bit (o più), troverete che il suo set di istruzioni è molto adatto per l'attività --- SHA-256 è stato progettato per funzionare in modo efficiente su CPU. Utilizzerai ancora forse solo il 2% dell'area di silicio di una CPU moderna, con funzionalità ad alta intensità di area come memorizzazione nella cache, moltiplicazione, divisione, funzionamento in virgola mobile, branching e previsione di brach, ecc., O non utilizzate affatto o incapaci di fornire significative aumento delle prestazioni per questo particolare compito.

In hardware configurabile come un FPGA, è sufficiente implementare solo quel 2% e ottimizzare ulteriormente dimenticando tutto sull'esecuzione del codice, piuttosto progettando porte per calcolare direttamente ognuna di quelle funzioni spesso ripetute. Pipeline in modo tale che ognuna di esse passa un risultato nel successivo ogni clock e ripetuta 128 volte (e con una logica aggiuntiva speciale in cui ogni SHA-256 inizia e finisce), si ottiene un risultato ogni ciclo di clock (forse 100 milioni di hash al secondo su un FPGA pubblicizzato per supportare 300 MHz su una logica più semplice di questa) mentre su una CPU moderna, ci si potrebbe aspettare un risultato ogni poche migliaia di cicli di clock per core, diciamo 10 milioni di hash al secondo su un multi-core multi -GHz CPU.

Se questo particolare esempio ti interessa, potresti dare un'occhiata alla mia risposta correlata sugli interni dei minatori ASIC su bitcoin.stackexchange, poiché molti minatori FPGA funzionano allo stesso modo utilizzando hardware configurabile anziché personalizzato. Solo per completezza: ci sono altre possibilità, come limitare o evitare la pipeline che ho descritto a favore di una parallelizzazione più banale usando più hash SHA-256 indipendenti. Dipendendo dai vincoli dati dagli interni dell'FPGA e dalle sue dimensioni totali, ciò può anche fornire prestazioni migliori anche se sarebbe meno efficiente in termini di conteggio dei gate e overhead di routing se si avesse la massima libertà nella progettazione dell'intero chip, non solo una configurazione FPGA .


3
Questo è un ottimo punto sull'utilizzo del silicio.
markt

Ma forse (involontariamente!) Fuorviante, considerando che un FPGA è costituito da celle in qualche modo complesse con molte porte fisiche, di cui un'applicazione tipica utilizza nuovamente solo una frazione, consentendo ai produttori di pubblicizzare un numero equivalente di gate nel tentativo di dirti quanto tutto di ciò potrebbe valere la pena in un'applicazione "tipica" ...
piramidi,

3

Le risposte sopra, sebbene corrette, mancano il punto sul perché gli FPGA (e gli ASIC personalizzati) sono particolarmente buoni per i calcoli dei bitcoin.

Il vero vantaggio è che gran parte dei calcoli SHA-256 sono operazioni logiche (ad esempio, spostamenti di bit) che possono essere eseguite nel cablaggio. In questo modo, richiedono 0 cicli di clock.

Un altro vantaggio importante è che gli FPGA sono molto più efficienti dal punto di vista energetico (ovvero MIPS per Watt) rispetto alle CPU, quindi la quantità di energia richiesta per i calcoli è molto inferiore. Questo è importante perché il costo di estrazione di un bitcoin dipende da quanta elettricità usi per produrlo.

I chip ASIC sono più efficienti dal punto di vista energetico rispetto agli FPGA, quindi possono eseguire lo stesso codice in modo molto più economico. Puoi anche stipare più unità di esecuzione a bordo per renderle più veloci. Lo svantaggio è che il costo di produzione di un ASIC personalizzato è molto elevato, quindi è necessario vendere un bel po 'di chip per coprire i costi di produzione.

Le GPU, inoltre, vengono utilizzate per creare bitcoin, ma poiché sono molto meno efficienti dal punto di vista energetico hanno perso terreno rispetto agli FPGA e agli ASIC personalizzati.


Se osservi l'algoritmo di hash Monero aka cryptonight, vedrai che un'implementazione FPGA è quasi impossibile a causa dell'elevata quantità di memoria necessaria per accedere in modo casuale (2 MB). Una CPU ha il vantaggio in questo caso.
lucas92,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.