LabVIEWForum.de - FFT auf mehrere Rechenkerne optimieren

LabVIEWForum.de

Normale Version: FFT auf mehrere Rechenkerne optimieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Hallo @ all.

Ich habe ein großes zweidimensonales Array mit 4096x1000 Punkten. Daraus möchte ich die FFT berechnen. Die FFT wird aus den 4096 Punkten berechnet und das ganze dann 1000 mal. Ich habe mal ein einfaches Beispiel geschrieben. Dort erzeuge ich mir ein Testarray und lasse es von der FFT-Funktion berechnen. Wenn man auf den Parallelbutton klick, dann wird das Array in 2 gleich große Teile geteil und die FFT auf 2 CPU-Kernen berechnet, jedoch ist meien Version alles andere als super in der Performance. Ich messe die Zeit für die Berechnung der FFT mit 1 CPU-Kern und mit 2 CPU Kerne, die parallel arbeiten.

Mache ich etwas bei der Optimierung falsch?
Lv86_img
Ich habe noch eine weiter Version erstellt, die ich für besser halte, jedoch weiß ich nicht wie ich am besten das Array wieder zusammenfügen soll. Vielleicht kann mir da ja jemand einen Rat geben. Diese scheint aber besser zu laufen als die andere Version. Vielleicht liegt dies jedoch daran, das das Ausgabearray nur so klein ist.
Lv86_img
Die Vis sind mit LabVIEW 8.6 erzeugt. Ich kann diese bei bedarf auch für ältere Versionen zu Verfügung stellen.
Hier ist's mal ohne Express-VIs. Ist mir gleich angenehmer. Wink

[attachment=16551]
Lv86_img

Gruß Markus
' schrieb:Hallo @ all.

Ich habe ein großes zweidimensonales Array mit 4096x1000 Punkten. Daraus möchte ich die FFT berechnen. Die FFT wird aus den 4096 Punkten berechnet und das ganze dann 1000 mal. Ich habe mal ein einfaches Beispiel geschrieben. Dort erzeuge ich mir ein Testarray und lasse es von der FFT-Funktion berechnen. Wenn man auf den Parallelbutton klick, dann wird das Array in 2 gleich große Teile geteil und die FFT auf 2 CPU-Kernen berechnet, jedoch ist meien Version alles andere als super in der Performance. Ich messe die Zeit für die Berechnung der FFT mit 1 CPU-Kern und mit 2 CPU Kerne, die parallel arbeiten.

Mache ich etwas bei der Optimierung falsch?
Ich weiss nicht, sieht doch gut aus.

Ich messe auf meinen Athlon 64 5050e (also ein relativer aktueller Dual-Core Prozessor) bei "nicht-parallerer" Verarbeitung eine durchschnittliche Durchlaufzeit von etwas über 300 ms, bei paraller Verarbeitung dagegen knapp über 200 ms. Insgesamt also 50% schneller, das ist doch gut! Bedenke, dass du auch einiges an Zeit für das Aufteilen und vereinen der Arrays draufgeht.

Übrigens, wenn du die Abarbeitung eines Programmteils auf einem der Prozessoren erzwingen willst, dann musst du mit Timed-Sequences oder Timed-Loops arbeiten:

Könnte so aussehen:
[attachment=16553]

Übrigens, dein 2. Bsp. zeigt bei mir keinen Performance-Gewinn.

Gruß, Jens

EDIT: Die Build-Array Fkt. scheint besser zu sein als die von dir verwendete Insert-Into-Array
Bei Version 1.1 habe ich ohne parallele Verarbeitung so ca. 230ms Rechenzeit. Mit 2 Kernen so ca. 210ms. Dies ist ein sehr schlechtes Ergebnis.

Bei der Version 2.0 habe ich so mit 1. CPU Kern 200ms und mit 2 Kernen 110ms. Jedoch habe ich nur 84% Systemauslastung. Es geht also noch Zeit verloren. Ich werde mal die Frequenzgesteuerten Schleifen nehmen.


Noch ganz wichtig.

Kann mir vielleicht einer einen Rat geben, wie ich bei Version 2.0 das Array wieder in die Ausgangsform bekommen. Es muss wieder zum Schluss ein zweidimensionales Array rauskommen.
Rückfrage (ausser der Reihe): Wieso teilst du eigentlich bei Version 2.0 auf 4 Teile auf? Hast du einen QuadCore?
Außerdem hast du bei Version 2.0 "nur" 1000x2048 Arrays, Absicht, Versehen?

Gruß, Jens
Ich bekomme heute meinen Quadcore. Das mit der Arraygröße war ein versehen. Die kann man einfach von 2049 auf 4096 erhöhen.
So Quadecore ist zusammengebaut nur noch alles installieren. Dann kann ich das ganze mit dem neuen System ausprobieren.
Die Version 2 läuft unter dem neuen i-7 920 (neuer Quadcore von Intel mit Tripple Channel DDR3 Speicher) nicht wirklich gut. Die Gesamtauslastung ist so bei 20%. Dies heist so wie ich das Programm erstellt habe werden die 4 Kerne (8 Threads) nicht wirklich belastet. Deshalb muss ich es neu programmieren. Als erstes werde ich es mal mit den zeitgesteuerten sequenzen probieren.

Was muss ich denn bei diesen Sequenzen beachten? Was für eine Timing muss ich da angeben?
Seiten: 1 2 3 4
Referenz-URLs