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

Welche Parallelisierungsmethode sollte ich nutzen?

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 17.03.2012, 10:04     Titel: Welche Parallelisierungsmethode sollte ich nutzen?
  Antworten mit Zitat      
Hallo,

ich will eine Berechnung auf 8 Prozessoren verteilen - paralelisieren. Da ich es noch nie gemacht habe und gelesen habe, dass es mehrere Möglichkeiten gibt, würde ich um Hilfestellung bitten.

Problemstellung: ich habe eine Objectarray (user defined objects) mit bis zu 500.000 Objekten. Diese sollen lokal auf 8 Kerne verteilt und auf für jedes Objekt soll ein set an, im Objekt implementierten, Methoden ausgeführt werden. Natürlich sollen dann die Ergebnisse zu dem Client wieder geholt werden.

Welche parallelisierungsmethode wäre jetzt zu verwenden? parfor, spmd, jobs&tasks? Question

Danke!

LG
joekey
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.03.2012, 11:35     Titel:
  Antworten mit Zitat      
Hallo,

Gegenfragen:
Wie sieht dein Code bis jetzt aus?
Wie lange ist die sequentielle Laufzeit? (ggf. überschlagen)
Enthält der Code eine for-Schleife?

Das erste, was ich versuchen würde, ist matlabpool/parfor. Geringster Aufwand, und man kann wenig falsch machen.

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 18.03.2012, 19:54     Titel:
  Antworten mit Zitat      
Hello Harald,

ich habe dein Vorschlag verfolgt und mein Code mit parfor umgebaut. Bei der Ausführung bekomme ich aber eine Fehlermeldung:

Error using parallel_function (line 598)

Undefined variable signalObjects.

Error stack:
cTradingSystem>cTradingSystem.cTradingSystem at 109
cTradingSysCat>(parfor body) at 35

Error in cTradingSysCat/initSystemSet (line 33)
parfor i = 1 : 100%nrTradeSys

Error in systemTest (line 94)
tsc.initSystemSet(titel, tradingSystemSet, stopSet);


Code:

function initSystemSet(obj, titel, tradingSystemSet, stop)
         
            nrTradeSys = size(tradingSystemSet, 1);
            tradingSysSet = cTradingSystem.empty(nrTradeSys,0);

            if matlabpool('size') < 1
                matlabpool open
            end
           
            parfor i = 1 : nrTradeSys
               
                tradingSysSet(i) = cTradingSystem(...
                    i,...                       %system ID
                    titel,...                   %titel
                    stop(1,:),...               %set of stops
                    'o', 'o', 'o', 'o', ...     %enter/exit base
                    0, 0, 0, 0,...              %enter/exit delay
                    tradingSystemSet(i,:), ...   %enterL, enterS, exitL, exitS signal
                    0, ...                      %side (1=long, -1=short, 0=long and short)
                    1, ...                      %closeLastPosition (1=yes, 0=no)
                    1,...                       %minOutPeriods (positive integer or 0)
                    1);                         %pyra (1=no pyra(as one contract traded), >1 max pyra contracts)
               
                %tradingSysSet(i).calculate;
               
            end
           
            if matlabpool('size') > 0
                matlabpool close
            end

           
        end
 



Nur mit For-Schleife kann ich den Code ohne Fehlermeldung ausführen.

Code:

        function initSystemSet(obj, titel, tradingSystemSet, stop)
         
            nrTradeSys = size(tradingSystemSet, 1);
            tradingSysSet = cTradingSystem.empty(nrTradeSys,0);

%             if matlabpool('size') < 1
%                 matlabpool open
%             end
           
            for i = 1 : nrTradeSys
               
                tradingSysSet(i) = cTradingSystem(...
                    i,...                       %system ID
                    titel,...                   %titel
                    stop(1,:),...               %set of stops
                    'o', 'o', 'o', 'o', ...     %enter/exit base
                    0, 0, 0, 0,...              %enter/exit delay
                    tradingSystemSet(i,:), ...   %enterL, enterS, exitL, exitS signal
                    0, ...                      %side (1=long, -1=short, 0=long and short)
                    1, ...                      %closeLastPosition (1=yes, 0=no)
                    1,...                       %minOutPeriods (positive integer or 0)
                    1);                         %pyra (1=no pyra(as one contract traded), >1 max pyra contracts)
               
                %tradingSysSet(i).calculate;
               
            end
           
%             if matlabpool('size') > 0
%                 matlabpool close
%             end

           
        end
 


Und Klassen Konstruktor:

Code:

    methods
        % constructor
        function obj = cTradingSystem(...
                id, ...
                title, ...
                stops,...
                enterLongBase, enterShortBase, exitLongBase, exitShortBase,...
                enterLongDelay, enterShortDelay, exitLongDelay, exitShortDelay,...
                signalObjects,...
                side, closeLastPosition, minOutPeriods,...
                pyra)
            %signalObjects (type: cInvIndi Objects) = enterLong, enterShort, exitLong, exitShort

            %set enter and exit vectors by setting cInvIndi objects
            obj.enterLong  = signalObjects{1};
            obj.enterShort = signalObjects{2};
            obj.exitLong   = signalObjects{3};
            obj.exitShort  = signalObjects{4};

....
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.03.2012, 22:20     Titel:
  Antworten mit Zitat      
Hallo,

schwierig für mich da durchzublicken.
Falls du das nicht mit genauem Hinschauen selbst lösen kannst, könnte es einfacher sein, es mal mit Jobs und Tasks zu versuchen. Dabei darauf achten, dass die Anzahl der Tasks nicht um Größenordnungen größer wird als die Anzahl der Kerne - hier würde ich es mit 16 bis 32 Tasks versuchen (hängt natürlich auch von der Gesamtlaufzeit ab).

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 21.03.2012, 08:38     Titel:
  Antworten mit Zitat      
Hallo Harald,

was ich erzielen will ist:

1) parallel eine ObjektArray zu befüllen (mit UserDefined Objekten)

2) in Objekten der in (1) erstellten Array, eine Calculate Methode ausführen (Zeitintensive berechnung)

3) die in Labs berechnete Objekte wieder in Client zu holen.

Dazu habe ich folgendes Beispiel vorbereitet:

EXAMPLE CLASS:
Code:

classdef cExample < handle

    properties
        data1
        data2
        data3
    end

    methods
        function obj = cExample(data)
            obj.data1 = data;
        end

        function setData2(obj,data)
            obj.data2 = data;
        end
       
        function setData3(obj,data)
            obj.data3 = data;
        end

        function data1 = getData1(obj)
            data1 = obj.data1;
        end
       
        function data1 = getData2(obj)
            data1 = obj.data2;
        end
       
        function calculate(obj)
           
            obj.data1 = 11111111;
            obj.setData2(222222);
            obj.setData3(obj.getData1 + obj.getData2);
        end
    end
end
 


TESTSCRIPT:
Code:

num = 50;

% Initialise array of objects
for n = 1:num
    exArray(n) = cExample(zeros(1,6));
end

%% change data within a parfor loop
if matlabpool('size') < 1
    matlabpool open
end

parfor n = 1:num
    exArray(n).calculate;
end

if matlabpool('size') > 0
    matlabpool close
end
 


1) wenn ich das Script ohne matlabpool starte, alles wird korrekt ausgeführt. D.h. die Properties der Objekte sind korrekt gesetzt.

2) wenn ich das Script mit matlabpool starte, dann kann ich sehen, dass alle Kerne arbeiten. Auch die Bearbeitungszeit ist viel kürzer. Allerdings sind die Properties der Objekte nicht korrekt gesetzt. Schient für mich so zu sein, als wären diese nicht von externen Labs in Client geholt worden.

Kann man hier noch was machen? Oder soll ich einen anderen Weg gehen?

Danke!

Joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da müsste ich selber genauer nachlesen. Um eine schnelle Antwort zu geben: ich würde die Lösung auf diesen Seiten vermuten:
http://www.mathworks.de/help/toolbox/distcomp/bq__cs7-1.html
(Interessant sind alle Teile, die sich auf "handle" beziehen; kannst du mit Strg-F suchen)

http://www.mathworks.de/help/techdoc/matlab_oop/brzyll3.html

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 21.03.2012, 23:33     Titel:
  Antworten mit Zitat      
Hello Harald,

danke für die Links. Ich habe sie mir auch schon angeschaut. Eine direkte Verbindung habe ich so weit nicht gefunden. Werde aber weiter suchen.

LG
Joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

entscheidend sind diese Sätze:
Zitat:
Handle Classes
Changes made to handle classes on the workers during loop iterations are not automatically propagated to the client.


Zitat:
Using Objects in parfor Loops
If you are passing objects into or out of a parfor-loop, the objects must properly facilitate being saved and loaded. For more information, see Saving and Loading Objects.

(Link auf den zweiten Link)

Wie man das Problem nun löst, wurde mir auf die Schnelle aber auch nicht klar. Müsste ich bei Gelegenheit nochmal genauer schauen.

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 22.03.2012, 08:57     Titel:
  Antworten mit Zitat      
Hello Harald,

Smile hehe, genau die gleichen Sätze habe ich mit meinem Problem auch bereit untersucht. Eindeutig ist da nichts näher beschrieben. Bin aber dran Wink

LG
Joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 25.03.2012, 20:25     Titel:
  Antworten mit Zitat      
Hello Harald,

Zitat:

Handle Classes
Changes made to handle classes on the workers during loop iterations are not automatically propagated to the client.


Da dies nicht automatisch passiert muss es erzwungen werden und zwar durch die Rückgabe von Objekt-Handle:

Code:
function obj = calculate(obj)
           
            obj.data1 = 11111111;
            obj.setData2(222222);
            obj.setData3(obj.getData1 + obj.getData2);
        end


So funktioniert mein Beispiel.

Danke für die Unterstützung.

PS: Ich habe aber ein neues Problem. Dazu werde ich ein neues Ticket öffnen.

LG
joekey
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.