Wie kann ein FPGA eine CPU übertreffen?


55

Ich höre von Leuten, die FPGAs verwenden, um die Leistung von Systemen zu verbessern, die Bit-Coin-Mining, elektronischen Handel und Proteinfaltung betreiben.

Wie kann ein FPGA bei der Leistung mit einer CPU konkurrieren, wenn die CPU normalerweise mindestens eine Größenordnung schneller läuft (in Bezug auf die Taktrate)?


13
Das FPGA macht alles auf einmal.
Ignacio Vazquez-Abrams

Antworten:


48

CPUs sind sequentielle Verarbeitungsgeräte. Sie teilen einen Algorithmus in eine Folge von Operationen auf und führen sie einzeln aus.

FPGAs sind (oder können als) Parallelverarbeitungsgeräte konfiguriert werden. Ein gesamter Algorithmus kann in einem Takt ausgeführt werden, oder im schlimmsten Fall in weitaus weniger Takten, als ein sequentieller Prozessor benötigt. Eine der Kosten für die erhöhte Logikkomplexität ist typischerweise eine Untergrenze, bei der das Gerät getaktet werden kann.

In Anbetracht dessen können FPGAs bestimmte Aufgaben der CPU übertreffen, da sie die gleiche Aufgabe mit weniger Takten ausführen können, wenn auch mit einer niedrigeren Gesamttaktrate. Die erzielbaren Gewinne hängen stark vom Algorithmus ab, aber zumindest eine Größenordnung ist für so etwas wie eine FFT nicht untypisch.

Da Sie mehrere parallele Ausführungseinheiten in ein FPGA einbauen können, können Sie bei einem großen Datenvolumen, das denselben Algorithmus durchlaufen soll, die Daten auf die parallelen Ausführungseinheiten verteilen und einen um mehrere Größenordnungen höheren Durchsatz erzielen als mit einer Multi-Core-CPU erreicht werden kann.

Der Preis, den Sie für die Vorteile zahlen, ist der Stromverbrauch und $$$.


2
+1; FPGAs sind jedoch nicht so dynamisch wie CPUs, weshalb CPUs in der Regel besser für PCs geeignet sind
Nick Williams

17
"Der Preis, den Sie für die Vorteile zahlen, ist der Stromverbrauch und die Einsparungen." - Dies ist häufig der Fall, aber Sie können einen High-End-Multi-1000-Dollar-Intel Xeon-Rechner mit einem Low-End-50-Dollar-Xilinx Spartan-6 für viele Algorithmen klar schlagen. In der Regel nimmt dies jedoch viel Zeit in Anspruch und es kann vorkommen, dass Sie ein sehr individuelles Design erhalten, das nur für eine Anwendung funktioniert und nur schwer zu ändern ist. Der Kompromiss ist also nicht nur Leistung und Geld, sondern auch Zeit, Wiederverwendbarkeit und Flexibilität bei der Algorithmusentwicklung. (Obwohl Sie Zeit == Geld streiten können.)
wjl

markt, über Ihren letzten Satz, sind FPGAs nicht viel leistungsärmer als CPUs? Es gibt eine breite Palette von Geräten sowohl für CPUs als auch für FPGAs, aber wenn wir uns die Geräte ansehen, die für Dinge wie Bit-Coin-Mining verwendet werden, sind die für diese Aufgaben verwendeten CPUs nicht viel leistungshungriger als die FPGAs benutzt?
David Gardner

4
@ David: Wenn es um Bitcoin-Mining geht, ist die relevante Metrik die Anzahl der Hashes pro Watt. Markt spricht über den Gesamtstromverbrauch. Das heißt, ein gegebenes FPGA verbraucht möglicherweise das Dreifache der Leistung einer typischen CPU, ist jedoch beim Bitcoin-Mining um mehr als das Dreifache schneller. Für Bitcoin ist das also ein Gewinn.
Billy ONeal

2
@Billy: Die Anzahl der Hashes pro Watt · Sekunde, nicht pro Watt.
Paŭlo Ebermann

34

Markt hat dies größtenteils richtig, aber ich werde hier meine 2 Cent einwerfen:

Stellen Sie sich vor, ich hätte Ihnen gesagt, dass ich ein Programm schreiben möchte, das die Reihenfolge der Bits innerhalb einer 32-Bit-Ganzzahl umkehrt. Etwas wie das:

int reverseBits(int input) {
    output = 0;
    for(int i = 0;i < 32;i++) {
        // Check if the lowest bit is set
        if(input & 1 != 0) {
            output = output | 1; // set the lowest bit to match in the output!
        }

        input = input >> 1;
        output = output << 1;
    }
    return output;
}

Jetzt ist meine Implementierung nicht elegant, aber ich bin sicher, dass Sie damit einverstanden sind, dass es eine Reihe von Operationen geben wird, und wahrscheinlich eine Art Schleife. Dies bedeutet, dass Sie in der CPU mehr als einen Zyklus für die Implementierung dieser Operation aufgewendet haben.

In einem FPGA können Sie dies einfach als ein Paar von Verriegelungen verkabeln. Sie bringen Ihre Daten in ein Register und verbinden sie dann in umgekehrter Bit-Reihenfolge mit dem anderen Register. Dies bedeutet, dass der Vorgang in einem einzigen Taktzyklus im FPGA abgeschlossen wird. Somit hat der FPGS in einem einzigen Zyklus einen Vorgang abgeschlossen, für den Ihre Allzweck-CPU viele tausend Zyklen benötigt hat! Außerdem können Sie wahrscheinlich einige hundert dieser Register parallel verdrahten. Wenn Sie also in wenigen hundert Schritten auf das FPGA zugreifen können, werden diese Tausenden von Vorgängen in einem einzigen Zyklus hunderte Male abgeschlossen, und das alles in einem FPGA-Taktzyklus.

Es gibt viele Dinge, die eine Allzweck-CPU tun kann, aber als Einschränkung haben wir verallgemeinerte und einfache Anweisungen eingerichtet, die notwendigerweise zu Listen einfacher Anweisungen erweitert werden müssen, um einige Aufgaben zu erledigen. So könnte ich der Allzweck-CPU einen Befehl wie "Reverse Bit Order for 32 Bit Register" geben und der CPU die gleiche Fähigkeit wie dem gerade gebauten FPGA verleihen, aber es gibt unendlich viele solcher möglichen nützlichen Befehle, und so haben wir setzen Sie nur die ein, die die Kosten in den populären CPUs rechtfertigen.

Mit FPGAs, CPLDs und ASICs haben Sie Zugriff auf die unformatierte Hardware, mit der Sie verrückte Vorgänge wie "AES256-verschlüsselte Bytes mit Schlüssel entschlüsseln" oder "Frame von h.264-Video entschlüsseln" definieren können. Diese haben Latenzen von mehr als einem Taktzyklus in einem FPGA, aber sie können auf viel effizientere Weise implementiert werden, als wenn die Operation in Millionen Zeilen Allzweck-Assembler-Code geschrieben wird. Dies hat auch den Vorteil, dass der FPGA / ASIC mit festem Verwendungszweck für viele dieser Vorgänge energieeffizienter wird, da sie nicht so viel Fremdarbeit leisten müssen!

Parallelität ist der andere Teil, auf den markt hingewiesen hat, und obwohl dies ebenfalls wichtig ist, ist die Hauptsache, wenn ein FPGA etwas parallelisiert, was in Bezug auf die für die Durchführung des Vorgangs erforderlichen Zyklen in der CPU bereits teuer war. Wenn Sie sagen: "Ich kann in 10 FPGA-Zyklen eine Aufgabe ausführen, die 100.000 CPU-Zyklen beansprucht, und ich kann diese Aufgabe parallel zu 4 Elementen gleichzeitig ausführen.", Können Sie leicht erkennen, warum ein FPGA eine Menge sein kann schneller als eine CPU!

Warum verwenden wir nicht für alles FPGAs, CPLDs und ASICs? Denn im Allgemeinen ist es ein ganzer Chip, der nur eine Operation ausführt. Dies bedeutet, dass Sie einen Prozess zwar in Ihrem FPGA / ASIC um viele Größenordnungen schneller ausführen können, ihn aber später nicht mehr ändern können, wenn dieser Vorgang nicht mehr sinnvoll ist. Der Grund, warum Sie ein FPGA (im Allgemeinen) nicht ändern können, wenn es sich in einem Schaltkreis befindet, ist, dass die Verkabelung für die Schnittstelle fest ist und der Schaltkreis normalerweise keine Komponenten enthält, mit denen Sie das FPGA in eine nützlichere Konfiguration umprogrammieren können. Es gibt einige Forscher, die versuchen, hybride FPGA-CPU-Module zu bauen, bei denen es einen Abschnitt der CPU gibt, der wie ein FPGA neu verkabelt / programmiert werden kann, sodass Sie einen effektiven Abschnitt der CPU "laden" können.


2
Für das Beispiel des Umkehrens von Bits (und aller anderen Bitwechsel- / Auswahlaufgaben) dauert es nicht wirklich 1 Taktzyklus, es dauert 0. In Ihrem Beispiel dauert es 1 Taktzyklus, um Daten in einem Zwischenspeicher zu speichern , der nicht der ist gleiche Operation. Es dauert 1 Taktzyklus, ob Sie die Bits umkehren oder nicht. Die Operation zum Umkehren der Bits beträgt 0 Taktzyklen; Kein Overhead, nur anderes Routing. Der Unterschied liegt nicht nur in der Semantik, besonders wenn Sie anfangen, Dinge zu addieren. Wie lange dauert es beispielsweise, ein 32-Bit-Wort um 3 Bit nach unten zu verschieben, dann jedes zweite Nibble zu tauschen und es dann umzukehren?
WJL

1
"Hybrid-FPGA-CPU-Modul" - diese sind schon lange auf dem Markt (siehe xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm für ein modernes, erfolgreiches), aber auch ohne Spezielle Unterstützung, die Kombination von Software und HDL, erfolgt normalerweise durch die Implementierung einer Soft-CPU im FPGA auf dem Fabric.
WJL

@wjl Du hast Recht, dass es technisch gesehen keine Zyklen dauert, um den Vorgang selbst durchzuführen. Ich würde argumentieren, dass Ihr Beispiel nur semantisch anders ist, hauptsächlich, weil das logische Umsetzen dieser drei Operationen in ein festes Bitmuster (dh ich beginne mit b1b2b3b4 und ende mit b3b1b4b2). Das war eine Art von meinem Standpunkt in der gesamten Antwort. Ich habe versucht darauf hinzuweisen, dass das Beschreiben einer Operation als eine Reihe von Schritten häufig nur erforderlich ist, wenn Sie eine feste Anweisungssatz- / Gate-Anordnung haben.
Kit Scuzz

@wjl: So wie David-Gardner die Frage gestellt hat, scheint er zu sagen, dass "CPU" einer Intel- oder AMD x86 / x86_64-CPU mit hohem Takt, Pipeline und optimierter CPU entspricht. Es gibt viele weiche "CPUs", aber ich kann keine der CPUs, die für einen FPGA entwickelt wurden, wie eine i7 takten, noch sind sie nahezu so optimiert oder fähig. In Bezug auf Hybriden meinte ich eher Folgendes: newsroom.intel.com/docs/DOC-1512, das anscheinend existiert
Kit Scuzz

1
Das Zynq ist wirklich kein schlechter Prozessor (ARM Cortex-A9 - dasselbe, mit dem Tablet-Computer usw. betrieben werden), aber ich stimme zu, dass ein integrierter FPGA mit einer hohen Geschwindigkeit von x86_64 um einiges besser wäre. =)
wjl

25

In allen anderen hier vorgestellten Antworten geht es um buchstäbliche Unterschiede zwischen FPGAs und CPUs. Sie verdeutlichen die Parallelität des FPGAs gegenüber der sequentiellen Natur einer CPU oder geben Beispiele dafür, warum bestimmte Algorithmen auf einem FPGA möglicherweise gut funktionieren. All dies ist gut und wahr, aber ich würde vorschlagen, dass es einen grundlegenderen Unterschied zwischen CPUs und FPGAs gibt.

Was ist der gemeinsame Nenner zwischen einem FPGA und einer CPU? Es ist so, dass beide auf Silizium aufgebaut sind. Und in einigen Fällen buchstäblich die gleichen Siliziumprozesse.

Der fundamentale Unterschied sind die Abstraktionen, die wir auf dieses Silizium stapeln. Es ist für einen Menschen nicht möglich, alle Details eines einzelnen modernen CPU-Designs vom Silizium bis zum IC-Gehäuse zu verstehen. Als Teil des Entwicklungsprozesses teilen wir dieses komplexe Problem in kleinere handhabbare Probleme auf, mit denen sich Menschen beschäftigen können.

Überlegen Sie, was erforderlich ist, um das Silizium in eine funktionierende CPU zu verwandeln. Hier ist eine etwas vereinfachte Ansicht der Abstraktionsebenen, die für dieses Ziel erforderlich sind:

  1. Zuerst haben wir Ingenieure, die wissen, wie man Transistoren aus Silizium herstellt. Sie wissen, wie man winzige Transistoren entwickelt, die 10 oder sogar 100 Gigahertz Strom verbrauchen und schalten, und sie wissen, wie man leistungsfähige Transistoren entwickelt, die Signale mit ausreichender Leistung aus einem IC-Gehäuse und über eine Leiterplatte senden können zu einem anderen Chip.

  2. Dann haben wir digitale Logikdesigner, die wissen, wie man diese Transistoren zu Bibliotheken mit Hunderten verschiedener Logikzellen zusammensetzt. Logikgatter, Flip-Flops, Muxes und Addierer, um nur einige zu nennen. Alles in einer Vielzahl von Konfigurationen.

  3. Als nächstes haben wir verschiedene Gruppen von Ingenieuren, die wissen, wie diese digitalen (und manchmal analogen) Blöcke zusammengesetzt werden, um Funktionsblöcke höherer Ebene wie Hochgeschwindigkeitstransceiver, Speichercontroller, Verzweigungsvorhersagen, ALUs usw. zu bilden.

  4. Dann haben wir CPU-Designer, die High-End-CPU-Designs entwerfen, indem sie diese Funktionseinheiten zu einem vollständigen System zusammenfassen.

Und hier hört es nicht auf. Zu diesem Zeitpunkt haben wir eine funktionierende CPU, die Assembler-Code ausführt, aber das ist keine Sprache, die die meisten Programmierer heutzutage schreiben.

  1. Wir könnten einen C-Compiler haben, der zu Assembler-Code kompiliert (wahrscheinlich durch eine Zwischendarstellung)
  2. Wir könnten eine weitere Abstraktion über C einfügen, um eine objektorientierte Sprache zu erhalten
  3. Möglicherweise schreiben wir sogar eine virtuelle Maschine auf C oder C ++, damit wir Dinge wie Java-Bytecode interpretieren können

Und von dort aus können die Abstraktionsschichten weitergehen. Der wichtige Punkt hierbei ist, dass diese Abstraktionsschichten zusammen ein CPU-basiertes System ergeben, das massiv skaliert und einen winzigen Bruchteil eines kundenspezifischen Siliziumdesigns kostet.

Wichtig hierbei ist jedoch, dass jede Abstraktion für sich genommen auch Kosten verursacht. Der Transistordesigner baut nicht für jeden Anwendungsfall den perfekten Transistor. Er baut eine vernünftige Bibliothek auf, und so wird manchmal ein Transistor verwendet, der etwas mehr Energie oder etwas mehr Silizium verbraucht, als für die eigentliche Aufgabe benötigt wird. In ähnlicher Weise bauen die Logikdesigner nicht jede mögliche Logikzelle. Sie könnten ein NAND-Gatter mit 4 Eingängen und ein NAND-Gatter mit 8 Eingängen bauen, aber was passiert, wenn ein anderer Ingenieur ein NAND mit 6 Eingängen benötigt? Er verwendet ein NAND-Gatter mit 8 Eingängen und bindet 2 unbenutzte Eingänge ab, was zu einem Verlust der Siliziumressourcen und einem Leistungsverlust führt. Und so geht es die Kette der Abstraktionen hinauf. Jede Schicht gibt uns einen Weg, mit der Komplexität umzugehen,

Vergleichen Sie nun diese Abstraktionen mit dem, was für ein FPGA benötigt wird. Im Wesentlichen hören die FPGA-Abstraktionen bei # 2 in der obigen Liste auf. Mit dem FPGA können Entwickler auf der digitalen Logikebene arbeiten. Es ist etwas ausgefeilter als das, weil CPUs auf dieser Ebene 'fest codiert' sind und FPGAs zur Laufzeit konfiguriert werden müssen (was übrigens der Grund ist, warum CPUs normalerweise viel höhere Frequenzen ausführen), aber die wesentliche wichtige Wahrheit ist, dass diese weit entfernt sind wenige Abstraktionen für FPGAs als für CPUs.

Also, warum kann ein FPGA schneller als eine CPU? Das liegt im Wesentlichen daran, dass das FPGA weitaus weniger Abstraktionen verwendet als eine CPU, was bedeutet, dass der Designer näher am Silizium arbeitet. Er zahlt nicht die Kosten für all die vielen Abstraktionsschichten, die für CPUs erforderlich sind. Er codiert auf einer niedrigeren Ebene und muss härter arbeiten, um ein bestimmtes Maß an Funktionalität zu erreichen. Als Belohnung erhält er jedoch eine höhere Leistung.

Aber es gibt natürlich auch eine Schattenseite für weniger Abstraktionen. All diese CPU-Abstraktionen gibt es aus gutem Grund. Sie geben uns ein viel einfacheres Codierungsparadigma, was bedeutet, dass sich mehr Menschen leicht für sie entwickeln können. Dies wiederum bedeutet, dass es viel mehr CPU-Designs gibt und wir somit massive Vorteile in Bezug auf Preis / Skalierung / Time-to-Market von CPUs haben.

Also da hast du es. FPGAs haben weniger Abstraktionen und sind daher schneller und energieeffizienter, aber schwer zu programmieren. CPUs haben viele Abstraktionsdesigns, um sie einfach zu entwickeln, skalierbar und kostengünstig zu machen. Aber sie geben Geschwindigkeit und Macht im Handel für diese Vorteile auf.


FPGAs verwenden außerdem einfache sich wiederholende Blöcke, die einfache logische Aufgaben ausführen sollen. Sie sind auf bestimmte Arten von Aufgaben zugeschnitten. CPU's, OTOH, haben viele komplexe Funktionsteile, die alle unterschiedliche Aufgaben erfüllen. Man könnte annehmen, dass eine CPU eine Gruppe von vielen verschiedenen FPGA-ähnlichen Geräten ist (schließlich sind es nur Silizium, Elektronik und Mathematik). Es geht also nicht nur um Abstraktionen, sondern um Komplexität. CPUs sind komplexe Geräte, die aus vielen verschiedenen Arten elektrischer Geräte bestehen, während ein FPGA aus wenigen besteht. Eine CPU ist eine Schrotflinte, während ein FPGA ein Gewehr ist.
AbstractDissonance

21

Die anderen Antworten sind zwar alle richtig, aber noch keine beantwortet das Bitcoin-Mining-Beispiel aus Ihrer Frage, das in der Tat ein anständiges Beispiel ist. Beim Bitcoin-Mining wird wiederholt eine kryptografische Hash-Funktion (SHA-256) des Ergebnisses einer anderen SHA-256-Berechnung von Daten berechnet, bei der sich nur eine einzelne 32-Bit-Ganzzahl ändert, bis der resultierende Hash bestimmte Eigenschaften aufweist. Jeder SHA-256 besteht aus 64 Wiederholungen desselben Algorithmus, die 32-Bit-Additionen, Bitverschiebungen und einige weitere Bitverwirrungsoperationen umfassen.

Wenn Sie diese Schleife auf einer 32-Bit-CPU (oder mehr) programmieren, ist ihr Befehlssatz für die Aufgabe sehr gut geeignet. SHA-256 wurde für die effiziente Ausführung auf CPUs entwickelt. Trotzdem werden Sie nur etwa 2% der Siliziumfläche einer modernen CPU mit flächenintensiven Funktionen wie Caching, Multiplikation, Division, Gleitkomma-Operation, Verzweigung und Brach-Vorhersage usw. verwenden, die entweder gar nicht verwendet werden oder keine signifikante Leistung erbringen können Leistungssteigerung für diese spezielle Aufgabe.

In konfigurierbarer Hardware wie einem FPGA implementieren Sie einfach nur diese 2% und optimieren weiter, indem Sie alles über die Codeausführung vergessen und stattdessen Gates entwerfen, um jede dieser häufig wiederholten Unterfunktionen direkt zu berechnen. Wird die Pipeline so erstellt, dass jeder von ihnen bei jedem Taktzyklus ein Ergebnis an den nächsten weitergibt und 128-mal wiederholt wird (und mit einer speziellen zusätzlichen Logik, bei der jeder SHA-256 beginnt und endet), erhalten Sie bei jedem Taktzyklus (zum Beispiel) ein Ergebnis 100 Millionen Hashes pro Sekunde auf einem FPGA, das mit einer einfacheren Logik 300 MHz unterstützt, während auf einer modernen CPU alle paar tausend Taktzyklen pro Kern ein Ergebnis zu erwarten ist, z. B. 10 Millionen Hashes pro Sekunde auf einem Multi-Core-Multi -GHz CPU.

Wenn dieses Beispiel für Sie von Interesse ist, können Sie sich meine Antwort zu den Interna von ASIC-Minern auf bitcoin.stackexchange ansehen, da viele FPGA-Miner auf die gleiche Weise mit konfigurierbarer und nicht mit maßgeschneiderter Hardware arbeiten. Der Vollständigkeit halber: Es gibt andere Möglichkeiten, wie das von mir beschriebene Begrenzen oder Vermeiden des Pipelining zugunsten einer trivialeren Parallelisierung durch die Verwendung mehrerer unabhängiger SHA-256-Hashers. Abhängig von den Einschränkungen, die durch die internen Komponenten Ihres FPGAs und dessen Gesamtgröße gegeben sind, kann dies sogar zu einer besseren Leistung führen, obwohl dies in Bezug auf die Anzahl der Gates und den Routing-Overhead weniger effizient wäre, wenn Sie die perfekte Freiheit beim Entwerfen des gesamten Chips und nicht nur der FPGA-Konfiguration hätten .


3
Das ist ein sehr guter Punkt bei der Verwendung von Silizium.
markt

Aber vielleicht (unbeabsichtigt!) Irreführend, wenn man bedenkt, dass ein FPGA aus etwas komplexen Zellen mit vielen physischen Gattern besteht, von denen eine typische Anwendung wiederum nur einen Bruchteil verwendet. Dadurch können die Hersteller äquivalente Anzahl von Gattern angeben, um Ihnen zu sagen, wie viel alles das könnte sich in einer "typischen" anwendung lohnen ...
pyramiden

3

Die obigen Antworten sind zwar korrekt, verpassen jedoch den Punkt, warum FPGAs (und benutzerdefinierte ASICs) besonders gut für Bitcoin-Berechnungen geeignet sind.

Der eigentliche Vorteil besteht darin, dass ein großer Teil der SHA-256-Berechnungen logische Operationen (z. B. Bitverschiebungen) sind, die in der Verdrahtung ausgeführt werden können. Auf diese Weise benötigen sie 0 Taktzyklen.

Ein weiterer wichtiger Vorteil ist, dass FPGAs wesentlich energieeffizienter sind (dh MIPS pro Watt) als CPUs, sodass die für die Berechnungen erforderliche Energiemenge viel geringer ist. Dies ist wichtig, da die Kosten für den Abbau eines Bitcoin davon abhängen, wie viel Strom Sie für dessen Herstellung verbrauchen.

ASIC-Chips sind energieeffizienter als FPGAs, sodass sie denselben Code viel billiger ausführen können. Sie können auch mehr Ausführungseinheiten an Bord stopfen, um sie schneller zu machen. Der Nachteil ist, dass die Kosten für die Herstellung eines kundenspezifischen ASIC sehr hoch sind, so dass Sie einige Chips verkaufen müssten, um die Herstellungskosten zu decken.

GPUs werden auch zur Herstellung von Bitcoins verwendet. Da sie jedoch viel weniger energieeffizient sind, haben sie gegenüber FPGAs und benutzerdefinierten ASICs an Boden verloren.


Wenn Sie sich den Monero-Hashing-Algorithmus alias Cryptonight ansehen, werden Sie feststellen, dass eine FPGA-Implementierung aufgrund des hohen Speicherbedarfs, auf den zufällig zugegriffen werden muss (2 MB), nahezu unmöglich ist. Eine CPU hat in diesem Fall den Vorteil.
Lucas92
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.