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.