Verfasst am: 14.05.2014, 13:30
Titel: Frage zur Parallel Toolbox und deren Worker
Hallo
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 :/
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, [10241024], 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 :
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
case4
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
%%
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.
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.
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.
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
Einstellungen und Berechtigungen
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
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.