5

このテスト Matlab スクリプト ファイルを作成しました。

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

実行すると、一貫して次の出力が得られます。

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

fprintfブロック内には一見ランダムな数字のparforセットが表示されますが、常に同じ (112、111、107、117、115) です。なぜこれが起こっているのかについて何か考えはありますか?

アップデート

興味深いことに、これはコマンド ラインからスクリプトを実行した場合にのみ発生します。

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

最初に Matlab セッションを開いてparfortestそこで実行すると、数値が正しく出力されます。

4

3 に答える 3

2

これは特に実行の問題であり、nodesktop の問題ではありません。これを確認するには、試すことができます

>> run parfortest.m

MATLAB デスクトップから実行すると、同じ出力が得られます。

それ自体は解決策ではありませんが。run を省略して、単に使用する場合

>> parfortest

悪い出力は修正されます。

于 2013-06-05T17:16:44.173 に答える
1

OS X、R2012b でも複製できます。ではmexスレッドセーフmexPrintfではありません。これを参照してください。Matlab が内部で(または同様のコードに) 依存していても、私は驚かないでしょう。スクリプトを関数に変換すると (最初の行に置くだけです)、問題が解消されるため、スコープの問題でもある可能性があります。fprintfmexPrintffunction parfortest

EDIT : 5 つ以上の数字を出力してみてください。たとえば、12 個です。charこれらの値を ASCII 文字に変換するために使用します。parforループ内でfprintf、ターミナルコマンドを介して実行したファイルへのパスを出力しているようです(parfortest.mランダムな順序での何らかの形式-ファイルを実行し、数値を取得した文字に~/Desktop/parfortest.m変換します)。パスの長さよりも多くの値を出力しようとすると、エラーが発生します。スクリプトを関数に変換する以外に回避策が見つかりません (これは良い考えです)。間違いなくバグのようです。fprintfD/~ksepotap/frroetst.m

于 2013-06-05T16:43:59.367 に答える