Quanto velocemente si esegue o si moltiplica a 64 bit su un FPGA?


8

Quando si utilizza un FPGA normale come Xilinx Spartan 3 o Virtex 5, quanti cicli richiede una moltiplicazione o divisione a 64 bit in virgola mobile a precisione doppia?

A quanto ho capito, l'FPGA non ha una FPU rigida ed è necessario crearne una utilizzando le librerie IEEE standard o altri materiali. Ciò significa che non verrà eseguito in un singolo ciclo, quindi sto cercando una stima approssimativa per confrontare le prestazioni di una CPU da 100 Mhz con un FPGA Spartan / Virtex da 100 MHz.

Sono principalmente interessato agli operatori in virgola mobile, ma se si ha esperienza con operazioni su numeri interi sarebbe apprezzato anche.


3
Innanzitutto, vale la pena chiarire la domanda: si parla di MPY / divide a 64 bit, il che implicherebbe moltiplicare / dividere gli interi a 64 bit - quindi si menziona FPU, che implica un virgola mobile a precisione doppia. I dettagli della risposta differiranno per ogni ...
Brian Drummond,

2
Per una moltiplicazione alla volta, il tempo è probabilmente comparabile o leggermente a favore della CPU. Ovviamente il vantaggio dell'FPGA è che puoi averne molti in parallelo.
pjc50,

Risposte:


12

Non l'ho fatto per FP a doppia precisione, ma valgono gli stessi principi per la precisione singola, per la quale ho implementato la divisione (come moltiplicare per reciproco).

Ciò che questi FPGA hanno, invece delle FPU, sono i blocchi DSP / moltiplicatori cablati, in grado di implementare una moltiplicazione 18 * 18 o (Virtex-5) 18 * 25 in un singolo ciclo. E i dispositivi più grandi ne hanno circa un migliaio, o addirittura 126 o 180 nella parte superiore delle famiglie Spartan-3 o Spartan-6.

Quindi puoi scomporre una grande moltiplicazione in operazioni più piccole usando molte di queste (2 per Virtex-5 che esegue una precisione singola) usando gli additivi DSP o il tessuto FPGA per sommare i prodotti parziali.

Riceverai una risposta in pochi cicli - 3 o 4 per SP, forse 5 per DP - a seconda di come componi l'albero dei sommatori (e talvolta, in cui gli strumenti synth insistono sull'aggiunta dei registri della pipeline!).

Tuttavia, questa è la latenza - poiché viene pipeline, il throughput sarà 1 risultato per ciclo di clock.

Per la divisione, ho approssimato un operatore reciproco usando una tabella di ricerca seguita da interpolazione quadratica. Ciò era più accurato rispetto alla precisione singola e, se lo volevo, si sarebbe esteso (con più hardware) a DP. In Spartan-6 ci vogliono 2 BlockRams e 4 DSP / moltiplicatori e un paio di centinaia di coppie LUT / FF.

La sua latenza è di 8 cicli, ma di nuovo il throughput è a ciclo singolo, quindi combinandolo con il moltiplicatore sopra riportato, si ottiene una divisione per ciclo di clock. Dovrebbe superare i 100 MHz in Spartan-3. In Spartan-6 la stima di sintesi è di 185 MHz, ma con 1,6 n su un singolo percorso di routing, quindi 200 MHz sono ragionevoli.

In Virtex-5 ha raggiunto i 200 MHz senza sforzo, così come il suo gemello a radice quadrata. Ho avuto un paio di studenti estivi che hanno tentato di reindirizzare la pipeline - con meno di 12 cicli di latenza si sono avvicinati a 400 MHz - 2,5 ns per una radice quadrata.

Ma ricordi che hai forse da cento a mille unità DSP? Ciò offre uno o due ordini di grandezza in più di potenza di elaborazione rispetto a una singola unità FP.


Grazie per la tua risposta, Brian, ma non è la tua intera risposta sul numero intero moltiplicare / dividere? Sono principalmente interessato al virgola mobile.
TheFlash,

2
No, come ho detto, precisione singola, che significa virgola mobile a 32 bit. Lo stesso vale per i doppi, ma l'utilizzo delle risorse è ovviamente più elevato.
Brian Drummond,

5

Quando si utilizza un FPGA normale come Xilinx Spartan 3 o Virtex 5, quanti cicli richiede una moltiplicazione o divisione a 64 bit in virgola mobile a precisione doppia?

La risposta è si!

Ma seriamente, è super difficile trovare un numero. Quando si progetta una logica complessa c'è sempre un compromesso tra cose diverse e nessuno approccio è buono per tutti i progetti. Proverò a coprire quelli grandi.

Con il design logico un compromesso è la dimensione rispetto alla velocità. Il semplice esempio di questo è supponiamo che un singolo moltiplicatore in virgola mobile sia troppo lento. Per accelerare tutto ciò che devi fare è aggiungere un secondo moltiplicatore. La dimensione della logica raddoppia, ma fa il numero di moltiplicazioni al secondo. Ma anche solo guardando un singolo moltiplicatore, ci sono diversi modi per moltiplicare i numeri; alcuni sono veloci e grandi, altri sono piccoli e lenti.

Un altro compromesso è la velocità di clock rispetto agli orologi per moltiplicare. Potrei progettare alcune logiche che farebbero moltiplicare un singolo punto mobile in un unico clock. Ma ciò richiederebbe anche che l'orologio sia più lento, forse fino a 10 MHz. Oppure, potrei progettarlo per funzionare con un clock da 100 MHz ma richiederebbe 10 clock per moltiplicare. La velocità complessiva è la stessa (una si moltiplica per 100 ns), ma una ha un clock più veloce.

Relativo al paragrafo precedente è il compromesso tra la velocità di clock e la latenza moltiplicata. Esiste una tecnica di progettazione logica chiamata pipelining. Fondamentalmente prendi un pezzo di logica e lo spezzi in stadi più piccoli, dove ogni stadio richiede un ciclo di clock per il completamento. Il vantaggio qui è che ogni fase può funzionare su una moltiplicazione mentre le altre fasi stanno lavorando su altre moltiplicazioni. Ad esempio, supponiamo che stiamo funzionando a 100 MHz con una pipeline a 10 stadi. Ciò significa che ci vorranno 10 orologi per ogni moltiplicazione, ma la logica funziona anche su 10 moltiplicazioni diverse contemporaneamente! La cosa interessante è che sta completando una moltiplicazione su ogni ciclo di clock. Quindi gli orologi effettivi per moltiplicazione sono 1, bastano solo 10 orologi per completare ciascuno di questi moltiplicazioni.

Quindi la risposta alla tua domanda, quanto velocemente un FPGA può fare una moltiplicazione, dipende davvero da te. FPGA è disponibile in diverse dimensioni e velocità e puoi dedicare tutta la logica necessaria per l'attività che desideri. Ma diamo un'occhiata a uno scenario specifico ...

Diciamo che vogliamo usare il più grande Spartan-3A e tutto ciò che ci interessa è moltiplicare in virgola mobile a 32 bit. Una moltiplicazione float a 32 bit richiede un moltiplicatore intero 24x24 e un sommatore a 8 bit. Ciò richiede quattro blocchi moltiplicatori dedicati e alcune sezioni generiche (troppo poche per preoccuparsene). L'XC3S1400A ha 32 moltiplicatori dedicati, quindi possiamo fare otto dei nostri moltiplicatori a virgola mobile in parallelo. Un'ipotesi molto approssimativa sulla velocità di clock sarebbe di circa 100 MHz. Siamo in grado di eseguire il pipeline completo di questo progetto in modo da poter completare quattro moltiplicazioni in virgola mobile a 32 bit per ciclo di clock, per una velocità effettiva di 800 milioni di moltiplicazioni in virgola mobile al secondo.

Una moltiplicazione a doppia precisione richiede 9 blocchi moltiplicatori dedicati per moltiplicazione in virgola mobile, quindi abbiamo potuto fare solo 3 moltiplicazioni in parallelo, risultando in una velocità di circa 300 milioni di moltiplicazioni in virgola mobile a 64 bit al secondo.

Per confronto, consideriamo la più recente serie Xilinx Virtex-7. I moltiplicatori dedicati sono più grandi, quindi abbiamo bisogno solo di 6 blocchi moltiplicatori dedicati per un moltiplicare in virgola mobile a 64 bit. Ci sono anche 1.920 moltiplicatori dedicati nella parte più grande, quindi possiamo fare 320 moltiplicazioni in virgola mobile a doppia precisione in parallelo. Quelle parti sono anche molto più veloci. Stimo che possiamo far funzionare queste parti a 200 MHz, dandoci una velocità totale di 64 miliardi di punti in virgola mobile a doppia precisione moltiplicati al secondo. Ovviamente, quei chip costano circa $ 10.000 ciascuno.

La divisione in virgola mobile è molto più difficile da eseguire rapidamente. La logica è molto più grande, specialmente in un FPGA, e funziona molto più lentamente. Lo stesso vale per la maggior parte delle CPU, in quanto le istruzioni di divisione (a virgola mobile e fissa) funzionano molto più lentamente. Se la velocità è importante, allora vuoi eliminare quante più divisioni possibili. Ad esempio, anziché dividere per 5, è necessario moltiplicare per 0,2. In effetti, su molti sistemi è più veloce calcolare un reciproco e fare un moltiplicare che semplicemente fare una divisione.

Gli stessi compromessi si applicano alla divisione come moltiplicazione: è solo che la divisione sarà sempre molto più lenta e molto più grande della moltiplicazione.


Un DSP TI o persino una GPU su un Rasberry Pi 3 risuccheranno il fumo magico di quello che una volta era un ALU su FPGA.
dhchdhd,

3

Almeno sul componente di divisione ALT_FP di Altera, la divisione a 64 bit a doppia precisione (mantissa a 52 bit) richiede 10, 24 o 61 cicli di clock (selezionabili). La precisione estesa singola può variare. Ad esempio divisione 43bit in cui l'esponente è 11 bit, mantissa è 26 bit che consente di selezionare tali opzioni di latenza di uscita del clock: 8, 18 o 35. Avviare ISE e verificare cosa si può avere su Xilinx.


1
Questi numeri sono latenza o velocità effettiva?
Brian Drummond,

Sono selezionabili cicli di clock a doppia precisione? Di quale fattore? Utilizzare più / meno blocchi? E la moltiplicazione?
TheFlash,

1
Non mi sono spostato insieme ai parametri del componente, ho appena avviato una finestra principale e copiato ciò che dice. Probabilmente devi leggere il documento e controllare quali altri parametri offre la gui del componente. Quindi, in sostanza, non posso rispondere a entrambe le domande ormai.
Socrate,

2

Non c'è motivo per cui non possa richiedere un singolo ciclo. Sarebbe probabilmente un ciclo piuttosto ampio e utilizzerà molte risorse ...


1

Ho implementazioni della doppia precisione, moltiplicare e dividere in virgola mobile. La moltiplicazione richiede 13 cicli di clock e la divisione prende 109 cicli di clock. Entrambi sono pipeline per un throughput del 100% (un risultato per clock) e per un funzionamento di circa 200 MHz su Xilinx V5. Non so quanti meno clock potresti ottenere a 100MHz, ma dividere per due sarebbe una scommessa sicura.

Ho anche implementazioni in virgola mobile a precisione singola che accettano 10 e 51 orologi nella stessa situazione.

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.