2011-09-10 8 views
2

このコードでparforを使用できないのはなぜですか?Parfor for MATLAB問題

parfor i=1:r 

    for j=1:N/r 

     xr(j + (N/r) * (i-1)) = x(i + r * (j-1)); 

    end 

end 

これはエラーです:

Error: The variable xr in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".

答えて

12

問題ここではスライス配列の不適切なインデックスのものです。 parforループは、の非同期でで実行されます。つまり、各反復が実行される順序はランダムです。 documentationから:

MATLAB workers evaluate iterations in no particular order, and independently of each other. Because each iteration is independent, there is no guarantee that the iterations are synchronized in any way, nor is there any need for this.

あなたは簡単にコマンドラインで次のように入力して、上記のステートメントを確認することができます。

parfor i=1:100 
    i 
end 

あなたは順序が任意であることがわかります。したがって、別のワーカー間で並列ジョブを分割すると、あるワーカーは、異なるイタレーションが完了したかどうかを知らせることができません。したがって、可変インデックスをにすることはできませんイテレータの過去/将来の値に依存します。

私はこれを簡単な例で説明します。フィボナッチシリーズ1,1,2,3,5,8,...を考えてみましょう。今度はparforループと同じことをやらせる

f=zeros(1,10); 
f(1:2)=1; 
for i=3:10 
    f(i)=f(i-1)+f(i-2); 
end 

:君は(ナイーブforループで)簡単にシリーズの最初の10項を生成することができます。

f=zeros(1,10); 
f(1:2)=1; 
parfor i=3:10 
    f(i)=f(i-1)+f(i-2); 
end 

??? Error: The variable f in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview"

しかし、なぜこれがエラーを与えるのでしょうか?

私は反復が任意の順序で実行されることを示しました。従業員がループインデックスi=7と式f(i)=f(i-1)+f(i-2);を取得したとします。式を実行し、結果をマスターノードに返すことになっています。今度は反復i=6が完了しましたか? f(6)に格納されている値は信頼できますか? f(5)はどうですか?私は何を得ているのか見ていますか? f(5)f(6)が実行されていないと仮定すると、Fibonnaciシリーズの第7項が0であると間違って計算されます。

MATLABは、あなたの計算が正しくを実行し、同じ結果を毎回再現するために保証できるのであれば伝える方法がありませんので、このようなあいまいな割り当てが明示的に禁止されています。

+0

それでも私にエラーが表示されます。エラー:parforの変数xrを分類できません。 MATLABのParallel for Loops、「概要」を参照してください。 エラーが==> Code1 at 36 parfor i = 1:r – user123668

+0

私はhttp://www.mathworks.com/help/toolbox/distcomp/brdqtjj-1.htmlを見ていましたが、理由を理解できませんでしたxrを分類できません – user123668

+0

@ user123668あなたのコードでエラーが発生したことに気づきました。あなたがしていることは 'parfor'では不可能です – abcd