LabVIEWForum.de
Geschwindigkeitsoptimierung paralleler Schleifen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Geschwindigkeitsoptimierung paralleler Schleifen (/Thread-Geschwindigkeitsoptimierung-paralleler-Schleifen)



Geschwindigkeitsoptimierung paralleler Schleifen - frawa - 09.09.2008 06:38

Liebe LV-Forums-Gemeinde,

im Anhang hängt ein VI (LV 8.5), welches zum Debuggen eines µC-basierten Messsystems per SPI genutzt werden soll.

Es existieren 3 While-Schleifen,

1x als State Machine zum Init und fürs UI
1x als Messdatenerfassung über einen über USB angebundenen SPI-Slave (Aadvark)
1x als Auswertung der SPI-Daten

Die letzten beiden Schleifen sind über eine Queue verbunden.

Nach meiner Vorstellung sollten die Schleifen (quasi-) parallel laufen (Ausführungrechner = Pentium M = single core).

Die schnellste realisierbare Poll-Rate des SPI-Slaves beträgt ca. 14 ms (ermittelt im Testprogramm, in dem lediglich der Slave angesprochen wird).

Ziel ist die halbwegs zeitstabile Abfrage des SPI-Slaves alle 20 ms. Dies funktioniert soweit gut, bis ich in die Tabelle schreibe. Dann stockt mein Abfrageprozess kurzzeitig und dauert >100ms.

Wieso ist das schreiben der Tabellen-Variable so langsam?
Wieso beeinflusst es die Datenerfassungs-Schleife?
Wie könnte ichs besser machen?

Schon jetzt danke für euere Bemühungen!

Lv85_img


Geschwindigkeitsoptimierung paralleler Schleifen - Lucki - 09.09.2008 08:20

Habe mir das VI mal angesehen, ist natürlich bei mir nicht lauffähig (Dies SPI-VIs, woher sind die eigentlich? Ich habe sie nicht).
Lokale Veriablen sind ca 10mal langsamer als die Elemente selbst. Das ist aber noch gar nichts im Vergeleich zu den Eigenschaftsknoten, die sind gleich 200mal langsamer.
Deshalb solltest Du es gerade umgekehrt machen als wie es jetzt ist:
In der zeitkritischen Hauptschleife möglichst die Elemente selbst verwenden, und die lokalen Veriablen oben in der Konfiguration. Das gilt speziell für die lokalen Variablen "Result Table" und "Config Date" in der Auswertungsschleife.
Den Eigenschaftsknoten "Result Table"(Spaltentitel) in der Haupschleife wegzubekommen ist umständlicher: Du müßtest den Eigenschaftknoten dort gegen ein verborgenes Bedienelement ersetzen. Der Eigenschftknoten müßte dann in die Konfigurationsschleife und schreibt seinen Inhalt in eine lokale Variable dieses verborgenen Bedienelementes.
Wenn das alles nichts nützt, dann sollte man überlegen, ob diese große Tabelle wirklich wegen jeder einzelnen Zeile aktualisiert werden muß. Es würde doch auch genügen, die Tabelle nur alle 10 Zeilen zu aktualisieren, das wäre dann immer noch schneller als der Mensch gucken kann


Geschwindigkeitsoptimierung paralleler Schleifen - MikeS81 - 09.09.2008 10:34

Hallo frawa,
ich empfehle den Einsatz von Schieberegistern. Damit kannst du schon einige Dinge verbessern. Die Referenz der Semaphore kannst du direkt als Draht nach oben verbinden, hier ist kein Einsatz von lokalen Variablen notwendig.

Mike


Geschwindigkeitsoptimierung paralleler Schleifen - frawa - 15.09.2008 06:30

Zunächst vielen Dank für euere Bemühungen, Lucki & Mike.

Ich habe eure Vorschläge umgesetzt, dennoch hapert es an der gewünschten Geschwindigkeit.

Folgende Fragen dazu:

Die beiden per Queue verbundenen schleifen werden zurzeit anscheinend sequentiell ausgeführt, solange ich die consumer schleife nicht bremse (per value highlight zum debug) ist die queue stehts leer. Wie kriege ich die Schleifen wirklich unabhängig?

Im Auswerteteil erzeuge ich momentan ein Array, welches ich dann für jeden neuen Datenpunkt vergrößere. Gehe ich richtig in der Annahme, dass ein von Anfang an großes Array, in dem ich dann nur noch Werte ändere, aus Speicherallokationsgründen schneller ist?

Gruß Frank