Schieberegister -> array-Kopie in jedem Durchlauf?
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Schieberegister -> array-Kopie in jedem Durchlauf?
Hallo,
ich habe mal eine grundsätzliche Frage vor folgendem Hintergrund:
Ich initialisiere einen array (2d) außerhalb einer Schleife. Damit initialisiere ich dann ein Schieberegister einer zeitkritischen Schliefe (10ms, soll auf einer cRIO laufen).
In der Schleife will ich dann in den Array schreiben, wobei der Index erst während der Schleifenausführung berechnet wird. Das ganze ist ein Ringspeicher.
Jetzt habe ich festgestellt, dass die Ausführungszeit der Schleife von der Arraygröße abhängt. Das erscheint mir erstmal unlogisch, es sei denn das Schieberegister sorgt dafür, dass in jedem Schleifendurchlauf eine Kopie des Arrays angelegt wird.
Die Frage lautet:
Ist das so?
Und wenn ja: wie kann man das umgehen?
Vielleicht mit einem FIFO, oder einer Queue?
Schieberegister -> array-Kopie in jedem Durchlauf?
' schrieb:In der Schleife will ich dann in den Array schreiben, wobei der Index erst während der Schleifenausführung berechnet wird. Das ganze ist ein Ringspeicher.
So mach ich das auch. Die Operation heißt dann "In Array ersetzen".
Zitat:Jetzt habe ich festgestellt, dass die Ausführungszeit der Schleife von der Arraygröße abhängt.
Diese Zeit muss ja nicht zwangsläufig durch das Schieberegister bedingt sein.
Es könnte in der Schleife Code stehen, der selbst je nach Arraygröße kürzer oder länger dauert. Außerdem folgendes: ggf. wird für 1D-Ersetzen Speicher für die zu kopierenden 1D-Daten benötigt.
Genauere Aussagen kann man nur mit Kenntnis des Schleifeninhaltes machen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Schieberegister -> array-Kopie in jedem Durchlauf?
Zitat:Diese Zeit muss ja nicht zwangsläufig durch das Schieberegister bedingt sein.
Es könnte in der Schleife Code stehen, der selbst je nach Arraygröße kürzer oder länger dauert. Außerdem folgendes: ggf. wird für 1D-Ersetzen Speicher für die zu kopierenden 1D-Daten benötigt
Hmm, dass glaube ich nicht. In der Schleife wird nur der Index hochgezählt.
Ich habe mal alles irrelevante rausgeschmissen (der Code hing aber auch nicht von vom Array ab sondern hat andere Sachen gemacht).
Schieberegister -> array-Kopie in jedem Durchlauf?
' schrieb:In der Schleife wird nur der Index hochgezählt.
Ich sach mal so: 1000*5*dbl ist ja eigentlich gar nichts. Ich mach sowas mit 180.000*40*dbl. Ich hab da nie Probleme.
Was so ein cRIO allerdings alles macht (respektive anders macht als ein PC) weis ich nicht.
Im übrigen rate ich anstelle der globalen Variablen zu einem Melder (respektive zwei: einen für den Stopp, einen für die Daten) wenn das denn mit cRIO geht.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Schieberegister -> array-Kopie in jedem Durchlauf?
Zitat:Ich sach mal so: 1000*5*dbl ist ja eigentlich gar nichts.
Denke ich eigentlich auch, aber die ZyklusZeit ist nur 10ms.
Mit 1000 geht es auch noch. Bei 6000 hatte ich Probleme bekommen.
Die Schleife führt sonst noch einen Matlab-Skriptknoten aus, der (bisher) aber auch noch nichts aufwendiges macht. Ein paar Bedingungen prüfen paar skalara Berechnungen.
Diese Berechnungen sollen aber noch deutlich ausgebaut werden.
Die Sache mit Meldern hatte ich auch schon überlegt, aber das erschien mir erstmal umständlicher als mit globalen Variablen. Was ist denn der Vorteil von Meldern?
Nochmal zurück zur eigentlichen Frage:
Wird nun durch die Schieberegister-Konstruktion jedesmal eine Kopie des arrays angelegt? Weiß das jemand, bzw. wo kann man darüber was nachlesen?
12.11.2010, 17:12 (Dieser Beitrag wurde zuletzt bearbeitet: 12.11.2010 17:12 von GerdW.)
Schieberegister -> array-Kopie in jedem Durchlauf?
Hallo,
Zitat:jedesmal eine Kopie
Das Schieberegister selbst erzeugt keine Kopie. Das ist ja gerade der Vorteil eines SR (oder auch FeedbackNode). Wenn du mittendrin auch keine Kopien erzeugst (wonach es aussieht), ist alles ok.
Zitat:Die Schleife führt sonst noch einen Matlab-Skriptknoten aus, der (bisher) aber auch noch nichts aufwendiges macht. Ein paar Bedingungen prüfen paar skalara Berechnungen.
Schon mal überlegt, diese "nicht aufwendigen" Dinge direkt in LabVIEW zu erledigen? Der Matlab-Knoten gehört nicht zu den schnellsten Konstrukten in LabVIEW...
Schieberegister -> array-Kopie in jedem Durchlauf?
' schrieb:Im übrigen rate ich anstelle der globalen Variablen zu einem Melder (respektive zwei: einen für den Stopp, einen für die Daten) wenn das denn mit cRIO geht.
Davon rate ich ab. Wobei man hier abwägen muss, worum es geht.
Melder und Queues funktionieren auf dem cRIO. Was viele jedoch nicht wissen: Diese sind nicht deterministisch.
Werden hin und wieder Aktionen ausgeführt, wie eine Anforderung, Daten zu speichern o.ä., was sowieso nicht deterministisch ist, dann ist das in Ordnung. Werden jedoch fortlaufend Messdaten von einer Schleife in eine andere übertragen, empfehle ich den Einsatz von Meldern und Queues nicht!
Hier sollte auf die RT-FIFOs zurückgegriffen werden. Es lässt sich dort auch eine FIFO-Größe von 1 einstellen und die Option, dass Daten überschrieben werden, falls der FIFO voll sein sollte. Somit kann man hier auch die Melder-Funktion umsetzen.
Grüße
Matze
Grüße
14.11.2010, 10:27 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 10:29 von Lucki.)
Schieberegister -> array-Kopie in jedem Durchlauf?
' schrieb:Das Schieberegister selbst erzeugt keine Kopie. Das ist ja gerade der Vorteil eines SR (oder auch FeedbackNode). Wenn du mittendrin auch keine Kopien erzeugst (wonach es aussieht), ist alles ok.
Die Betonung bei dieser richtigen Antwort liegt auf dem Wörtchen "selbst". Wenn nämlich der Inhalt des Schieberegisters bei jedem Durchlauf durch ein Sub-VI geschleußt wird, werden schon Kopien erzeugt. Ich würde auf jeden Fall mal probieren, ob sich die Geschwindigkeit ändert, wenn man das bissel Zeugs im SubVI direkt im HauptVI macht.
14.11.2010, 10:59 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 11:02 von Matze.)
Schieberegister -> array-Kopie in jedem Durchlauf?
' schrieb:Wenn nämlich der Inhalt des Schieberegisters bei jedem Durchlauf durch ein Sub-VI geschleußt wird, werden schon Kopien erzeugt. Ich würde auf jeden Fall mal probieren, ob sich die Geschwindigkeit ändert, wenn man das bissel Zeugs im SubVI direkt im HauptVI macht.
Jupp, die Idee ist gut. Es könnte natürlich sein, dass der Kompiler so clever ist und erkennt, dass das Array nur durchgereicht wird. Dann würde keine Kopie erstellt werden (ich hoffe zumindest, dass keine erstellt wird). Aber probieren geht über studieren.
Da der Themenersteller LabVIEW 2010 nutzt, geht das sogar ganz einfach:
SubVI öffnen - Datei: VI-Einstellungen - Ausführung: Haken bei "SubVI inline einfügen" (und die entsprechend markierten Häkchen setzen/entfernen)
Das nur als Tipp, bevor da groß Code kopiert wird.
Edit: Ach Mist, verlesen. LV-Erfahrung seit 2010 und LV-Version 9. Sorry, dann geht das so meines Wissens doch nicht.
Grüße
14.11.2010, 11:36 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 11:45 von Lucki.)
Schieberegister -> array-Kopie in jedem Durchlauf?
' schrieb:Es könnte natürlich sein, dass der Kompiler so clever ist und erkennt, dass das Array nur durchgereicht wird. Dann würde keine Kopie erstellt werden (ich hoffe zumindest, dass keine erstellt wird). Aber probieren geht über studieren.
Optimal wäre natürlich, wenn der Compiler so clever wäre zu erkennen, daß das SubVI nur ein einziges Mal verwendet wird und er die Hierarche dann einebnet, so daß also der "Machinencode" gar keinen SubVI-Aufruf enthält.
Ich erinnere mich ganz dunkel an so eine Compiler-Option ("$Inline") bei Turbo-Pascal. Da wurde dann der entsprechende SuVI-Code direkt in das Haupt-VI eingebettet, so daß es keine SubVI-Aufrufe mehr gab, der Code aber (bei mehrfacher Verwendung des SubVIs) länger wurde.
Was Du für LV2010 erwähntes, wird wohl genau das sein.
OFFtopic zum Sonntag: Du bist ja noch gar noch so lange im LV-Forum, und bei Dir bin ich am meisten erstaunt über die Steilheit Deiner Lernkurve seit dieser Zeit. Wie hast Du das nur gemacht? Hattest Du vielleicht das Glück, daß Deine Firma Dir tausende von Euro für NI-Lehrgänge spendiert hat?