Forum: FPGA, VHDL & Co. FPGA Anwendung, oder halt nicht


von Samuel (Gast)


Lesenswert?

Servus Erdnuss!

Ich habe mir aus Spaß ein Java Programm geschrieben um Pi auf >1E6 
Stellen zu berechnen.
Dazu haben ich eine BBP Formel programmiert, funktioniert auch.
Es blockiert mir aber meine PC, den ich auch nicht 24/7 laufen lassen 
will.
Würde es Sinn machen das Programm irgendwie auf einem FPGA umzusetzen?
Wie gut muss der FPGA sein um zu einem i7 Laptop  gleich auf zu sein?
Gibt es eine Möglichkeit Java Code auf einem FPGa zu benutzen?
Ich würde mir wünschen, dass ich einen "start" Knopf drücke und den FPGA 
eine Woche laufen lasse, dann möchte ich Pi irgdendwie aufrufen, zB. als 
.txt auf einer SD Karte.

Ist dies als Anfänger Aufgabe für einen FPGA geigent?
Könnt ihr ein Dev-Board empfehlen?

tschüss

von Donni D. (Gast)


Lesenswert?

Java geht nicht auf einem FPGA. Und so wie du dir das vorstellst, geht 
es nicht. Lerne erst einmal die Grundlagen, dann kannst du dich langsam 
an Mathematik wagen

von Frank K. (fchk)


Lesenswert?

Java ist für diese Aufgabe ohnehin nicht geeignet. Die Applikationen 
laufen dort ja nicht auf der eigentlichen CPU, sondern auf einer 
virtuellen CPU. Die Umsetzung vom Java-Prozessor auf den Intel-Prozessor 
ist zwar seit 1994 (da kam Java raus) immer besser geworden, aber Du 
verlierst trotzdem Leistung.

Nimm C(++) oder eine andere Sprache, bei der direkter Maschinencode 
erzeugt wird (also nicht C#, managed C++, Phython oder ähnliches) und 
sorge dafür, dass der Compiler SSE4 oder AVX-Code erzeugt.

Plus: verwende möglichst viele Prozessorkerne gleichzeitig und 
parallelisiere möglichst viele Aufgaben, sofern es das Verfahren 
zulässt. Wenn das Verfahren es nicht zulässt, dann nehme ein anderes 
Verfahren.

Dann hast die optimalen Voraussetzungen für eine kürzestmögliche 
Rechenzeit.

Wenn Du dann noch die Priorität des Prozesses im Taskmanager 
heruntersetzt, dann kannst Du nebenher noch andere Sachen machen, weil 
Dein Programm dann einfach die freie Rechenzeit verwendet und im 
Bedarfsfall anderen Programmen den Vortritt lässt.

Insbesondere die Parallelisierbarkeit ist für eine erfolgreiche 
FPGA-Implementation wichtig. Ein FPGA besteht ja eh nur aus Millionen 
von Logikgattern, und die arbeiten eh parallel. Gleiches gilt für Code 
auf Grafikkarten (Cuda, OpenCL). Der ist nur dann schnell, wenn alle 
Recheneinheiten parallel laufen und gleichermaßen ausgelastet werden.

fchk

von J. S. (engineer) Benutzerseite


Lesenswert?

Samuel schrieb:
> Wie gut muss der FPGA sein um zu einem i7 Laptop  gleich auf zu sein?

Egal wie du es programmierst: Der FPGA ist für einen Prozess immer im 
Nachteil, das kann man klar sagen. Erst ab starker Parallelisierung wird 
ein FPGA effektiv, wenn man die Anzahl der Cores überschreitet und zudem 
der Prozessor an die Speicherbandbreite des DDR-Rams herankommt, um 
Zwischenergebnisse zu speichern.

Das Bandbreitenverhältnis von FPGA zu I7-PC (Rechen- und IO-Leistung) 
ist etwa 20:1, dies kann man aber nur mit einem voll ausgebauten FPGA 
erreichen, das zu etwa 50% rechnet und zu 50% Zwischenergebnisse in 
Registern und BRAMs speichert und 100% ausgelastet ist, also in jedem 
Takt etwas tut.

Es braucht also mehrere parallele Prozesse, die von unterschiedlichen 
Startzuständen ausgehend, die Zahlen testen und diese Recheneinheiten 
müssten zahlenmäßig so viele sein, dass der FPGA voll ist. Grundsätzlich 
wäre das machbar, nur ist gerade beim Thema Rechnen ein I7 auch 
technisch im Vorteil, was Bit-Auflösung und Divisionen angeht. Der FPGA 
dürfte da von seinem Vorteil kaum etwas überbehalten.

Hinzu kommt das Problem der Entwicklung:

Du musst das System, also die Rechenkerne und die Verwaltung auch bauen.

Klar, man kann solche Systeme auf MATLAB entwickeln, muss dann aber in 
Integer rechnen und das, was da aus dem HDL-Coder kommt, ist weder 
automatisch pipeline-fähig (und wenn, dann nicht optimiert) noch rundet 
es geschickt genug, um effektiv rechnen zu können. Sobald ein FPGA 
nämlich Multiplikationen ausführen muss, die den embedded MUL 
überschreiten, wird es nochmal langsamer und verliert Flächeneffizienz.

von J. S. (engineer) Benutzerseite


Lesenswert?

Als kleines Beispiel:

Ich hatte probehalber mal meinen alten C-Code für einige Soundmodule in 
HLS übersetzen lassen und mir das Ergebnis in Vivado angesehen:

Was da raus kam, hatte weder die maximale Taktfrequenz, die ich mit 
händischer Codierung erreicht hatte, noch deren Genauigkeit. Besonders 
das Thema Rundung und "bits sparen" wird nicht abgedeckt.

Der Code resultiert in deutlich erhöhter CHIP-Fläche. Auch ohne 
pipelining kommt da schon zwischen 150% und 250% raus. Das rotierende 
pipelining drüber gestülpt erfordert dann nochmals mehr FFs, um das 
Timing zu treffen.

Für das primäre Pyra2-Modul läuft es dann auf über 128 Takte Verzögerung 
hinaus, was dazu führt, dass man nicht weniger, als 128 Kanäle bauen 
kann, weil das alte Sample, dass man beim neuen Durchlauf braucht, noch 
nicht aus der pipeline rausgekommen ist. Klar kann man jetzt sagen, man 
baut 256 Kanäle, aber dann verliert man einen Faktor 2 für die 
Abtastfrequenz und die ist schon reduziert. Oder man muss die Module 
dann einzeln(er) kaskadieren oder parallelisieren, was weitere FFs und 
Chipfläche kostet.

Viele besondere Verschaltungstechniken, quer über die pipeline, die 
Zeiten und Raum gleichzeitig überstreichen, lassen sich in HLS / MATLAB 
erst gar nicht formulieren.

Um FPGAs auszunutzen, muss man selber ran und das ist aufwändig.

Es ist einfacher, solche verschachtelten und verketteten Operationen in 
C zu machen und mehr Rechenleistung mit DSPs zu kaufen, also mehr davon, 
oder auf den nächst besseren warten, oder eben Aufgaben auf mehrere 
Rechner zu verteilen.

von Markus F. (mfro)


Lesenswert?

Für das gestellte Problem hast Du m.E. mit dem BBP-Algorithmus schon das 
für FPGA geeignetste Werkzeug am Wickel:
+ damit lassen sich beliebige Stellen von Pi berechnen, ohne dass man 
alle vorherigen schon kennen müsste. Damit hat man bei der 
Parallelisierung keine Probleme, weil die einzelnen Rechenwerke nicht 
aufeinander Rücksicht nehmen müssen
+ es gibt schon x Abhandlungen darüber, wie man die notwendige 
Stellenanzahl innerhalb der Berechnung durch zusätzliche Rechenschritte 
so gering wie möglich hält. Die folgen üblicherweise einem festen 
Schema, das sich relativ einfach pipelinen lässt

Nehmen wir der Einfachheit halber (die Zahlen entbehren jeder Grundlage) 
an, Du schaffst es, den Algorithmus so weit zu optimieren, dass er bei - 
sagen wir mal - 10 MHz bei jeder hundertsten Taktflanke eine Ziffer 
ausspuckt (0,1 MHz), während dein Laptop bei 3 GHz bei jeder 1000sten 
Taktflanke eine liefert (3 MHz), brauchst Du im FPGA dreissig parallele 
Rechenwerke, um gleich zu ziehen. Wenn Du dein Programm auf dem Rechner 
noch so optimierst, dass es mehrere Prozessorkerne gleichzeitig 
beschäftigen kann, musst Du beim FPGA noch zusätzlich Briketts auflegen.

Ob Du den Laptop "überholen" kannst, hängt einzig und allein davon ab, 
wieviel FPGA- (und RAM-) Ressourcen (=€€) Du einzusetzen bereit bist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.