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.