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

Parallel Computing Toolbox - (co)Distributed Array

 

r054c1
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.17
Wohnort: ---
Version: Ab 2013b
     Beitrag Verfasst am: 08.05.2017, 21:19     Titel: Parallel Computing Toolbox - (co)Distributed Array
  Antworten mit Zitat      
Guten Abend - Hallo,

ich habe eine Frage bezüglich der "Distributed Arrays" unter MATLAB.

Meine Vorkenntnisse: MATLAB + GUI vorhanden, Parallel Computing: erste Berührung im Rahmen dieses Projekts.

Parallel Profil: Local 4 (bzw. 8 ) Prozessoren.

System: Ich habe ein (co)distrubted Array, in einer spmd Umgebung angelegt. Dieses Array hat eine var. Größe, soll später aber in der Größenordnung 1000x1000x1000 sein.

Problem: Es müssen diverse Berechnungen durchgeführt werden, wobei
es dazu kommt, dass benachbarte Zellen voneinander abgezogen werden.

z.B. k(i,l.m) - k(i+1,l,m)

MATLAB meckert und ich hoffe, dass ich dies richtig deute, nämlich wie folgt:

Irgendwann ist die nächste Zelle, auf einem anderen Worker und darauf kann nicht zugegriffen werden.

Frage: Wie geht man mit diesen Übergängen in MATLAB um? Ein Ansatz meinerseits wäre da, aber dieser ergibt leider kein geschlossenes Bild, weshalb ich auch hier Rat suche. Wofür ich mich schonmal bedanke.

Mit freundlichen Grüßen
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.05.2017, 21:41     Titel:
  Antworten mit Zitat      
Hallo,

Code:
k(i,l.m) - k(i+1,l,m)

solche Operationen sollten, sofern du statt dem "." ein "," setzt, kein Problem sein - immer vorausgesetzt, dass die Indizies im zulässigen Bereich bleiben.

Zitat:
MATLAB meckert und ich hoffe, dass ich dies richtig deute

Wenn du die Fehlermeldung postest, kann man dir eher sagen, ob du das richtig deutest.

Minibeispiel:
Code:
A = distributed(1:4)
spmd, A(1:end-1) - A(2:end), end


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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.17
Wohnort: ---
Version: Ab 2013b
     Beitrag Verfasst am: 09.05.2017, 21:04     Titel:
  Antworten mit Zitat      
Hallo,
erstmal danke für deine Antwort. Der "." war ein Tippfehler hier im Forum.
Den Code und die Meldung, werde ich am Donnerstag nachreichen.

Grüße Daniel

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
r054c1
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.17
Wohnort: ---
Version: Ab 2013b
     Beitrag Verfasst am: 11.05.2017, 10:47     Titel:
  Antworten mit Zitat      
Guten Tag,
ich habe meinen Code, nochmal abstrakt und vereinfacht abgebildet und jetzt funktioniert es:

Code:

        A = randi(5,5,5,5);
        B = zeros(5,5,5);
        A = distributed(A);
        B = distributed(B);
       
        disp('Ab hier SPMD: ')
        spmd
            A
            B
            for i = 1:4
                for j = 1:4
                    for k = 1:4
                       B(k,j,i) = A(k,j,i)-A(k+1,j,i);
                    end
                end
            end
        end
        disp(B);
 


Allerdings muss ich noch eine Frage stellen, da ich dies jetzt local ausprobiert habe. Bevor ich mein Programm aufs Cluster schiebe, will ich mir erst sicher sein, das alles funktioniert.

Gibt es bei der obigen Funktionsweise, zwischen lokalem Profil und Cluster unterschiede?

Danke fuer die Hilfe.

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2017, 17:41     Titel:
  Antworten mit Zitat      
Hallo,

grundsätzlich nicht, solange benötigte Daten und Code zur Verfügung stehen.
Der Datentransfer auf einen Cluster und zwischen Cluster-Rechnern kann auch länger dauern.

Ich weiß nicht, wie gut der Code hier deinen tatsächlichen Code repräsentiert.
Ein Problem ist hier, dass ja alle Worker denselben Code ausführen. Man könnte z.B. über labindex aufteilen. Im Code hier ließe sich auch durch Vektorisierung und Nutzung von diff einiges gewinnen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.17
Wohnort: ---
Version: Ab 2013b
     Beitrag Verfasst am: 21.06.2017, 13:37     Titel:
  Antworten mit Zitat      
Hallo,
es ist eine weitere Frage, zum selben Sachverhalt entstanden. Vielleicht koennt ihr mir helfen.

Code:

                % Presure calculation split on four workers
                if labindex == 1
                    pAFIT(1:end-1,1:end-1,1:ceil((end-1)/4)) = beta(:,:,1:ceil(end/4)).*...
                                                     (v1(2:end,2:end,2:ceil(end/4))-v1(1:end-1,2:end,2:ceil(end/4))...
                                                     +v2(2:end,2:end,2:ceil(end/4))-v2(2:end,1:end-1,2:ceil(end/4))...
                                                     +v3(2:end,2:end,2:ceil(end/4))-v3(2:end,2:end,1:ceil(end/4)-1));
                elseif labindex == 2          
                    pAFIT(1:end-1,1:end-1,ceil((end-1)/4)+1:ceil(2*((end-1)/4))) = beta(:,:,ceil(end/4):2*ceil(end/4)).*...
                                                     (v1(2:end,2:end,ceil(end/4)+1:2*ceil(end/4))-v1(1:end-1,2:end,ceil(end/4)+1:2*ceil(end/4))...
                                                     +v2(2:end,2:end,ceil(end/4)+1:2*ceil(end/4))-v2(2:end,1:end-1,ceil(end/4)+1:2*ceil(end/4))...
                                                     +v3(2:end,2:end,ceil(end/4)+1:2*ceil(end/4))-v3(2:end,2:end,ceil(end/4):2*ceil(end/4)-1));                                            
                elseif labindex == 3
                    pAFIT(1:end-1,1:end-1,ceil(2*((end-1)/4))+1:ceil(3*((end-1)/4))) = beta(:,:,ceil(2*((end-1)/4))+1:ceil(3*((end-1)/4))).*...
                                                     (v1(2:end,2:end,2*ceil(end/4)+1:3*ceil(end/4))-v1(1:end-1,2:end,2*ceil(end/4)+1:3*ceil(end/4))...
                                                     +v2(2:end,2:end,2*ceil(end/4)+1:3*ceil(end/4))-v2(2:end,1:end-1,2*ceil(end/4)+1:3*ceil(end/4))...
                                                     +v3(2:end,2:end,2*ceil(end/4)+1:3*ceil(end/4))-v3(2:end,2:end,2*ceil(end/4):3*ceil(end/4)-1));                                        
                elseif labindex == 4              
                    pAFIT(1:end-1,1:end-1,ceil(3*((end-1)/4))+1:end-1) = beta(:,:,ceil(3*((end-1)/4))+1:end-1).*...
                                                     (v1(2:end,2:end,3*ceil(end/4)+1:end)-v1(1:end-1,2:end,3*ceil(end/4)+1:end)...
                                                     +v2(2:end,2:end,3*ceil(end/4)+1:end)-v2(2:end,1:end-1,3*ceil(end/4)+1:end)...
                                                     +v3(2:end,2:end,3*ceil(end/4)+1:end)-v3(2:end,2:end,3*ceil(end/4):end-1));
                end;                                

 


In dieser Art und Weise, habe ich meine Berechnung, auf vier Worker aufgeteilt.
Es kommt zu folgender Fehlermeldung:

Code:

Error detected on worker 2.
A communication mismatch error was encountered:
The other lab became idle during labSendReceive.
 


Ich gehe davon aus, dass ich die Daten mit labSend und labReceive, zwischen den Workern hin und her schieben muss. Doch leider hab ich noch nicht verstanden, in welcher Form dies ablaufen muss.

Und wie an den Formeln erkennbar ist, gibt es auch Ueberscheidungen. D.h. ein Worker muss auf Daten zugreifen, welche ein anderer ebenfalls nutzt. Es entstehen also Randflaechen mit gemeinsamer Nutzung.

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich würde die Fehlermeldung an sich nur erwarten, wenn labSend und labReceive im Code verwendet werden.
Ist beta ein distributed array? Steht das ganze in einem spmd-Block?

Ein reproduzierbares Beispiel wäre hilfreich.

Davon abgesehen: wenn es ein distributed array ist, warum verteilst du händisch? Das ist ja eben der Reiz an distributed arrays, dass man das nicht tun muss.

Die Differenzenbildung sollte übrigens über diff möglich sein.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.17
Wohnort: ---
Version: Ab 2013b
     Beitrag Verfasst am: 21.06.2017, 14:18     Titel:
  Antworten mit Zitat      
Hallo,

mal wieder danke fuer deine Antwort.

1) beta ist in diesem spmd Block keine dist. Array. Diese wurde in einem vorherigen spmd Block so berechnet.

2) Ich aufgrund deiner Frage, ueber das haendische Aufteilen, nochmal drueber nachgedacht. Ich hatte in einer frueheren Version, (mit for Schleifen) eine hohe Rechenzeit. Die for Schleifen sind weg gefallen, trotzdem dachte ich, dass
ich das haendisch Aufteilen muss, da sonst jeder Worker alles rechnet. Aber wie gesagt, wenn ich heute drueber nachdenke, macht das kein Sinn. Danke schonmal fuer den Hinweis.

3) diff steht auf meiner ToDo Liste. Danke Wink

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorherigen Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
trotzdem dachte ich, dass ich das haendisch Aufteilen muss, da sonst jeder Worker alles rechnet.

Wenn du nicht mit distributed arrays arbeitest, ist das auch richtig.

Ich kann aus diesem Code aber nicht sehen, wie die Fehlermeldung zustande kommt. Dafür bräuchte ich halt doch etwas reproduzierbares.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.17
Wohnort: ---
Version: Ab 2013b
     Beitrag Verfasst am: 21.06.2017, 14:59     Titel:
  Antworten mit Zitat      
Hallo,

da ich diese haendische Aufteilung nicht benoetige, entfaellt auch die Fehlermeldung.
Somit ist das Thema erledigt. Vielen Dank.


[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorherigen Nachricht - 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 - 2024 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.