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

Frage zur Parallel Toolbox und deren Worker

 

Stullenesser
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 13:30     Titel: Frage zur Parallel Toolbox und deren Worker
  Antworten mit Zitat      
Hallo Smile

Meine Frage :
Ist es möglich jeden Worker einzeln anzusprechen ?

Ich habe ein Programm geschrieben das mit sehr großen Bildern arbeitet(3gb+). Hierbei wird das Bild gerastert und jede so entstandenen Matrize wird einzeln auf verschiedene Parameter untersucht u. bewertet. Diese Ergebnisse werden in einer Structur abgespeichert mit Index für die jeweilige Position der Matrize im original Bild. Mit 2 normalen for schleifen läuft alles reibungslos. Irgendwie kommen die Worker bei Parallels aber durcheinander und greifen auf Informationen einer Matrize zu die zu einer anderen Matrize gehören. Kann ich irgendwie jedem Worker eine eigene Structur zuweisen mit der er arbeiten soll, sodass keine Überschneidungen mehr stattfinden ?

Ich hoffe mein Problem war zumindest einigermaßen verständlich :/
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.05.2014, 13:46     Titel:
  Antworten mit Zitat      
Hallo,

Code:
spmd
switch labindex
case 1
% Anweisungen speziell für Worker 1
case 2
% Anweisungen speziell für Worker 2
...
end


Wenn du den Code zur Verfügung stellen kannst, werfe ich gerne mal einen Blick drauf, ob es eine andere/bessere Lösung gibt.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 14:10     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort !
Ich bin jetzt soweit, dass er mein Programm Parallel abarbeitet, allerdings speichert er die Ergebnisse nicht mehr in der Structur.
Hier ist ein Auszug aus dem Programm.



Code:
% Main Programm


fDir = '*****';
dirContent = dir(fDir);
workDir = pwd;
struct_zaehler = 1;
bildgroesse = 3500;
global  bildDaten
bildDaten = struct([]);
bildname = ('parallel_1.jp2');
cd (fDir)                                                                   % arbeitspfad
bildinfos = imfinfo(bildname);                                              % Metadaten des bildes ohne Einlesen
hoehe = bildinfos.Height;                                                   % rausziehen der Hoehe aus Metadaten
breite = bildinfos.Width;                                                   % rausziehen der Breite aus Metadaten
logischMatrixName = strcat('logischeMatrix_parallel.jp2');  
if ~exist(logischMatrixName, 'file')
    matlabpool open
    fun = @(block_struct) imresize(block_struct.data, 0.1);                    
    logischeMatrix = newSegment(blockproc(bildname, [1024 1024], fun,'UseParallel', true));
    imwrite_neu(imresize(logischeMatrix,[hoehe breite]), logischMatrixName, 'jp2');
    clear logischeMatrix  
end

x_auf = ceil(bildinfos.Height /bildgroesse);
y_auf = ceil(bildinfos.Width /bildgroesse);
%% Rastern des Bildes und Einlesen der einzelnen Raster + Berechnung u. Gewichtung einzelner Statistischer Parameter
% in abhängigkeit von Hintergrundpixel im Raster
if matlabpool('size') == 0
    matlabpool open
end
%%
for j = 1:floor(breite/bildgroesse)+1
    parfor k = 1:floor(hoehe/bildgroesse)+1
        disp(k);
        if (k == floor(hoehe/bildgroesse)+1) && (j == floor(breite/bildgroesse)+1)
            disp('4');
            zuordnung = 4;
            arraywerte = imread(bildname, 'PixelRegion',{[bildinfos.Height-mod(bildinfos.Height, bildgroesse)+1 bildinfos.Height],[bildinfos.Width-mod(bildinfos.Width, bildgroesse)+1 bildinfos.Width]});
            binaryMatrix = imread(logischMatrixName,'PixelRegion',{[bildinfos.Height-mod(bildinfos.Height, bildgroesse)+1 bildinfos.Height],[bildinfos.Width-mod(bildinfos.Width, bildgroesse)+1 bildinfos.Width]});
            position = floor(breite/bildgroesse) *floor(hoehe/bildgroesse) +floor(hoehe/bildgroesse) +floor(breite/bildgroesse) +1;
            parallels_auslagerung_1(position, bildgroesse, binaryMatrix,bildinfos,zuordnung,j,k,arraywerte);
        % ... andere if abfragen
        end
    end
end
matlabpool close
 


Parallels_auslagerung_1 :

Code:
%Parallels_auslagerung_1 :
function  [ bildDaten ] = parallels_auslagerung_1( struct_zaehler,bildgroesse, binaryMatrix,bildinfos,zuordnung,j,k, arraywerte)
%PARALLELS_AUSLAGERUNG Summary of this function goes here
%   Detailed explanation goes here
hsi_bild = rgb2hsi(arraywerte);

switch zuordnung
    case 4
        bildDaten(struct_zaehler).hoehe_Startpunkt = bildinfos.Height-mod(bildinfos.Height, bildgroesse)+1;
        bildDaten(struct_zaehler).hoehe_Endpunkt = bildinfos.Height;
        bildDaten(struct_zaehler).breite_Startpunkt = bildinfos.Width-mod(bildinfos.Width, bildgroesse)+1;
        bildDaten(struct_zaehler).breite_Endpunkt = bildinfos.Width;
        bildDaten(struct_zaehler).anzahlPixel = ((bildDaten(struct_zaehler).hoehe_Endpunkt+1)-bildDaten(struct_zaehler).hoehe_Startpunkt)*((bildDaten(struct_zaehler).breite_Endpunkt+1)- bildDaten(struct_zaehler).breite_Startpunkt);
        bildDaten(struct_zaehler).anzahlHintergrundPixel = numel(find(binaryMatrix));
        bildDaten(struct_zaehler).anzahlVordergrundPixel = numel(find(~binaryMatrix));        
        colorspace = 1;
        bildDaten = statistischeBerechnungen_parallel(arraywerte, binaryMatrix, struct_zaehler,colorspace, bildDaten);
        colorspace = 2;
        bildDaten = statistischeBerechnungen_parallel(hsi_bild, binaryMatrix, struct_zaehler,colorspace, bildDaten);
%     ... andere cases in denen auch gebrauch von j u. k gemacht wird.
 


und zu guter letzt statistischeBerechnungen_parallel

Code:
% statistischeBerechnungen_parallel
function [ bildDaten ] = statistischeBerechnungen_parallel(werte_all, binaryMatrix, struct_zaehler, colorspace, bildDaten)
%STATISTISCHEBERECHNUNGEN Summary of this function goes here
%   Detailed explanation goes here
%%

for i=1:3
   
    werte(:,:) = werte_all(:,:,i);
    B = binaryMatrix;  
   
    if colorspace == 1
       
        werte = mat2gray(werte);
        p= imhist(werte(B));
        p= p./numel(werte(B));
       
        bildDaten(struct_zaehler).Mean_RGB(i) = mean2(werte(B));
        bildDaten(struct_zaehler).Std_RGB(i) = std2(werte(B));
        bildDaten(struct_zaehler).Smooth_RGB(i) = 1-1/(1+bildDaten(struct_zaehler).Std_RGB(i)^2);
        bildDaten(struct_zaehler).Uniform_RGB(i) = sum(p.^2);
        bildDaten(struct_zaehler).Entropy_RGB(i) = -sum(p.*(log2(p+eps)));
       
        diffImg = double(B);
        diffImg(B) = imsubtract(diffImg(B),werte(B));
        bildDaten(struct_zaehler).diffW_RGB(i) = sum(sum(diffImg(B)))*100/numel(diffImg(B));
       
       
        bildDaten(struct_zaehler).gewichtetMean_RGB(i) = bildDaten(struct_zaehler).Mean_RGB(i) * bildDaten(struct_zaehler).anzahlHintergrundPixel;
        bildDaten(struct_zaehler).gewichtetStd_RGB(i) = bildDaten(struct_zaehler).Std_RGB(i) *bildDaten(struct_zaehler).anzahlHintergrundPixel;
        bildDaten(struct_zaehler).gewichtetSmooth_RGB(i) = bildDaten(struct_zaehler).Smooth_RGB(i) *bildDaten(struct_zaehler).anzahlHintergrundPixel;
        bildDaten(struct_zaehler).gewichtetUniform_RGB(i) = bildDaten(struct_zaehler).Uniform_RGB(i) *bildDaten(struct_zaehler).anzahlHintergrundPixel;
        bildDaten(struct_zaehler).gewichtetEntropy_RGB(i) = bildDaten(struct_zaehler).Entropy_RGB(i) *bildDaten(struct_zaehler).anzahlHintergrundPixel;
        bildDaten(struct_zaehler).gewichtetDiffW_RGB(i) = bildDaten(struct_zaehler).diffW_RGB(i) *bildDaten(struct_zaehler).anzahlHintergrundPixel;
       
        % andere farbräume die untersucht werden.
       
    end
end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

angesichts der Länge des Codes bitte genau sagen, welche Variablen inwiefern nicht das gewünschte Verhalten haben.

Auf den ersten Blick fällt mir auf, dass du dir von parallels_auslagerung_1 kein Rückgabeargument zurückholst. Dann ist es doch nicht verwunderlich, dass die Ergebnisse nicht verfügbar sind - das wären sie auch bei einer normalen for-Schleife nicht.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 14:41     Titel:
  Antworten mit Zitat      
Stimmt, die Rückgabeargument habe ich bei beiden Funktionen vergessen wieder einzufügen.

in der Normalen variante passiert folgendes :

Code:

% es wird überprüft ob die Matrize am rand ist oder im Bild liegt, davon abhängig wird die funktion parallels_auslagerung_1 aufgerufen via

bildDaten = parallels_auslagerung_1(position, bildgroesse, binaryMatrix,bildinfos,zuordnung,j,k,arraywerte);

% parallels_auslagerung_1 bestimmt die Position der aktuell zu bearbeitenden Matrize und ruft die Funktion statistischeBerechnungen_parallel auf

bildDaten = statistischeBerechnungen_parallel(arraywerte, binaryMatrix, struct_zaehler,colorspace, bildDaten);

% statistischeBerechnungen_parallel berechnet für die jeweilige Matrize verschiedene Parameter und setzt sie gleich in ein Verhältnis

 


Das funktioniert alles einwandfrei.
Wenn ich den Code aber jetzt ändere indem ich die 2te for schleife in eine parfor schleife umwandle gibt es keine fehler mehr, er bearbeitet das komplette bild, aber speichert die Ergebnisse nicht in der Struktur.
Ich denke es hängt damit zusammen, dass jeder Worker eine Kopie der Variablen im Workspace und damit auch meiner Struktur, bekommt und es dadurch zu Problem kommt.
Deswegen war mein anfänglicher Gedanke, dass jeder Worker seine eigene Struktur bekommt also Worker_1 -> bildDaten_1, Worker_2 -> bildDaten_2 usw. mit der er die ihm zugeordneten Matrizen bearbeitet und die Ergebnisse speichert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
aber speichert die Ergebnisse nicht in der Struktur.

Und was ist dann der Inhalt der Variable

Wenn du den im letzten Beitrag geposteten Code in eine for-Schleife einbaust, dann wird doch in jeder Iteration das Ergebnis der vorherigen überschrieben? Ist das wirklich so gedacht?

Bitte den relevanten Code am Stück zur Verfügung stellen, sonst ist das ein Puzzle-Spiel.

Am besten wäre es, wenn du den funktionierenden sequentiellen Code und ein kleines Testbild zur Verfügung stellen könntest. Anhanddessen kann man dann sehen, was das Ergebnis sein soll und den parallelen Code entsprechend anpassen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2014, 15:49     Titel:
  Antworten mit Zitat      
Ich glaube es wäre zu kompliziert für mich meine wirren Gedanken ordentlich aus zu formulieren ^^;
Das in jeder Iteration das Ergebnis der vorherigen überschrieben wurde habe ich nicht mitbekommen war natürlich auch nicht gewollt.
Vielen Dank für den Hinweis.
Durch den Hinweis und ein wenig um die ecke denken habe ich jetzt auch eine Lösung gefunden. Jedes Ergebnis wird nun separat in einer Struktur gespeichert und nachdem der parallelisierte Teil des Programms abgearbeitet wurde wird daraus einfach wieder eine vollständige Struktur gemacht. Vllt nicht die eleganteste Lösung aber es Funktioniert Very Happy
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.