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

Wie viele Zyklen dauert bei Verwendung eines regulären FPGA wie Xilinx Spartan 3 oder Virtex 5 eine 64-Bit-Multiplikation oder -Division mit doppelter Genauigkeit für die Ausführung?

Soweit ich weiß, hat das FPGA keine harte 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 Integer-Operationen haben, wäre das auch zu schätzen.

Zunächst lohnt es sich, die Frage zu klären: Sie sprechen von 64-Bit-MPY/Division, was eine 64-Bit-Ganzzahl-Multiplikation/Division implizieren würde - dann erwähnen Sie FPU, was Gleitkommazahlen mit doppelter Genauigkeit impliziert. Details der Antwort werden für jeden unterschiedlich sein ...
Für jeweils eine Multiplikation ist die Zeit wahrscheinlich vergleichbar oder leicht zugunsten der CPU. Offensichtlich ist der Vorteil des FPGA, dass Sie viele davon parallel haben können.

Antworten (5)

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

Was diese FPGAs anstelle von FPUs haben, sind fest verdrahtete DSP/Multiplier-Blöcke, die in der Lage sind, eine 18*18- oder (Virtex-5) 18*25-Multiplikation in einem einzigen Zyklus zu implementieren. 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 Virtex-5 mit einfacher Genauigkeit), indem Sie die Addierer des DSP oder das FPGA-Fabric verwenden, um die Teilprodukte zu summieren.

Sie erhalten eine Antwort in wenigen Zyklen - 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 unter Verwendung einer Nachschlagetabelle angenähert, gefolgt von einer quadratischen Interpolation. Dies war genau bis besser als Single-Precision und würde sich (mit mehr Hardware) auf DP erstrecken, wenn ich wollte. In Spartan-6 sind 2 BlockRams und 4 DSP/Multiplikatoren und ein paar hundert LUT/FF-Paare erforderlich.

Seine 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. Es sollte 100 MHz in Spartan-3 überschreiten. In Spartan-6 beträgt die Syntheseschätzung 185 MHz, aber das sind 1,6 ns auf einem einzelnen Routing-Pfad, sodass 200 MHz im Rahmen des Zumutbaren liegen.

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

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

Danke für deine Antwort, Brian, aber ist deine ganze Antwort nicht ganzzahlig multiplizieren / dividieren? Ich interessiere mich hauptsächlich für Fließkommazahlen.
Nein, wie gesagt, Single Precision, also 32-Bit-Gleitkommazahlen. Die gleichen Prinzipien gelten für Doubles, aber der Ressourcenverbrauch ist offensichtlich höher.

Wie viele Zyklen dauert bei Verwendung eines regulären FPGA wie Xilinx Spartan 3 oder Virtex 5 eine 64-Bit-Multiplikation oder -Division mit doppelter Genauigkeit für die Ausführung?

Die Antwort ist ja!

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

Beim Logikdesign ist ein Kompromiss zwischen Größe und Geschwindigkeit. Nehmen wir als einfaches Beispiel an, dass ein einzelner Gleitkomma-Multiplikator zu langsam ist. Um es zu beschleunigen, müssen Sie lediglich einen zweiten Multiplikator hinzufügen. Ihre Logikgröß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 Taktgeschwindigkeit vs. Takte pro Multiplikation. Ich könnte eine Logik entwerfen, die eine einzelne Gleitkommamultiplikation in einer Uhr ausführen würde. Aber das würde auch erfordern, dass der Takt langsamer ist – vielleicht so langsam wie 10 MHz. Oder ich könnte es so entwerfen, dass es mit einem 100-MHz-Takt arbeitet, aber es würde 10 Takte pro Multiplikation erfordern. Die Gesamtgeschwindigkeit ist die gleiche (eine Multiplikation in 100 ns), aber man hat einen schnelleren Takt.

Im Zusammenhang mit dem vorherigen Absatz steht der Kompromiss zwischen Taktgeschwindigkeit und mehrfacher Latenz. Es gibt eine Technik im Logikdesign, die als Pipelining bezeichnet wird. Im Grunde nehmen Sie einen Teil der Logik und teilen ihn in kleinere Stufen auf, wobei jede Stufe einen Taktzyklus benötigt, um abgeschlossen zu werden. Der Vorteil hierbei ist, dass jede Stufe an einem Multiplikator arbeiten kann, während die anderen Stufen an anderen Multiplikatoren arbeiten. Nehmen wir zum Beispiel an, dass wir bei 100 MHz mit einer 10-Stufen-Pipeline laufen. Dies bedeutet, dass für jede Multiplikation 10 Takte benötigt werden, aber die Logik arbeitet auch an 10 verschiedenen Multiplikationen gleichzeitig! Das Coole ist, dass es bei jedem Taktzyklus eine Multiplikation durchführt. Die effektiven Takte pro Multiplikation sind also 1, es dauert nur 10 Takte, bis jede dieser Multiplikationen abgeschlossen ist.

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

Nehmen wir an, wir wollen den größten Spartan-3A verwenden und alles, was uns interessiert, sind 32-Bit-Gleitkomma-Multiplikationen. Eine 32-Bit-Float-Multiplikation erfordert einen 24x24-Integer-Multiplizierer und einen 8-Bit-Addierer. Dies erfordert vier der dedizierten Multiplikatorblöcke und einige generische Slices (zu wenige, um sich darum zu kümmern). Der XC3S1400A hat 32 dedizierte Multiplikatoren, sodass wir acht unserer Fließkomma-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 leiten, sodass wir vier 32-Bit-Gleitkomma-Multiplikationen pro Taktzyklus durchführen können, was einer effektiven Geschwindigkeit von 800 Millionen Gleitkomma-Multiplikationen pro Sekunde entspricht.

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

Betrachten wir zum Vergleich die neuere Virtex-7-Serie von Xilinx. Die dedizierten Multiplikatoren darin 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 – also 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 gibt. Natürlich kosten diese Chips jeweils etwa 10.000 US-Dollar.

Gleitkomma-Division ist viel schwieriger schnell durchzuführen. Die Logik ist viel größer, insbesondere in einem FPGA, und sie läuft viel langsamer. Dasselbe gilt für die meisten CPUs, da die Divisionsbefehle (Gleitkomma und Festkomma) viel langsamer ausgeführt werden. Wenn Geschwindigkeit wichtig ist, sollten Sie so viele Trennungen wie möglich eliminieren. Anstatt durch 5 zu dividieren, sollten Sie beispielsweise mit 0,2 multiplizieren. Tatsächlich ist es auf vielen Systemen schneller, einen Kehrwert zu berechnen und dann zu multiplizieren, als nur zu dividieren.

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

Ein TI DSP oder sogar eine GPU auf einem Rasberry Pi 3 wird den magischen Rauch aus dem saugen, was einst eine ALU auf FPGA war.

Zumindest bei der Altera ALT_FP-Divisionskomponente dauert die 64-Bit-Division mit doppelter Genauigkeit (52-Bit-Mantisse) 10, 24 oder 61 Taktzyklen (wählbar). Einzelne erweiterte Genauigkeit kann variieren. ZB 43-Bit-Division, bei der der Exponent 11 Bit und die Mantisse 26 Bit beträgt, ermöglicht die Auswahl solcher Latenzoptionen für die Taktausgabe: 8, 18 oder 35. Starten Sie ISE und prüfen Sie, was Sie auf Xilinx haben können.

Sind diese Zahlen Latenz oder Durchsatz?
Taktzyklen mit doppelter Genauigkeit wählbar? Um welchen Faktor? Um mehr/weniger Blöcke zu verwenden? Und was ist mit der Multiplikation?
Ich habe mich nicht mit den Komponentenparametern bewegt, sondern nur ein Hauptfenster gestartet und kopiert, was es sagt. Wahrscheinlich müssen Sie die Dokumentation lesen und prüfen, welche anderen Parameter die Komponenten-GUI bietet. Also im Grunde kann ich jetzt nicht auf beide Fragen antworten.

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

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

Ich habe auch Gleitkommaimplementierungen mit einfacher Genauigkeit, die in derselben Situation 10 und 51 Takte benötigen.