2016-06-28 3 views
-1

Gibt es eine Möglichkeit, eine Anzahl von Variablen an die Arbeiter eines Parpools zu senden?Wie sende ich eine Anzahl von Variablen an die Arbeiter eines Parpools in MATLAB?

Zum Beispiel möchte ich jedem Arbeiter die Gesamtzahl der Arbeiter im Parpool mitteilen. Oder ich habe vielleicht ein paar Berechnungen, die nur einmal gemacht und zwischen bestimmten Arbeitern oder allen geteilt werden. Ich denke, dass es für jeden Arbeiter eine Verschwendung von Ressourcen und Zeit ist, die Berechnungen so zu machen, dass sie nur einmal gemacht werden.

Eg.

*Some calculations processed and a number of variables generated 

NumWorkers = 32; 
ParallelPool = parpool(NumWorkers); 

*Pass the just variables generated to the workers 

pctRunOnAll NumWorkers = 32; 
pctRunOnAll ParallelScript 

Im Moment, ich sage jedem Arbeiter die Gesamtzahl der Arbeiter der pctRunOnAll Befehl Funktion, aber ich mag das nicht, weil ich die Zahl der Arbeitnehmer an zwei Stellen ändern müssen, und es ist wahrscheinlich zu verursachen ein Fehler, wenn ich vermasseln. Ich möchte das auch so erweitern, dass ich eine Reihe von Variablen weitergeben kann.

Dank

Antwort

0

Meine Lösung ist Eval zu verwenden. Es ist eine ziemlich einfache Lösung und ich weiß nicht, warum ich nicht früher darüber nachgedacht habe. Ich habe nach alternativen Lösungen gesucht, aber ich kann einfach nichts finden. Es ist keine elegante Lösung, aber es funktioniert.

Eg.

*Some calculations to obtain the following variables 

Variable1 = 12; 
Variable2 = 65; 
Variable3 = 1205; 
Variable4 = 16542; 


cmd = ['pctRunOnAll Variable1 = ' num2str(Variable1) ';']; 
eval(cmd) 
cmd = ['pctRunOnAll Variable2 = ' num2str(Variable2) ';']; 
eval(cmd) 
cmd = ['pctRunOnAll Variable3 = ' num2str(Variable3) ';']; 
eval(cmd) 
cmd = ['pctRunOnAll Variable4 = ' num2str(Variable4) ';']; 
eval(cmd) 
0

ich so etwas tun würde:

%Some calculations processed and a number of variables generated 

NumWorkers = 32; 
ParallelPool = parpool(NumWorkers); 

parfor ixWorker = 1:NumWorkers 
    ParrallelFunction(NumWorkers, otherVariable, stillMoreVariables) 
end 

Einige Anmerkungen:

  1. Ich bedauere immer Skripte statt Funktionen ausgeführt werden. Was auch immer Sie in Ihrem Skript tun, viele Dinge (Parallelisierung ist eine von ihnen) werden einfacher, sobald Sie es in eine Funktion konvertieren.

  2. Der Befehl parfor ist eine einfache Möglichkeit, etwas N mal auszuführen, wo das nicht unbedingt die gleiche Größe wie der Worker-Pool ist. Wenn Sie beispielsweise einen Monte-Carlo-Style-Lauf mit 100 Samples ausführen, verwenden Sie einfach parfor ix = 1:100, und Matlab behält alle Workers beschäftigt, bis 100 Executionen abgeschlossen sind.

+0

Warum bereuen Sie es, Dinge als Skripte statt als Funktionen auszuführen? Ich denke, abhängig davon, was Sie mit ihnen machen wollen und wie viel Sie sie bearbeiten müssen, ist der entscheidende Faktor, ob Code als Skript oder als Funktion ausgeführt werden soll. Ich hätte Parfor verwendet, aber der Simulator, den ich benutze, mag Parfor nicht, weshalb ich stattdessen pctRunOnAll verwende. Haben Sie Ideen, wie Sie Variablen an die Mitarbeiter weitergeben können? Meine einzige Lösung besteht darin, Daten in eine Datei zu schreiben und dann die Worker dazu zu bringen, die Datei zu laden. Aber ich fühle, dass dies eine chaotische Lösung ist. – Bobby

+0

Ich bedauere normalerweise laufende Skripte aus vielen Gründen. Unter anderem bedeutet der globale Arbeitsbereich von Skripts, dass ich Änderungen an Variablen immer ausgeblendet habe, und es ist schwierig, Ein-/Ausgaben in Bezug auf Skripts zu verwalten. Wie Sie hier finden. Es scheint, als ob das Hauptproblem, das Sie haben, ist, dass "Parfor" nicht funktioniert. Warum nicht? Was meinst du "Simulator, den ich benutze, mag Parfor nicht"? Es scheint eine lustige Hacking-Übung zu sein, um den Arbeitern Variablen zuzuweisen, ohne die entsprechenden Werkzeuge (Funktionen und Parfor) zu verwenden, aber ich würde es hassen, sich darauf zu verlassen. (Ich habe mir auch nicht viel Gedanken gemacht.) – Pursuit

+0

Der Simulator mag Parfor nicht, weil er nur einmal instanziiert werden möchte. Das Erstellen mehrerer Instanzen des Simulators funktioniert nicht und verursacht einen Fehler.Parfor arbeitet nicht an einer zeilenweisen Simulation, da der instanziierte Simulator nur jeweils eine Simulation akzeptiert. Daher funktioniert die Verwendung des Simulators mit Parfor nicht und es kann nur an mehreren Instanzen von MATLAB arbeiten - also pctRunOnAll. Es ist genau so, wie der Entwickler die Software erstellt hat. – Bobby

Verwandte Themen