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)?
Antworten:
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 $$$.
quelle
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:
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.
quelle
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:
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.
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.
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.
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.
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.
quelle
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 .
quelle
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.
quelle