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

Nutzung von parfor oder smpd für ARIMA

 

tommylabamba
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2016, 18:13     Titel: Nutzung von parfor oder smpd für ARIMA
  Antworten mit Zitat      
Ich möchte gerne parfor für parallelle Berechnungen nutzen.
Der Matlab Code läuft ja sequetiell ab.
Nur in Schleifen würde dann parfor zum Einsatz kommen, um die 2 Rechenkerne der CPU auszunutzen. In meinem Fall vielleicht gerade-s: 1. Kern, ungerade-s: 2. Kern. (s = max. 3 im Code)

Ich habe keinerlei Erfahrungen mit parfor.
Die einfachste und schnellste Lösung erscheint mir jedoch damit.
Leider verweigert er parfor bei diesem Code mit der Fehlerausgabe:
Code:
Error: The variable f in a parfor cannot be classified.


Ziel: die Rechnezeit senken, 2 Rechenkerne der CPU nutzen. Die schnellste und einfachste Lösung wird bevorzugt.

Hier mein Code:
Code:
clear all
clc

n = 3;

%% dient zur Erzeugung von Randwerten um den Code lauffähig zu gestalten
for s = 1:n
    for i = 1:1000
        randwerte(i,1) = rand(1) * 100;
    end
    data{s}.werte = randwerte;
end

clear randwerte i

% Matrix definieren
matrix = 5;
L = zeros(matrix, matrix);
P = zeros(matrix, matrix);  

%% der eigentliche rechenaufwentige Code (hier möchte ich gerne Rechenzeit einsparen durch Einsatz von parfor oder smpd)
%% Prolbem: die einfachste Lösung mit parfor geht nicht, und ich weiß nicht warum?
tic
for s = 1:n
    for p = 1:matrix
        for q = 1:matrix  %% hier wurde mit parfor alles mögliche versucht !
            model = arima(p, 0, q);
            [f{s}, ~, l{s}] = estimate(model, data{s}.werte, 'print', false);
            L(p, q) = l{s};  
            P(p, q) = p + q;  
        end
        L1{s} = L;
        P1{s} = P;
    end
end
toc

fprintf('Die Rechenzeit beträgt: %d', toc)


Über Eure Hilfe bin ich sehr dankbar.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.01.2016, 19:28     Titel: Re: Nutzung von parfor oder smpd für ARIMA
  Antworten mit Zitat      
Hallo tommylabamba,

Einerseits würde ich f und l noch als CELL initialisieren. Andererseits bleibt dann das Problem, dass f{s} in jeder Iteration der inneren Schleifen überschrieben wird. Wenn Du das dann parallelisierst, ist es zufällig, welchen Wert f{s} am Schluss hat.

Welchen Wert möchtest Du denn in f{s} stehen haben?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
tommylabamba
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.01.2016, 02:36     Titel:
  Antworten mit Zitat      
Ich habe das hier als Lösungsvorschlag gefunden, kann damit aber nichts anfangen:

"All variables written to within the body of a parfor loop must be analysed and
put into one of the categories. Usually, when you're writing to a variable, you
want it to be "sliced" - that means that each iteration of the loop supplies one
value (or a set of values). For the analysis to deduce that's what's happening,
the variable that you write to must be indexed with one of the indices being the
loop variable, and the other indices being the same for each iteration. E.g:

Code:
parfor ii=1:10
  x(:,ii) = rand( 3, 1 );
end


is valid since the indices are ":" and "ii". However, in your example you've got:

Code:
parfor i=1:length(X)
  count(row(i),column(i))=count(row(i),column(i))+1;
end


You've got two rule violations here - firstly, you've got two varying indices,
and secondly, the indices are not simply the loop variable "i"."

Zurück zu Deiner Frage:
s hat die Werte 1 bis 3, also im Prinzip durchlaufe ich momentan 3 mal die gleiche Schleife mit anderen Werten in struct mit 1 Kern. Und das dauert ganz schön lange, wenn ich matrix = 10 erhöhe.
Den oberen Vorschlag (in Englisch) verstehe ich so, das ich jede Spalte und Zeile einzeln indexieren muss. Das habe ich versucht, geht trotzdem nicht, weil ich denke, das Matlab s in der inneren Schleife nicht mehr kennt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.01.2016, 11:37     Titel:
  Antworten mit Zitat      
Hallo tommylabamba,
Zitat:
Das habe ich versucht, geht trotzdem nicht, weil ich denke, das Matlab s in der inneren Schleife nicht mehr kennt.

Ohne Kristall-Kugel kann ich nicht sehen, was Du versucht hast und woran es gescheitert ist. Die Idee, dass "Matlab in der inneren Schleife s nicht mehr kennt" ist nicht plausibel. Matlab vergisst keine Variablen.

Ich wiederhole nochmal meinen Lösungsvorschlag, denn er ist offenbar nicht bei Dir angekommen:
Code:
for q = 1:matrix  %% hier wurde mit parfor alles mögliche versucht !
            model = arima(p, 0, q);
            [f{s}, ~, l{s}] = estimate(model, data{s}.werte, 'print', false);
        end

Hier wird f{s} immer wieder überschrieben. In einer FOR-Schleife wird zum Schluss der Wert von "q=matrix" in f{s} stehen. In einer PARFOR-Schleife wird aber der Body der Schleife eben nicht sequentiell bearbeitet, sondern parallel. Deshalb ist nicht definiert, welcher Wert zum Schluss in f{s} stehen wird. Matlab muss aber annehmen, dass der Wert dieser Variablen von Interesse ist, sonst würdet Du ihn ja nicht in einem Cell-Array speichern.

Deshalb nochmal: Brauchst Du den Wert von f{s} später und ist es sinnvoll, dass er immer wieder überschrieben wird? Wenn Du die innere Schleife per PARFOR parallelisieren möchtest, muss das an f{s} und l{s} scheitern, da Matlab nicht dafür sorgen kann, dass die gleichen Werte wie beim sequentiellen FOR drin stehen. Ersetze also f{s} und l{s} durch etwas, was Du eigentlich brauchst. Vielleicht: f{s, p, q}. Dann wäre wieder alles eindeutig. (Pre-allocation nicht vergessen)

Jetzt klarer?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
tommylabamba
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 08.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.01.2016, 12:05     Titel:
  Antworten mit Zitat      
Ich habe schon für f{s} das versucht:
Code:
data{s}.f(:,1) bzw. f{s}(:,1)

also im Prinzip jede Variable bis äußerste indexiert.

Jan S hat Folgendes geschrieben:

Deshalb nochmal: Brauchst Du den Wert von f{s} später und ist es sinnvoll, dass er immer wieder überschrieben wird?

Nein, den Zwischenwert von s = 1..3 brauche ich nicht. Nur alle 3 als Endwert in struct entweder als f{s} oder als data{s}.f .

Soll ich etwa f{s} in der inneren Schleife durch data{s}.k ersetzen? k wäre dann f, allerdings dann data{s}.f am Ende von parfor.

Da s ja durch s = 1:n (n = 3) definiert ist, kann ich auch sagen f{:} ?

Sorry, ich stehe auf dem Schlauch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.01.2016, 12:58     Titel:
  Antworten mit Zitat      
Hallo tommylabamba,
Zitat:
Sorry, ich stehe auf dem Schlauch.

Stimmt Smile

Nochmal in langsam und vereinfacht:
Code:
for s = 1:3
  parfor q = 1:matrix  %% hier wurde mit parfor alles mögliche versucht !
     f{s} = q;
  end
end

Dies muss scheitern, weil der Endwert von f{s} unbestimmt ist. Man kann es auch noch weiter vereinfachen:
Code:
parfor q = 1:5
  v = q;
end
disp(v)

Wenn dies eine FOR-Schleife ist, wird v den Wert 5 haben. In einer PARFOR-Schleife ist der Endwert aber zufällig eine der Zahlen 1 bis 5. Das hängt nur davon ab, welcher Thread zufällig am längsten braucht. Und hier sollte Matlab die Arbeit verweigern, denn solche zufälligen Endwerte sind sinnlos.

f{s} oder irgendeine andere Variable in jeder PARFOR-Iteration zu überschreiben, ist also ein grundsätzliches Problem. "data{s}.f" würde genau das selbe Problem erzeugen.

Wird es jetzt klarer? Ausprobieren kann ich es nicht, da ich die benötigten Toolboxen nicht habe.

Gruß, Jan
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.