Ho sentito di persone che usano FPGA per migliorare le prestazioni di sistemi che fanno cose come lestrazione di monete, il commercio elettronico e il ripiegamento delle proteine.
Come può un FPGA competere con una CPU in termini di prestazioni quando la CPU è in genere almeno un ordine di grandezza più veloce (in termini di velocità di clock)?
Commenti
- LFPGA fa tutto in una volta.
Answer
CPU “sono dispositivi di elaborazione sequenziale. Suddividono un algoritmo in una sequenza di operazioni e le eseguono una alla volta.
Gli FPGA” sono (o possono essere configurati come) dispositivi di elaborazione parallela. Un intero algoritmo potrebbe essere eseguito in un singolo tick dellorologio o, nel peggiore dei casi, molto meno clock rispetto a un processore sequenziale. Uno dei costi per la maggiore complessità logica è tipicamente un limite inferiore al quale il dispositivo può essere sincronizzato.
Tenendo presente quanto sopra, gli FPGA possono sovraperformare le CPU che svolgono determinate attività perché possono fare lo stesso compito in meno battiti di clock, anche se a una frequenza di clock complessiva inferiore. I guadagni che possono essere ottenuti dipendono fortemente dallalgoritmo, ma almeno un ordine di grandezza non è atipico per qualcosa come un FFT.
Inoltre, poiché puoi costruire più unità di esecuzione parallela in un FPGA, se si dispone di un grande volume di dati che si desidera far passare attraverso lo stesso algoritmo, è possibile distribuire i dati tra le unità di esecuzione parallela e ottenere un throughput di ordini di grandezza superiore a quello che si può ottenere anche con una CPU multi-core. p>
Il prezzo da pagare per i vantaggi è il consumo di energia e $$$ “s.
Commenti
- +1; Tuttavia, FPGA non sono dinamiche come le CPU, motivo per cui le CPU di solito sono più adatte per i PC
- ” Il prezzo da pagare per i vantaggi è il consumo di energia e $$$ ‘ s. ” – Questo è spesso vero, ma puoi decisamente battere una macchina Intel Xeon multi-$ 1000 di fascia alta con un fascia bassa $ 50 Xilinx Spartan-6 per molti algoritmi. Ma ciò richiede in genere molto tempo di progettazione e potresti ritrovarti con un design molto personalizzato che funziona solo per unapplicazione ed è difficile da modificare. Quindi il compromesso non è solo potere e denaro, ma tempo di sviluppo dellalgoritmo, riusabilità e flessibilità. (Anche se puoi discutere il tempo == soldi.)
- markt, riguardo alla tua ultima frase, gli FPGA non sono ‘ t molto più bassi delle CPU? Esiste unampia gamma di dispositivi sia per CPU che per FPGA, ma se guardiamo a quelli utilizzati per cose come il mining di bitcoin, non sono ‘ t le CPU utilizzate per questi compiti molto più affamati di energia rispetto agli FPGA che verrebbero utilizzati?
- @David: Quando si parla di mining di Bitcoin, la metrica rilevante è il numero di hash per watt. Markt sta parlando del consumo energetico complessivo. Cioè, un dato FPGA può consumare 3 volte la potenza di una tipica CPU, ma essere molto più che 3 volte più veloce nel mining di Bitcoin; quindi per Bitcoin che ‘ vince.
- @Billy: il numero di hash per watt · secondo, non per watt.
Risposta
Markt ha quasi ragione, ma ho intenzione di inserire il mio 2 centesimi qui:
Immagina di averti detto che volevo scrivere un programma che invertisse lordine dei bit allinterno di un numero intero a 32 bit. Qualcosa del genere:
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 daccordo sul fatto che ci sarebbe un certo numero di operazioni coinvolte in questo, e probabilmente una sorta di ciclo. Ciò significa che nella CPU hai impiegato più di un ciclo per implementare questa operazione.
In un FPGA, puoi semplicemente collegarlo come una coppia di latch. Ottieni i tuoi dati in un registro, quindi li colleghi al registro diverso in ordine inverso di bit. Ciò significa che loperazione verrà completata in un singolo ciclo di clock nellFPGA. Pertanto, in un singolo ciclo, lFPGS ha completato unoperazione che ha richiesto alla tua CPU generica molte migliaia di cicli per essere completata! Inoltre, è possibile collegare probabilmente alcune centinaia di questi registri in parallelo. Quindi, se puoi passare a poche centinaia di numeri sullFPGA, in un singolo ciclo finirà quelle migliaia di operazioni centinaia di volte, il tutto in 1 ciclo di clock FPGA.
Ci sono molte cose che un la CPU per uso generale può fare, ma come limitazione, abbiamo impostato istruzioni semplici e generalizzate che devono necessariamente espandersi in elenchi di semplici istruzioni per completare alcune attività. Quindi potrei fare in modo che la CPU per uso generale abbia unistruzione come “ordine di bit inverso per il registro a 32 bit” e dare alla CPU la stessa capacità dellFPGA che abbiamo appena costruito, ma ci sono un numero infinito di queste possibili istruzioni utili, e quindi abbiamo mettere solo quelli che garantiscono il costo nelle popolari CPU.
FPGA, CPLD e ASIC ti danno accesso allhardware grezzo, che ti permette di definire operazioni folli come “decrittografa byte crittografati AES256 con chiave” o “decodifica frame di 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 delloperazione in milioni di righe di codice assembly generico. Questo ha anche il vantaggio di rendere lFPGA / ASIC a scopo fisso per molte di queste operazioni più efficiente dal punto di vista energetico perché non devono fare tanto lavoro estraneo!
Il parallelismo è laltra parte che contraddistingue sottolineato, e sebbene anche questo sia importante, la cosa principale è quando un FPGA parallelizza qualcosa che era già costoso nella CPU in termini di cicli necessari per eseguire loperazione. Una volta che si inizia a dire “Posso eseguire in 10 cicli FPGA a compito che richiede 100.000 cicli alla mia CPU e posso svolgere questo compito in parallelo 4 elementi alla volta, “puoi facilmente capire perché un FPGA potrebbe essere molto più veloce di una CPU!
Quindi perché non usiamo FPGA, CPLD e ASIC per tutto? Perché in generale è un intero chip che non fa altro che unoperazione. Ciò significa che sebbene sia possibile ottenere un processo per eseguire molti ordini di grandezza più velocemente nel proprio FPGA / ASIC, non è possibile modificarlo in seguito quando tale operazione non è più utile. Il motivo per cui non è possibile (generalmente) cambiare un FPGA una volta in un circuito è che il cablaggio per linterfaccia è fisso, e normalmente il circuito non include componenti che consentirebbero di riprogrammare lFPGA in una configurazione più utile. Ci sono alcuni ricercatori che stanno cercando di costruire moduli ibridi FPGA-CPU, dove cè una sezione della CPU che può essere ricablata / riprogrammata come un FPGA, permettendoti di “caricare” una sezione efficace della CPU, ma nessuna di queste sono mai arrivati sul mercato (per quanto ne so).
Commenti
- Per lesempio dellinversione di bit (e tutti gli altri bit operazioni di scambio / selezione) non ‘ t richiede 1 ciclo di clock, ne richiede 0. Nel tuo esempio, ci vuole 1 ciclo di clock per memorizzare i dati in un latch , che non è la stessa operazione. Richiede 1 ciclo di clock indipendentemente dal fatto che si invertano i bit o meno. Loperazione di inversione dei bit è di 0 cicli di clock; nessun overhead, solo un routing diverso. La differenza non è solo semantica, specialmente quando stai iniziando ad aggiungere le cose. Ad esempio, quanto tempo ci vuole per spostare una parola a 32 bit verso il basso di 3 bit, quindi scambiare ogni altro bocconcino, quindi invertirlo?
- ” FPGA-CP ibrido Modulo U ” – sono sul mercato da molto tempo (vedi xilinx.com/products/silicon-devices/ soc / zynq-7000 / index.htm per uno moderno di successo), ma anche senza un supporto speciale, la combinazione del software & HDL viene comunemente eseguita implementando una soft CPU allinterno lFPGA sul fabric.
- @wjl ‘ hai ragione sul fatto che tecnicamente non richiede cicli per eseguire loperazione stessa. Direi che il tuo esempio è solo semanticamente diverso, soprattutto perché eseguire queste tre operazioni si traduce logicamente in uno schema di bit fisso (ad esempio, inizio con b1b2b3b4 e finisco con b3b1b4b2). Questo era un po il mio punto in tutta la risposta. Stavo cercando di sottolineare che la descrizione di unoperazione come una serie di passaggi è spesso necessaria solo quando si dispone di un set di istruzioni fisso / disposizione del gate.
- @wjl: Il modo in cui david-gardner ha posto la domanda, lui sembra dire che ” CPU ” è equivalente a una CPU Intel o AMD x86 / x86_64 con clock elevato, pipeline e ottimizzata. Ci sono molte ” CPU ” ma nessuna di quelle progettate per stare in un FPGA può essere sincronizzata come un i7, né lo sono quasi altrettanto ottimizzati o capaci. Per quanto riguarda gli ibridi, intendevo più qualcosa del genere: newsroom.intel.com/docs/DOC-1512 che apparentemente esiste
- il Zynq non è davvero ‘ pessimo come processore (ARM Cortex-A9 – la stessa cosa che gira su tablet, ecc.), Ma sono daccordo che sarebbe molto più fantastico avere un FPGA integrato con x86_64 ad alta velocità. =)
Risposta
Tutte le altre risposte popolari presentate qui parlano di differenze letterali tra FPGA e CPU. Sottolineano la natura parallela dellFPGA rispetto alla natura sequenziale di una CPU o forniscono esempi del motivo per cui alcuni algoritmi potrebbero funzionare bene su un FPGA. Sono tutte buone e vere, ma suggerirei tuttavia che esiste una differenza più fondamentale tra CPU e FPGA.
Qual è il denominatore comune tra un FPGA e una CPU? È che sono entrambi costruiti sopra il silicio. E in alcuni casi letteralmente gli stessi processi di silicio.
La differenza fondamentale sono le astrazioni che accumuliamo su quel silicio. Non è possibile per un essere umano comprendere tutti i dettagli di un singolo design di CPU moderna, dal silicio al circuito integrato. Quindi, come parte del processo di progettazione, dividiamo quel problema complesso in problemi più piccoli gestibili che gli esseri umani possono comprendere.
Considera cosa serve per trasformare quel silicio in una CPU funzionante. Ecco una visione in qualche modo semplificata degli strati di astrazione necessari per questo obiettivo:
-
Per prima cosa abbiamo ingegneri che sanno come creare transistor dal silicio. Sanno come progettare minuscoli transistor che assorbono potenza e commutano alla velocità di 10 o anche 100 gigahertz e sanno come progettare transistor robusti in grado di pilotare segnali con potenza sufficiente per inviarli da un pacchetto IC e attraverso un PCB a un altro chip.
-
Poi abbiamo progettisti di logica digitale che sanno come mettere insieme quei transistor in librerie con centinaia di celle logiche differenti. Porte logiche, infradito, mux e sommatori, solo 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.
-
Poi abbiamo progettisti di CPU per progettare progetti di CPU di fascia alta riunendo queste unità funzionali in un sistema completo.
E non finisce qui. A questo punto abbiamo una CPU funzionante che esegue il codice assembly ma non è un linguaggio in cui la maggior parte dei programmatori scrive oggigiorno.
- Potremmo avere un compilatore C per compilare in assembly codice (probabilmente attraverso una rappresentazione intermedia)
- Potremmo aggiungere unaltra astrazione sopra C per ottenere un linguaggio orientato agli oggetti
- Potremmo persino scrivere una macchina virtuale sopra C o C ++ in modo che possiamo interpretare cose come il codice byte Java
E i livelli di astrazione possono continuare da lì. Il punto importante qui è che questi livelli di astrazione si combinano per produrre un sistema basato su CPU che scala in modo massiccio e costa una piccola frazione di un design personalizzato in silicio.
TUTTAVIA, il punto importante da sottolineare qui è che ogni astrazione comporta anche un costo in sé. Il progettista del transistor non costruisce il transistor perfetto per ogni caso duso. 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 ingressi e collega 2 ingressi inutilizzati che si traducono in risorse di silicio perse e potenza ridotta. E così sale la catena delle astrazioni. Ogni livello ci offre un modo per gestire la complessità, ma allo stesso tempo ci fa pagare un costo incrementale aggiuntivo in termini di silicio e potenza.
Ora confronta queste astrazioni con ciò che è necessario per un FPGA. In sostanza, le astrazioni FPGA si fermano al numero 2 nellelenco sopra. LFPGA consente agli sviluppatori di lavorare a livello di logica digitale. È un po più sofisticato di così 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 è che sono lontane poche astrazioni per FPGA che per CPU.
Quindi, Perché un FPGA può essere più veloce di una CPU? In sostanza è perché lFPGA utilizza molte meno astrazioni di 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 ottenere una determinata funzionalità, ma la ricompensa ottiene prestazioni più elevate.
Ma ovviamente cè un lato negativo anche per meno 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 sviluppare per loro. Ciò a sua volta significa che esistono molti più progetti di CPU e quindi abbiamo enormi vantaggi in termini di prezzo / scala / time-to-market dalle CPU.
Quindi il gioco è fatto. Gli FPGA hanno meno astrazioni e quindi possono essere più veloci ed 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 alla velocità e alla potenza nel commercio per questi vantaggi.
Commenti
- Inoltre, 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 (dopotutto, ‘ è tutto solo silicio, elettronica e matematica). Quindi ‘ non riguarda solo le astrazioni, ma ‘ la complessità. Le CPU ‘ sono dispositivi complessi costituiti da molti tipi diversi di dispositivi elettrici mentre un FPGA è costituito da pochi. Una CPU è un fucile mentre un FPGA è un fucile.
Risposta
Mentre le altre risposte sono tutte corrette , nessuno di loro affronta ancora lesempio di mining di bitcoin dalla tua domanda, che è davvero un buon esempio. Il mining di bitcoin comporta il calcolo ripetuto di una funzione hash crittografica, SHA-256 del risultato di un altro calcolo SHA-256, di dati in cui cambia solo un singolo numero intero a 32 bit, finché lhash risultante non ha determinate proprietà. Ogni SHA-256 consiste di 64 ripetizioni dello stesso algoritmo che coinvolgono aggiunte a 32 bit, passaggi di bit e alcune altre operazioni di manipolazione dei bit.
Se si programma questo ciclo su una CPU a 32 bit (o più) , troverai il suo set di istruzioni molto adatto per il compito — SHA-256 è stato progettato per funzionare in modo efficiente su CPU. Tuttavia utilizzerai solo forse il 2% dellarea di silicio di una CPU moderna, con funzionalità ad alta intensità di area come caching, moltiplicazione, divisione, operazioni in virgola mobile, branching e brach predizione, ecc., O non utilizzate affatto o incapaci di farlo fornire un significativo aumento delle prestazioni per questa particolare attività.
In hardware configurabile come un FPGA, si implementa semplicemente solo quel 2% e si ottimizza ulteriormente dimenticando tutto sullesecuzione del codice, piuttosto progettando porte per calcolare direttamente ciascuno dei quelle sottofunzioni spesso ripetute. Pipeline in modo tale che ciascuna di esse passi un risultato al successivo ogni ciclo di clock, e ripetute 128 volte (e con una logica aggiuntiva speciale in cui ogni SHA-256 inizia e finisce), si finisce per ottenere un risultato ogni ciclo di clock (per forse 100 milioni di hash al secondo su un FPGA pubblicizzato per supportare 300 MHz con una logica più semplice di questa) mentre su una CPU moderna, potresti aspettarti un risultato ogni poche migliaia di cicli di clock per core, diciamo 10 milioni di hash al secondo ond su una CPU multi-core multi-GHz.
Se questo particolare esempio ti interessa, potresti dare unocchiata al mio correlato rispondi sugli interni dei minatori ASIC su bitcoin.stackexchange, poiché molti minatori FPGA lavorano allo stesso modo utilizzando hardware configurabile anziché personalizzato. Solo per completezza “: ci sono altre possibilità, come limitare o evitare il pipelining che ho descritto a favore di una parallelizzazione più banale utilizzando più hash SHA-256 indipendenti. A seconda dei vincoli dati dagli interni del tuo FPGA e dalla sua dimensione totale , che può anche fornire prestazioni migliori anche se sarebbe meno efficiente in termini di numero di gate e overhead di routing se avessi la perfetta libertà nella progettazione dellintero chip, non solo di una configurazione FPGA.
Commenti
- Questo ‘ è un ottimo punto di vista sullutilizzo del silicio.
- Ma forse (involontariamente!) fuorviante, considerando che un FPGA è costituito da celle alquanto complesse con molti gate fisici, di cui unapplicazione tipica utilizza di nuovo solo una frazione, consentendo ai loro produttori di pubblicizzare conteggi di gate equivalenti nel tentativo di dirti quanto potrebbe valere tutto ciò in un ” tipico ” applicazione …
Risposta
Le risposte precedenti, sebbene corrette, mancano il punto perché gli FPGA (e gli ASIC personalizzati) sono particolarmente utili per i calcoli bitcoin.
Il vero vantaggio è che una gran parte dei calcoli SHA-256 sono operazioni logiche (ad esempio, spostamenti di bit) che possono essere eseguite in cablaggio. Quando vengono eseguiti in questo modo, richiedono 0 cicli di clock.
Un altro vantaggio importante è che gli FPGA sono molto più efficienti dal punto di vista energetico (cioè MIPS per Watt) rispetto alle CPU, quindi la quantità di energia richiesta per i calcoli è molto Di meno. Questo è importante perché il costo dellestrazione di un bitcoin dipende dalla quantità di elettricità utilizzata per produrlo.
I chip ASIC sono più efficienti dal punto di vista energetico degli 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 per creare un ASIC personalizzato è molto alto, quindi dovresti vendere un bel po di chip per coprire i costi di produzione.
Le GPU vengono utilizzate anche per creare bitcoin, ma poiché lo sono molto meno efficienti dal punto di vista energetico hanno perso terreno rispetto agli FPGA e agli ASIC personalizzati.
Commenti
- Se guardi lalgoritmo di hashing Monero noto anche come cryptonight, vedrai che unimplementazione FPGA è quasi impossibile a causa dellelevata quantità di memoria necessaria per accedere in modo casuale (2 MB). Una CPU ha il vantaggio in questo caso.
- @ lucas92 non puoi integrare la RAM in FPGA per contenere la quantità di memoria necessaria?
- Probabilmente hai vinto ‘ t ha abbastanza elementi logici nellFPGA per esso.