2016-12-15 3 views
3

In diesem minimalen ausführbaren Stück Code:MATLAB parfor Broadcast Variable hat einen falschen Wert

a = []; 
workers = parpool('local',4); 
someboolean = false; 
parfor i = 1:4 
    if someboolean % broadcast variable 
     b = a(i); % ERROR 
    else 
     b = 0; 
    end 
end 

... der Wert von someboolean ist 'true' und die ungültige Zeile ausgeführt wird in dem folgenden Fehler führt:

Die Zeilennummer bezieht sich auf die letzte nichtparallele Zeile und wenn die b = a(i) Zuweisung entfernt wird, verschwindet der Fehler.

Ich war nicht in der Lage, andere im Internet zu finden, die unter dem gleichen Problem leiden. Kann mir jemand erklären, was vor sich geht? Ich verwende MATLAB R2015a.

Antwort

7

Das Problem liegt daran, dass MATLAB eine statische Codeanalyse durchführt, um zu ermitteln, welche Variablen bei jeder Iteration durch die Schleife von jedem Worker benötigt werden. Da er erkennt, dass Sie innerhalb der Schleife auf a(i) zugreifen, versucht er, diesen Wert abzurufen und ihn dem lokalen Worker zur Verfügung zu stellen, falls benötigt wird. Dieses Verhalten für ist erforderlich, um die Datenmenge zu reduzieren, die an jeden Worker gesendet wird, indem nur die Daten gesendet werden, auf die von dieser Iteration zugegriffen wird. Dies ist besonders wichtig, wenn a Tausende von Werten hatte und Sie nur auf eine von ihnen bei jeder Iteration zugreifen. Sie möchten nur den einzelnen Eintrag in a lieber als das gesamte Array senden.

In Ihrem Fall, es versucht a(i) zuzugreifen, die den Arbeiter zu senden und es ist dieser Prozess (und nicht die Schleife Inhalte selbst), die den Fehler verursacht, die Sie sehen.

Haben Sie keine Angst, der Wert des gesendeten Variable, someboolean ist in der Tat false wie man es erwarten würde, und Sie können es mit der folgenden Schleife bestätigen.

parfor i = 1:4 
    disp(someboolean) 
end 

Als Lösung würde ich einfach vorbelegt a mit Werten, so dass das Aufschneiden von a gelingt und dass gültige Daten in der Lage, den Arbeiter geschickt werden (auch wenn es nicht verwendet wird).

a = NaN(1,4); 
0

Ich sehe zwei Probleme im Code:

  1. die alle Arbeiter Prozesse versuchen b Variable in der gleichen Zeit zu aktualisieren. Dies führt nicht zu einem Fehler, hat aber ein undefiniertes Verhalten. Sie werden nicht wissen, welcher Prozess das letzte Update erhalten hat.

  2. Ihr Array a ist nicht initialisiert, um mindestens 4 Werte zu haben, und die Worker versuchen, außerhalb der Grenzen des Arrays zuzugreifen. Dies verursacht den Fehler und Sie sollten mit der Initialisierung a beginnen.

Verwandte Themen