WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Parallelisierung parfor

 

Alex4456
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2014, 09:05     Titel: Parallelisierung parfor
  Antworten mit Zitat      
Hallo,

ich fange gerade erst mit dem Thema an. Ich habe mir die Hilfe soweit durchgelesen und das Grundprinzip verstanden. Leider bin ich mir bei einigen Sachen nicht ganz sicher. Ich versuche gerade eine recht komplexe(große) For Schleife auf parfor umzustellen. Falls jemand dafür ein gutes Tutorial hat bin ich dankbar.

Code:
Data = cell(100,2);
parfor ii=1:100
    Data{ii,1} = 2;
    Data{ii,2} = ii;
end
 


Ich bekomme den Fehler: fix the usage of indicated variable matlab
Mir ist bekannt, dass die Variablen in der parfor einer gewissen Klassifikation unterliegen (sliced etc.). Leider weiß ich nicht woran es hier scheitert.

Wäre für Hilfe dankbar Smile.


Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.10.2014, 09:39     Titel:
  Antworten mit Zitat      
Hallo,

so sollte es gehen:
Code:
Data = cell(100,2);
parfor ii=1:100
    localData = {2, ii};
    Data(ii, :) = localData;
end


Bei Parallelisierung kann auch folgendes helfen:
http://www.mathworks.de/products/pa.....-computing/tutorials.html
Bei Problemen mit parfor insbesondere das dritte Video. Bei einer komplexen for-Schleife bietet es sich an, den Inhalt der for-Schleife in eine Funktion auszulagern.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2014, 11:54     Titel:
  Antworten mit Zitat      
Ah ok, danke dir. Also müsste man quasi immer die gesamten Daten auf einmal zuweisen und kann icht einzelne Spalten ansprechen?

Ich habe versucht mein Skript mit parfor zu optimieren aber das hat leider nicht ganz so funktioniert.. im wesentlichen versuche ich viele fit-Befehle gleichzeitig aufzuführen, da diese am meisten zeit beanspruchen.

Gibt es daneben eigentlich auch die Möglichkeit ein M.-File ganz oft gleichzeitig auszuführen?
Ich habe ein Skript was Dateien analysiert. Kann Ich mit der parallel Toolbox auch gleichzeitig mehrere Dateien zu bearbeitet? So quasi das parfor umgehen?
Quasi = parfor function(sript) end
ohne das ich jetzt das eigentliche Skript ändern muss? Ich bekomme momentan ein Fehler, finde ihn jedoch nicht. Ist das überhaupt generell möglich?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.10.2014, 14:12     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ah ok, danke dir. Also müsste man quasi immer die gesamten Daten auf einmal zuweisen und kann icht einzelne Spalten ansprechen?

Typischerweise einzelne Zeilen oder einzelne Spalten, aber nicht beides.

Zitat:
Gibt es daneben eigentlich auch die Möglichkeit ein M.-File ganz oft gleichzeitig auszuführen?

Das würde ich sogar als Hauptanwendung sehen:
Code:
list = dir('*.txt');
names = {list.names};
parfor I = 1:numel(names)
data{I} = analyzeFiles(names{I});
end

Dabei sollte analyzeFiles eine Funktion sein, die den Dateinamen entgegennimmt und die Daten zurückgibt. Skripten sind für den Zweck nicht besonders geeignet.

Zitat:
Ich bekomme momentan ein Fehler, finde ihn jedoch nicht.

Welcher Code produziert welchen Fehler?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2014, 14:32     Titel:
  Antworten mit Zitat      
Hallo Harald,
ich hatte das schon so gemacht wie du in deinem Vorschlag jetzt, nämlich mStartSkript :
Code:


path = '';
files = fcnSearchFiles(path,'mat');

parfor ii=1:size(files,1)
    dateiAnalyse(Inputs);
end


meiner Fehler lautet wie folgt:

Code:

Error using parallel_function (line 589)

Only M functions may eval a parfor or spmd statement.
 See Parallel Computing Toolbox documentation about Transparency.

Error stack:
(No remote error stack)
Error in mStartSkript (line 7)
parfor ii=1:size(files,1)


Gibt es eine Möglichkeit einen genauere Fehler also von der Zeile des dateiAnalyse Skripts zu bekommen? Ein normales Debugging ist soweit ich weiß nicht möglich?
Müss ich das Skript dateiAnalyse.m jetzt auch nach den Regeln der parfor Schleife umwandeln? z.B habe ich save(..) was normalerweise in parfors nicht erlaubt ist und mit andere funktion parsave() umgegangen werden muss. Das allein hat den Fehler noch nicht behoben.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.10.2014, 16:09     Titel:
  Antworten mit Zitat      
Hallo,

die Meldung habe ich so noch nicht gesehen.
Kannst du testhalber mal das Abspeichern in .mat-Dateien auskommentieren?

Folgendes hat bei mir übrigens problemlos funktioniert:
Code:
function parfor_test
parfor I = 1:10
   savedata(I, ['squares' num2str(I)])
end

function savedata(in, fname)
square = in^2; %#ok<NASGU>
save(fname, 'square')


Zitat:
Müss ich das Skript dateiAnalyse.m jetzt auch nach den Regeln der parfor Schleife umwandeln?

Es sollte wie gesagt eine Funktion sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2014, 08:18     Titel:
  Antworten mit Zitat      
Guten Morgen.

Also ich habe dein Testbeispiel ausprobiert. Es funktioniert ohne Probleme.

Meine eigene Funktion funktioniert mit FOR geht gut jedoch gibt es wie gesagt den Fehler bei PARFOR. Ich bin jetzt etwas ratlos, da der Fehler ja sehr unspezifisch ist. Kann ich den Fehler genauer bestimmen?.

Eine grundsätzliche Frage: Versucht matlab jetzt die Funktion savedata parallel auszuführen oder nur auf einem Core? Eigentlich sollte ja letzteres der Fall sein.

Gibt es vielleicht eine Alternativmöglichkeit die Aufgaben über batch zuverteilen?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.10.2014, 08:26     Titel:
  Antworten mit Zitat      
Hallo,

wie gesagt: versuch mal, das Speichern auszukommentieren.
Markiert Code Analyzer etwas in dem Code?

Wenn du den Code zur Verfügung stellst, schau ich mir ihn gerne mal an.

Ansonsten gäbe es die Möglichkeit, mit createJob/createTask zu arbeiten, was aber doch ein gewisser Zusatzaufwand ist.

Zitat:
Eine grundsätzliche Frage: Versucht matlab jetzt die Funktion savedata parallel auszuführen oder nur auf einem Core? Eigentlich sollte ja letzteres der Fall sein.

Ich würde sagen: Parallel, da es innerhalb von parfor ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2014, 08:43     Titel:
  Antworten mit Zitat      
Trotz deiner guten Erklärung im zweiten Beitrag bezüglich des Auslesen von Spalten im Cellarray, habe ich den gleichen Fehler wieder gemacht und die Inputs für meine Funktion mit input{ii,1} input{ii,2} angesprochen, was dann zum Fehler geführt hat. Muss mich erst noch daran gewöhnen.

Komischerweise hat er das nicht im Code markiert. Aber danke soweit, es läuft jetzt soweit alles parallel mit einer CPU Auslastung von 100%

Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.