Hallo Zusammen,
ich werde demnächst ein Referat zum Thema FPGA halten und möchte dabei
einen Vergleich zu einer CPU machen.
Konkret würde ich gerne ein Beispiel zeigen wie ein FPGA eine bestimmte
Aufgabe löst, und wie der Prozessor diese Aufgabe lösen würde.
Ich habe hierfür ein Beispiel(siehe Anhang) im Internet gefunden.
Frage 1:
Ist das so in etwa richtig? Kann man sagen das ein Compiler für z.b.
eine RISC CPU diese 12 Befehle generiert und diese dann von der CPU
abgearbeitet werden.
Frage 2:
Bei der FPGA Schaltung steht dabei das es 2 Schritte für diese Operation
braucht. Was soll den hier genau 2 Schritte bedeuten? Eine
Addieroperation allein braucht ja schon mehrere Schritte. Da sind ja
auch viele Gatter vorhanden.
Frage 3:
kann man das ganze vielleicht grob in Zahlen ausdrücken? Ich würde gerne
aufzeigen wie schnell das in etwa eine CPU mit 1GHz lösen würde. und Wie
schnell ein FPGA mit z.b. 100Mhz.
Kann ich hergehen und sagen das eine CPU mit Piplining für jeden Befehl
genau einen Taktzyklus braucht? D.h. 12*1ns = 12 ns
Bei dem FPGA könnte ich mir ja die Schaltung in einem Entwicklungstool
aufbauen und mir die Laufzeit durchrechnen lassen. Oder geht das auch am
grob am Papier?
Danke sehr
Gruß
Florian
Florian schrieb:> Kann man sagen das ein Compiler für z.b. eine RISC CPU diese 12 Befehle> generiert und diese dann von der CPU abgearbeitet werden.
Für diese spezielle RISC-CPU in deinem Beispiel ist das so.
> Bei der FPGA Schaltung steht dabei das es 2 Schritte für diese Operation> braucht. Was soll den hier genau 2 Schritte bedeuten?
Da sind 2 grundlegende Logikelemente in dem Schaltplan.
Tatsächlich wird dies Logik in einem FPGA aber natürlich in 1 LUT mit 4
Eingängen und 1 Ausgang gepackt und damit ist das real nur 1 Schritt.
> Bei dem FPGA könnte ich mir ja die Schaltung in einem Entwicklungstool> aufbauen und mir die Laufzeit durchrechnen lassen. Oder geht das auch am> grob am Papier?
In der Realität nicht mehr.
> Frage 3: kann man das ganze vielleicht grob in Zahlen ausdrücken? Ich> würde gerne aufzeigen wie schnell das in etwa eine CPU mit 1GHz lösen> würde.
Keine CPU macht was mit 1GHz. Sondern bestenfalls der innerste
Rechnerkern der CPU läuft damit. Aber weil du erst noch die Befehle und
die Daten aus dem Speicher holen musst, dauert das alles viel länger.
> Kann ich hergehen und sagen das eine CPU mit Piplining für jeden Befehl> genau einen Taktzyklus braucht? D.h. 12*1ns = 12 ns
Die Zahlen sind beliebig. Du musst etwas vergleichen, was gleich teuer
und gleich groß ist: ein FPGA für 3€ und einen µC für 3€. Dann kannst du
die Performance ansatzweise vergleichen. Wenn du aber ein FPGA für 5€
(=100MHz) mit einem Prozessor samt Pipapo für 50€ vergleichst, dann
kannst du auch das Wetter in Absurdistan mit der Farbe von Grünkohl
vergleichen.
> und Wie schnell ein FPGA mit z.b. 100Mhz.
Das braucht weniger als 10ns für die Aufgabe. Sonst könnt es die
Setup-Zeit für das nächste Flipflop nicht einhalten. Real sind die
Durchlaufzeiten durch LUTs im huntert-ps Bereich. Dazu kommt das Routing
usw...
Moin,
Der Unterschied zwischen FPGA und CPU wird wohl deutlicher, wenn du das
Beispiel nicht mit einzelnen Variablen machst, sondern jeweils mit
Arrays von z.b. jeweils 16 Eintraegen.
Die CPU muss dann halt 16mal hintereinander mit den verschiedenen
Arrayeintraegen rechnen, waehrend im FPGA "einfach" 16 Instanzen der
fuer die Berechnung benoetigten LUTs nebeneinander rumliegen und
gleichzeitig rechnen koennen.
Die CPU braucht also grob 16x laenger fuer's Array, im FPGA kann man's
"in die Flaeche komponieren", wenns pressiert und es bleibt dann genauso
schnell - solange das parallele Design noch ins FPGA passt.
Gruss
WK
Hallo,
Danke für die Antworten.
ich hab das mal in Xilinx Vivado für den Zybo (xc7z010clg400-1)
nachgebaut.
Allerdings mit einem Multiplizierer statt einem Subtrahierer.
1
entitytestis
2
Port(
3
a:inunsigned(15downto0);
4
b:inunsigned(15downto0);
5
c:inunsigned(15downto0);
6
d:inunsigned(15downto0);
7
z:outunsigned(33downto0);
8
clk:instd_logic
9
);
10
endtest;
11
12
architectureBehavioraloftestis
13
14
signala_s:unsigned(15downto0);
15
signalb_s:unsigned(15downto0);
16
signalc_s:unsigned(15downto0);
17
signald_s:unsigned(15downto0);
18
signalz_s:unsigned(33downto0);
19
signalx_s:unsigned(16downto0);
20
signaly_s:unsigned(16downto0);
21
22
begin
23
24
x_s<=('0'&a_s)+('0'&b_s);
25
y_s<=('0'&c_s)+('0'&d_s);
26
z_s<=x_s*y_s;
27
28
regs:process(clk)
29
begin
30
ifrising_edge(clk)then
31
a_s<=a;
32
b_s<=b;
33
c_s<=c;
34
d_s<=d;
35
z<=z_s;
36
endif;
37
endprocess;
38
39
endBehavioral;
Das was rausgekommen ist, sieht man im Anhang. Es wurde dafür ein DSP
Slice verwendet. Zu sehen ist der kritische Pfad. Als total Delay wurde
hier 3,2 ns angegeben.
Diesen Wert würde ich gern gegenüber einem Mikrocontroller der z.b. mit
1Ghz läuft stellen? Wie mache ich das am besten? Es muss nicht ganz
genau sein. Grob würde mir schon reichen :)
Danke sehr
Ein fairer Vergleich zwischen FPGA und CPU ist auf diese Weise kaum
möglich. z.B. verwendet dein CPU-Programm LOAD-Operationen zum Laden der
Operanden aus dem Speicher. Aber woher bekommt der FPGA seine Daten?
Fairerweise musst du voraussetzen, dass bei beiden die Operanden bereits
in Registern liegen und die Ergebnisse nur in Registern gespeichert
werden.
Für halbwegs brauchbare Performancevergleiche wirst du dich zumindest
auf einen speziellen CPU- Typ festlegen müssen, alleine schon wegen der
Speicheranbindung (Stichwort Harvard-Architektur). Da würde sich z.B.
die RISC-V CPU anbieten, die vollständig offengelegt ist. Wenn du für
dein Problem ein RISC-V Maschinenprogramm schreibst und gleichzeitig
zeigst, wie das FPGA-Design aussieht, kannst du sehr schön
demonstrieren, wo die Vorteile/Nachteile liegen.
FPGA haben immer die Nase vorn, wenn es um feingranulare Parallelität
geht, z.B. bei einer Skalarmultiplikation (fairerweise mit
Integer-Vektoren,die vollständig in die 32 RISC-V-Register passen). Geht
es dagegen um Steuerungsaufgaben mit vielen if/else-Entscheidungen und
Variablen, würde man eher eine CPU nehmen. Ebenso bei
nicht-parallelisierbaren Algorithmen mit vielen
Floating-Point-Operationen.
Dein Beispiel-Design oben lässt sich wohl auf den meisten aktuellen FPGA
in einem einzigen Takt berechnen, und wenn nicht, dann in einer
zweistufigen Pipeline. Wenn du von 100MHz ausgehst, bekommst Du 100Mio
Ergbnisse pro Sekunde, vorausgesetzt, du kannst den FPGA pro Sekunde mit
400Mio Operanden füttern. Jetzt kannst du mal überlegen, welche
Perfromance ein RISC-V mit 4-stufiger Pipeline bei 100MHz bringen würde,
und wie hoch man ihn takten müsste, damit er genau so schnell ist wie
der FPGA. Für einen aktuellen AMD-RYZEN Prozessor verglichen mit einem
Xilinx-Virtex-Ultrascale-II-Monstrum dürften sich dann ähnliche
Vergleichswerte ergeben.
Dergute W. schrieb:> Die CPU braucht also grob 16x laenger fuer's Array
Wobei diese Zahl 16 ein für dieses Beispiel beliebig gewählter Wert ist
und nichts direkt mit den 16 Werten im Array zu tun hat. In der Praxis
kann die CPU auch 160 mal länger brauchen, wenn grad ein Cache Miss war
und erst noch das komplette Array in den CPU-Speicher geladen werden
muss... ;-)
Florian schrieb:> ich werde demnächst ein Referat zum Thema FPGA halten und möchte dabei> einen Vergleich zu einer CPU machen.
Weil ein allgemeiner Vergleich einer CPU mit einem FPGA immer hinkt,
solltest du da eher eine diskret aufgebaute Schaltung mit einer ins FPGA
gepackte Logik vergleichen. Denn die Logik, die aus einer Rechnung wie
der obigen wirklich gemacht wird, sieht für 8-Bit signed Werte real so
aus wie im Screenshot. Da ist wie in deinem Beispiel nichts mit "2
Schritten" zu erkennen, sondern da sind zwischen Ein- und Ausgang einige
LUT und Multiplexer beteiligt.
Florian schrieb:> Diesen Wert würde ich gern gegenüber einem Mikrocontroller der z.b. mit> 1Ghz läuft stellen? Wie mache ich das am besten?
Es geht in dieser Liga nicht, ohne dass du irgendwelche Randbedingungen
annimmst. Denn GHz Prozessoren erreichen das GHz eben nur in den
internen Pipelines. Für einen Vergleich musst du also alles vergleichen
von Quelle bis Ziel, also von dem Zeitpunkt, wo die Eingangsdaten im
Speicher stehen bis zu dem Augenblick, wo das Ergebnis im Speicher
steht. Aber auch das ist Sand in die Augen gestreut, denn währen der
Buscontroller die Daten in den Speicher legt, macht die CPU ja schon
lange wieder was anderes. Und es läuft eben auch dort vieles parallel.
Man könnte meinen dass es im Kern um einen Vergleich zwischen linearen
und parallelen Prozessen geht.
Und da wird eine Aufgabe die man parallelisieren kann tendenziell auf
einem FPGA schneller ablaufen.
Wenn der FPGA klein ist, also wenig Fläche für parallele Prozesse hat,
dann wird eine sehr schnelle CPU mit linearer Berechnung tendenziell
trotzdem schneller sein.
Um CPU vs. FPGA zu beurteilen muss man die Menge der Aufgabenstellungen
definieren. Denn es wird keinen deutlichen Sieger für eine beliebige
Aufgabenstellung geben. Berechnungen die sich nicht (gut)
parallelisieren lassen, laufen auf einem FPGA auch nicht besonders
schnell.
Wobei die Eigenschaften linear und parallel auch nicht immer für CPU und
FPGA gelten.
Eine CPU mit mehreren Kernen parallelisiert auch Aufgaben oder es gibt
bestimmte Module in der CPU die bestimmte Berechnungen auch parallel
ausführt, wenn auch nicht in dem Ausmaß wie es ein FPGA theoretisch
kann.
Umgekehrt können in realen Berechnungen auch in einem FPGA lineare
Prozesse zwingend sein die das Gesamtergebnis ausbremsen können.
All die Punkte die hier aufgefuehrt werden sind richtig, helfen aber
nicht wirklich weiter.
Jetzt gehen wir aber mal einen Schritt zurueck und sehen das dort ein
"Referat" gehalten wird. Was ist also die Zielgruppe? Klingt nach
Oberstufe/Richtung Abitur. Hat das Publikum etwas Hintergrundwissen oder
hoeren die zum ersten Mal von FPGAs? Zum ersten mal von Digitallogik?
Zum ersten mal von Maschinenbefehlen? Doch im Studium?
Ich wuerde sagen du bist auf einem guten Weg und vergleichst die
richtigen Baustellen. Seriell gegen parallel ist das Argument. Stelle
das gut verstaendlich dar. Sei dir bewusst das du die Rahmenbedingungen
nicht 100% vergleichen kannst. Es passiert zuviel in der
Mikroarchitektur um CPU-Zyklen 1:1 mit der Gaterlauf vergleichen zu
koennen. Verstecke das nicht, lass dich aber auch nicht von zuvielen
unnoetigen Details von dem eigentlich Vergleich abhalten.
Florian schrieb:> ich werde demnächst ein Referat zum Thema FPGA halten und möchte dabei> einen Vergleich zu einer CPU machen.> Konkret würde ich gerne ein Beispiel zeigen wie ein FPGA eine bestimmte> Aufgabe löst, und wie der Prozessor diese Aufgabe lösen würde.
Dir ist aber hoffentlich bewußt, daß ein derartiger Vergleich extrem
hinkend ist.
Also eine CPU ist eine Inkarnation der Turing-Maschine, also eines
Gebildes, was seriell Befehle liest und ausführt - während ein FPGA eine
Tüte voller Logik-Gatter ist, denen man erst durch eine sinnvolle
Verschaltung eben dieser Gatter eine gewünschte Funktion gibt.
Das ist ein wesentlicher Unterschied, der eigentlich jeglichen Vergleich
verbietet. Und: Ein FPGA kann durchaus auch eine CPU sein, denn eine CPU
ist ebenfalls nur eine Konstruktion aus Logik-Gattern.
Also: Ein FPGA löst keine Aufgabe - sondern derjenige, der die Gatter
des FPGA in sinnvoller Weise miteinander verschaltet, löst damit
Aufgaben.
Eine CPU hingegen löst Aufgaben, denn sie nimmt (eben als
Turing-Maschine) Befehle entgegen und führt sie aus.
Das beinhaltet einen wesentlichen Unterschied: Die Formulierung der
Aufgabe besteht beim FPGA in der inneren Verschaltung der Gatter -
während sie bei der CPU von außen herangeführt wird, indem man der CPU
unterschiedliche Befehle zu lesen gibt. Für unterschiedliche Aufgaben
muß ein FPGA innerlich umprogrammiert werden. Die CPU hingegen bleibt
innerlich gleich, die Aufgaben werden ihr seriell von außen zugeführt.
Und noch ein Wort zu Geschwindigkeiten: Eine CPU ist üblicherweise ein
getaktetes System und damit ist die Befehlsausführung an den angelegten
Takt gebunden. Die Verschaltung der Gatter im FPGAkann ebenfalls ein
getaktetes System sein (ist es in den meisten Fällen auch) - aber das
ist nicht zwingend, denn man kann mit Logik-Gattern auch ungetaktete
Fnktionalität herstellen. Dann hängt die Geschwindigkeit von den
Durchlaufszeiten der Gatter ab und da diese je nach Komplexität
variieren, ergibt das Glitches.
W.S.
Ich habe das im Seminar immer am Beispiel eines Taschenrechners erklärt,
wenn es kurz und knapp für Laien sein sollte:
Hardware:
CPU: Chip fest verdrahteten Funktionen, die vom Hersteller definiert
wurden
FPGA: Chip mit frei vom Entwickler festlegbaren Funktionen
Daraus ergibt sich zwangsläufig:
Software:
CPU: Das Programm ist eine Rechenvorschrift, konkret ein Ablauf, damit
der universelle Rechner genau die richtige Rechnung durchführt (so, wie
sie eine Person eintippen würde)
FPGA: Das Programm ist eine Bauvorschrift, damit eine Software aus
universellen Elementen einen abgespeckten Taschenrechner für die
gewünschte Rechnung zusammensetzen kann (so, wie es eine Person
zusammenlöten würde)
Alternativ dazu das ebenfalls von mir gebrachte Roboterbeispiel, um
einmal zu abstrahieren und CPU / FPGA als etwas Produktives aufzufassen:
Eine Vorschrift wie C oder SPS ist expliziter Ablauf, der einen Roboter
dazu bringt, ein Auto zusammenzusetzen.
Eine Vorschrift wie VHDL ist die Bauanleitung für den Roboter. Die
Abläufe für das Zusammensetzen des Autos sind implizit gegeben.