INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

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!

12.11.2010, 11:37
Beitrag #1

basweber Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Nov 2010

9
2010
de


Deutschland
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?

Schon mal Danke.
Bastian.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
12.11.2010, 12:17
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.11.2010, 13:41
Beitrag #3

basweber Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Nov 2010

9
2010
de


Deutschland
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).


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.11.2010, 14:01
Beitrag #4

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
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. Unsure

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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.11.2010, 17:00
Beitrag #5

basweber Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Nov 2010

9
2010
de


Deutschland
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?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.11.2010, 17:12 (Dieser Beitrag wurde zuletzt bearbeitet: 12.11.2010 17:12 von GerdW.)
Beitrag #6

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
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...

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.11.2010, 09:33 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 09:33 von Matze.)
Beitrag #7

Matze Offline
LVF-Team
LVF-Team

Beiträge: 1.027
Registriert seit: Apr 2010

20xx
2010
DE_EN

7xxxx
Deutschland
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.11.2010, 10:27 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 10:29 von Lucki.)
Beitrag #8

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.11.2010, 10:59 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 11:02 von Matze.)
Beitrag #9

Matze Offline
LVF-Team
LVF-Team

Beiträge: 1.027
Registriert seit: Apr 2010

20xx
2010
DE_EN

7xxxx
Deutschland
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.11.2010, 11:36 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2010 11:45 von Lucki.)
Beitrag #10

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
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?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: