2013-06-05 4 views
5

ich diesen Test Matlab-Script-Datei erstellt haben:Vector Werte unterscheiden zugegriffen, wenn außen oder von innen parfor

numbers = [29 37 44 54 62]; 

for i=1:length(numbers) 
    fprintf('%d\n', numbers(i)); 
end 

fprintf('***\n'); 

matlabpool local 5; 
parfor i=1:length(numbers) 
    fprintf('%d\n', numbers(i)); 
end % image loop 
fprintf('***\n') 
for i=1:length(numbers) 
    fprintf('%d\n', numbers(i)); 
end 
matlabpool close; 

fprintf('***\n'); 

for i=1:length(numbers) 
    fprintf('%d\n', numbers(i)); 
end 

Wenn ich es laufen, bekomme ich konsequent die folgende Ausgabe:

29 
37 
44 
54 
62 
*** 
112 
111 
107 
117 
115 
*** 
29 
37 
44 
54 
62 
*** 
29 
37 
44 
54 
62 

Die fprintf innerhalb der parfor Block druckt die scheinbar zufällige Menge von Zahlen, die jedoch immer die gleichen ist (112, 111, 107, 117, 115). Irgendeine Idee, warum das passiert?

UPDATE

Interessanterweise geschieht dies nur, wenn ich das Skript von der Kommandozeile aus:

matlabR2012b -nodesktop -nosplash -nodisplay -r "run parfortest.m; exit" 

Wenn ich zum ersten Mal eine Sitzung Matlab öffnen und parfortest dort laufen, dann werden die Zahlen gedruckt korrekt.

+0

Interessant - das passiert mir nicht. In welcher Version bist du? – jazzbassrob

+0

Wozu dient der 'Matlab Pool'? Ich habe anscheinend keine Lizenz dafür, aber nachdem ich das entfernt habe, bekomme ich die gleichen Nummern (wenn auch in umgekehrter Reihenfolge). – KronoS

+0

'Matlabpool' öffnet einen Pool von Arbeitern, um parallelen Code auszuführen, ohne ihn ist' parfor' ein einfaches 'for'. – Oleg

Antwort

2

Dies ist speziell ein Problem mit dem Ausführen und nicht ein Knotenpunkt Problem. Um dies zu überprüfen, können Sie versuchen

>> run parfortest.m 

aus dem MATLAB-Desktop und Sie werden die gleiche Ausgabe finden.

Obwohl es keine Lösung als solche ist; Wenn Sie den Lauf weglassen und einfach

>> parfortest 

verwenden, wird die fehlerhafte Ausgabe korrigiert.

+0

Interessant ist. Das könnte erklären, wie der Pfad an "fprintf" übergeben wird oder wie "fprint" verwirrt wird. – horchler

+0

Zustimmen, Aufruf von cmd-Fenster 'run parfortest' erzeugt das Problem und ohne den' run' nicht. Daher ist dies nicht auf die Ausführung der Befehlszeile zurückzuführen. – Oleg

+1

Seltsamerweise kann ich das Problem nicht replizieren, wenn ich 'evalin ('caller', [script ';'])' 'aus dem Befehlsfenster wie in 'run' aufrufe - selbst wenn ich im selben Verzeichnis wie das bin M-Datei. Was passiert sonst noch? Sollte nicht "caller" aus dem Befehlsfenster dem von "run" entsprechen? Das Ändern des Arbeitsbereichs in "Basis" macht keinen Unterschied. – horchler

0

Ich denke, Sie können nicht wirklich parallel eine Datei schreiben. Oder in diesem Fall impliziert der Ausgabebildschirm fprintf ("Text") fprintf (1, "Text"), wobei 1 die Datei-ID für den Ausgabebildschirm ist.

Die Datei wird jetzt von mehreren Prozessen geändert, was ein Problem darstellt, da der verwendete Puffer nicht geleert wird, bevor andere Operationen gestartet werden und das Verhalten fehlerhaft ist.

Vielleicht this Link wird helfen.

1

Ich kann es auch auf OS X, R2012b replizieren. In mex ist mexPrintf nicht thread safe. Siehe this. Ich wäre nicht überrascht, wenn Matlab fprintf auf mexPrintf - oder ähnlichen Code - unter der Haube beruht. Wenn Sie Ihr Skript in eine Funktion umwandeln - setzen Sie einfach function parfortest in die erste Zeile - das Problem verschwindet, also kann es auch ein Problem mit dem Umfang sein.

BEARBEITEN: Versuchen Sie, mehr als fünf Zahlen zu drucken, sagen wir zwölf davon. Verwenden Sie jetzt char, um diese Werte in ASCII-Zeichen zu konvertieren. Es scheint, in der parfor Schleife fprintf Drucken der Pfad zu der Datei, die Sie über den Terminal-Befehl (irgendeine Form von parfortest.m in einer zufälligen Reihenfolge - Ich lief die Datei von ~/Desktop/parfortest.m und konvertiert die Nummer von fprintf zu Zeichen ich habe D/~ksepotap/frroetst.m). Wenn Sie versuchen, mehr Werte als die Länge des Pfades zu drucken, erhalten Sie einen Fehler. Ich kann keine andere Problemumgehung finden, als dein Skript in eine Funktion umzuwandeln (was sowieso eine gute Idee ist). Definitiv scheint wie ein Fehler.