Wie schnell wird eine 64-Bit-Multiplikation oder -Division auf einem FPGA ausgeführt?


8

Wie viele Zyklen benötigt eine 64-Bit-Gleitkomma-Multiplikation oder -Division mit doppelter Genauigkeit, wenn ein reguläres FPGA wie Xilinx Spartan 3 oder Virtex 5 verwendet wird?

Soweit ich weiß, verfügt das FPGA nicht über eine feste FPU, und Sie müssen eine mit den Standard-IEEE-Bibliotheken oder anderen Materialien erstellen. Dies bedeutet, dass es nicht in einem einzigen Zyklus ausgeführt wird. Daher suche ich nach einer groben Schätzung, um die Leistung einer 100-MHz-CPU mit einem 100-MHz-Spartan / Virtex-FPGA zu vergleichen.

Ich interessiere mich hauptsächlich für Gleitkommaoperatoren, aber wenn Sie Erfahrung mit ganzzahligen Operationen haben, wäre dies ebenfalls wünschenswert.


3
Zunächst lohnt es sich, die Frage zu klären: Sie sprechen von 64-Bit-MPY / Divide, was eine 64-Bit-Ganzzahlmultiplikation / -division implizieren würde. Dann erwähnen Sie FPU, was Gleitkomma mit doppelter Genauigkeit impliziert. Details der Antwort unterscheiden sich für jeden ...
Brian Drummond

2
Für jeweils eine Multiplikation ist die Zeit wahrscheinlich vergleichbar oder geringfügig zugunsten der CPU. Offensichtlich ist der Vorteil des FPGA, dass Sie viele davon parallel haben können.
pjc50

Antworten:


12

Ich habe dies nicht für FP mit doppelter Genauigkeit getan, aber es gelten die gleichen Prinzipien wie für FP mit einfacher Genauigkeit, für die ich Division (als Multiplikation mit reziproken) implementiert habe.

Diese FPGAs haben anstelle von FPUs festverdrahtete DSP / Multiplikator-Blöcke, die eine 18 * 18- oder (Virtex-5) 18 * 25-Multiplikation in einem einzigen Zyklus implementieren können. Und die größeren Geräte haben ungefähr tausend davon oder sogar 126 oder 180 am oberen Ende der Spartan-3- oder Spartan-6-Familien.

Sie können also eine große Multiplikation in kleinere Operationen zerlegen, indem Sie mehrere davon verwenden (2 für den Virtex-5 mit einfacher Genauigkeit), indem Sie die Addierer oder die FPGA-Struktur des DSP verwenden, um die Teilprodukte zu summieren.

Sie erhalten in wenigen Zyklen eine Antwort - 3 oder 4 für SP, vielleicht 5 für DP - je nachdem, wie Sie den Addiererbaum zusammenstellen (und manchmal, wo die Synth-Tools darauf bestehen, Pipeline-Register hinzuzufügen!).

Dies ist jedoch die Latenz - da es sich um eine Pipeline handelt, beträgt der Durchsatz 1 Ergebnis pro Taktzyklus.

Für die Division habe ich einen reziproken Operator mithilfe einer Nachschlagetabelle gefolgt von einer quadratischen Interpolation angenähert. Dies war genauer als mit einfacher Genauigkeit und würde (mit mehr Hardware) auf DP ausgedehnt, wenn ich wollte. In Spartan-6 werden 2 BlockRams und 4 DSP / Multiplikatoren sowie einige hundert LUT / FF-Paare benötigt.

Die Latenz beträgt 8 Zyklen, aber auch hier ist der Durchsatz ein Zyklus. Wenn Sie ihn also mit dem obigen Multiplikator kombinieren, erhalten Sie eine Division pro Taktzyklus. In Spartan-3 sollte es 100 MHz überschreiten. In Spartan-6 beträgt die Syntheseschätzung 185 MHz, dies entspricht jedoch 1,6 ns auf einem einzelnen Routing-Pfad, sodass 200 MHz in Ordnung sind.

In Virtex-5 erreichte es mühelos 200 MHz, ebenso wie sein Quadratwurzel-Zwilling. Ich hatte ein paar Sommerstudenten, die versuchten, es neu zu leiten - mit einer Latenz von weniger als 12 Zyklen erreichten sie fast 400 MHz - 2,5 ns für eine Quadratwurzel.

Aber erinnern Sie sich, dass Sie vielleicht hundert bis tausend DSP-Einheiten haben? Das gibt Ihnen ein oder zwei Größenordnungen mehr Rechenleistung als eine einzelne FP-Einheit.


Danke für deine Antwort, Brian, aber ist nicht deine ganze Antwort über die Multiplikation / Division von ganzen Zahlen? Ich interessiere mich hauptsächlich für Gleitkomma.
Robinicks

2
Nein, wie gesagt, einfache Genauigkeit, dh 32-Bit-Gleitkomma. Die gleichen Prinzipien gelten für Doppel, aber der Ressourcenverbrauch ist offensichtlich höher.
Brian Drummond

5

Wie viele Zyklen benötigt eine 64-Bit-Gleitkomma-Multiplikation oder -Division mit doppelter Genauigkeit, wenn ein reguläres FPGA wie Xilinx Spartan 3 oder Virtex 5 verwendet wird?

Die Antwort ist ja!

Aber im Ernst, es ist super schwer, eine Nummer zu finden. Beim Entwerfen einer komplexen Logik gibt es immer einen Kompromiss zwischen verschiedenen Dingen, und kein Ansatz ist für alle Entwürfe gut. Ich werde versuchen, die großen zu decken.

Beim logischen Design besteht ein Kompromiss zwischen Größe und Geschwindigkeit. Das einfache Beispiel hierfür ist, dass ein einzelner Gleitkomma-Multiplikator zu langsam ist. Um dies zu beschleunigen, müssen Sie lediglich einen zweiten Multiplikator hinzufügen. Ihre logische Größe verdoppelt sich, aber die Anzahl der Multiplikationen pro Sekunde. Aber selbst wenn man nur einen einzelnen Multiplikator betrachtet, gibt es verschiedene Möglichkeiten, Zahlen zu multiplizieren. Einige sind schnell und groß, andere sind klein und langsam.

Ein weiterer Kompromiss ist die Taktrate gegenüber den Takten pro Multiplikation. Ich könnte eine Logik entwerfen, die eine einzelne Gleitkomma-Multiplikation in einem Takt ausführt. Dazu müsste der Takt aber auch langsamer sein - vielleicht so langsam wie 10 MHz. Oder ich könnte es so entwerfen, dass es mit einem 100-MHz-Takt funktioniert, aber es würde 10 Takte pro Multiplikation erfordern. Die Gesamtgeschwindigkeit ist gleich (man multipliziert in 100 ns), aber man hat einen schnelleren Takt.

Bezogen auf den vorherigen Absatz ist der Kompromiss zwischen Taktrate und Multiplikationslatenz. Im Logikdesign gibt es eine Technik, die Pipelining genannt wird. Grundsätzlich nehmen Sie einen Teil der Logik und teilen ihn in kleinere Stufen auf, wobei jede Stufe einen Taktzyklus benötigt, um abzuschließen. Der Vorteil hierbei ist, dass jede Stufe an einer Multiplikation arbeiten kann, während die anderen Stufen an anderen Multiplikationen arbeiten. Nehmen wir zum Beispiel an, wir arbeiten mit 100 MHz und einer 10-stufigen Pipeline. Dies bedeutet, dass für jede Multiplikation 10 Takte benötigt werden, die Logik jedoch auch gleichzeitig an 10 verschiedenen Multiplikationen arbeitet! Das Coole ist, dass es bei jedem Taktzyklus eine Multiplikation durchführt. Die effektive Uhr pro Multiplikation ist also 1, es dauert nur 10 Uhren, bis jede dieser Multiplikationen abgeschlossen ist.

Die Antwort auf Ihre Frage, wie schnell ein FPGA eine Multiplikation durchführen kann, liegt also ganz bei Ihnen. FPGAs gibt es in verschiedenen Größen und Geschwindigkeiten, und Sie können so viel Logik für die jeweilige Aufgabe verwenden, wie Sie möchten. Aber schauen wir uns ein bestimmtes Szenario an ...

Nehmen wir an, wir möchten den größten Spartan-3A verwenden und kümmern uns nur um 32-Bit-Gleitkomma-Multiplikationen. Eine 32-Bit-Float-Multiplikation erfordert einen 24x24-Integer-Multiplikator und einen 8-Bit-Addierer. Dies erfordert vier der dedizierten Multiplikatorblöcke und einige generische Slices (zu wenig, um sich darum zu kümmern). Der XC3S1400A verfügt über 32 dedizierte Multiplikatoren, sodass wir acht unserer Gleitkomma-Multiplikatoren parallel ausführen können. Eine sehr grobe Schätzung der Taktrate wäre etwa 100 MHz. Wir können dieses Design vollständig Pipeline-fähig machen, sodass wir vier 32-Bit-Gleitkomma-Multiplikationen pro Taktzyklus für eine effektive Geschwindigkeit von 800 Millionen Gleitkomma-Multiplikationen pro Sekunde ausführen können.

Eine Multiplikation mit doppelter Genauigkeit erfordert 9 dedizierte Multiplikatorblöcke pro Gleitkomma-Multiplikation, sodass wir nur 3 Multiplikationen parallel ausführen können - was zu einer Geschwindigkeit von etwa 300 Millionen 64-Bit-Gleitkomma-Multiplikationen pro Sekunde führt.

Betrachten wir zum Vergleich die neuere Xilinx Virtex-7-Serie. Die dedizierten Multiplikatoren sind größer, sodass wir nur 6 dedizierte Multiplikatorblöcke für eine 64-Bit-Gleitkomma-Multiplikation benötigen. Es gibt auch 1.920 dedizierte Multiplikatoren im größten Teil - so können wir 320 Gleitkomma-Multiplikationen mit doppelter Genauigkeit parallel durchführen. Diese Teile sind auch viel schneller. Ich schätze, dass wir diese Teile mit 200 MHz betreiben können, was uns eine Gesamtgeschwindigkeit von 64 Milliarden Gleitkomma-Multiplikationen mit doppelter Genauigkeit pro Sekunde ergibt. Natürlich kosten diese Chips jeweils etwa 10.000 US-Dollar.

Die Gleitkommadivision ist viel schwieriger schnell durchzuführen. Die Logik ist viel größer, insbesondere in einem FPGA, und sie läuft viel langsamer. Gleiches gilt für die meisten CPUs, da die Teilungsbefehle (Gleitkomma- und Festkomma) viel langsamer laufen. Wenn Geschwindigkeit wichtig ist, möchten Sie so viele Teilungen wie möglich beseitigen. Anstatt beispielsweise durch 5 zu teilen, sollten Sie mit 0,2 multiplizieren. Tatsächlich ist es auf vielen Systemen schneller, einen Kehrwert zu berechnen und eine Multiplikation durchzuführen, als nur eine Division durchzuführen.

Die gleichen Kompromisse gelten für die Division als Multiplikation - es ist nur so, dass die Division immer viel langsamer und viel größer als die Multiplikation sein wird.


Ein TI-DSP oder sogar eine GPU auf einem Rasberry Pi 3 saugt den magischen Rauch aus einer ehemaligen ALU auf FPGA.
Dhchdhd

3

Zumindest bei der Altera ALT_FP-Teilungskomponente dauert die 64-Bit-Teilung mit doppelter Genauigkeit (52-Bit-Mantisse) 10, 24 oder 61 Taktzyklen (wählbar). Einzelne erweiterte Präzision kann variieren. Beispiel: 43-Bit-Teilung, bei der der Exponent 11 Bit und die Mantisse 26 Bit beträgt, können solche Latenzoptionen für die Taktausgabe ausgewählt werden: 8, 18 oder 35. Starten Sie ISE und prüfen Sie, was Sie auf Xilinx haben können.


1
Sind diese Zahlen Latenz oder Durchsatz?
Brian Drummond

Taktzyklen mit doppelter Genauigkeit sind wählbar? Um welchen Faktor? Mehr / weniger Blöcke verwenden? Und was ist mit Multiplikation?
Robinicks

1
Ich habe mich nicht mit den Komponentenparametern bewegt, sondern nur ein Hauptfenster gestartet und kopiert, was darin steht. Möglicherweise müssen Sie das Dokument lesen und überprüfen, welche anderen Parameter die Komponenten-GUI bietet. Grundsätzlich kann ich beide Fragen noch nicht beantworten.
Sokrates

2

Es gibt keinen Grund, warum es keinen einzigen Zyklus dauern kann. Es wäre jedoch wahrscheinlich ein ziemlich großer Zyklus und würde viele Ressourcen verbrauchen ...


1

Ich habe Implementierungen von doppelter Genauigkeit, Gleitkomma-Multiplikation und Division. Die Multiplikation dauert 13 Taktzyklen und die Division dauert 109 Taktzyklen. Beide sind für 100% Durchsatz (ein Ergebnis pro Takt) und einen Betrieb mit etwa 200 MHz auf einem Xilinx V5 ausgelegt. Ich weiß nicht, wie viel weniger Uhren Sie bei 100 MHz bekommen könnten, aber durch zwei zu teilen wäre eine sichere Sache.

Ich habe auch Gleitkommaimplementierungen mit einfacher Genauigkeit, die unter der gleichen Situation 10 und 51 Takte benötigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.